【转】Python文件读写


转至:http://pmghong.blog.51cto.com/3221425/1349978

一、文件打开/读取/关闭

>>> f = open(r"E:\python\fileIO\test.txt")
>>> f
<_io.TextIOWrapper name='E:\\python\\fileIO\\test.txt' mode='r' encoding='cp936'>
>>> f.read()
'Hi everyone!\nWhat a good day it is!'

>>> f.close()

二、文件写入

步骤:以写入的形式打开--》写入--》(保存)关闭

不能直接写入数据,因为默认打开的文件时‘r’的只读形式

>>> f = open(r"E:\python\fileIO\test.txt")

>>> f.write('nice to meet you!')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
io.UnsupportedOperation: not writable


指定可写模式:

 

>>> f = open(r"E:\python\fileIO\test.txt","w")
>>> f.write('nice to meet you!')

 

 

此时数据只是写到缓存中,并未保存到文件,下面输入就可以看出了,原先的文件内容已经被清空了

$ cat E:/python/fileIO/test.txt
$

关闭这个文件即可将缓存中的数据写入到文件中

$ cat E:/python/fileIO/test.txt

nice to meet you!

注意:这一步需要相当慎重,因为如果编辑的文件存在的话,这一步操作会先清空这个文件再重新写入。那么如果不要清空文件再写入该如何做呢?

使用r+ 模式不会先清空,但是会替换掉原先的文件

>>> f.close()
>>> f = open(r"E:\python\fileIO\test.txt","r+")
>>> f.write("being")
>>> f.close()

$ cat E:/python/fileIO/test.txt
beingto meet you!

可以看到,如果在写之前先读取一下文件,再进行写入,则写入的数据会添加到文件末尾而不会替换掉原先的文件。这是因为指针引起的,r+ 模式的指针默认是在文件的开头,如果直接写入,则会覆盖源文件,通过read() 读取文件后,指针会移到文件的末尾,再写入数据就不会有问题了。这里也可以使用a 模式

>>> f = open(r"E:\python\fileIO\test.txt","r+")
>>> f.read()
'\nbygto meet you!'
>>> f.write('nice to meet you!')
>>> f.close()

$ cat E:/python/fileIO/test.txt

bygto meet you!nice to meet you!

其他模式的介绍。见表

模式

描述

r

以读方式打开文件,可读取文件信息。

w

以写方式打开文件,可向文件写入信息。如文件存在,则清空该文件,再写入新内容

a

以追加模式打开文件(即一打开文件,文件指针自动移到文件末尾),如果文件不存在则创建

r+

以读写方式打开文件,可对文件进行读和写操作。

w+

消除文件内容,然后以读写方式打开文件。

a+

以读写方式打开文件,并把文件指针移到文件尾。

b

以二进制模式打开文件,而不是以文本模式。该模式只对Windows或Dos有效,类Unix的文件是用二进制模式进行操作的。

 

 文件对象的方法:

1、f.readline()逐行读取数据

方法一

>>> f = open(r"E:\python\fileIO\test.txt")
>>> f.readline()
'nice to meet you!nice to meet you!\n'
>>> f.readline()
'nice to meet you!\n'
>>> f.readline()
'nice to meet you!\n'
>>> f.readline()
'nice to meet you!1\n'
>>> f.readline()
'nice to meet you!2'
>>> f.readline()
''

方法二

>>> for i in open(r'e:\python\fileIO\test.txt'):
... print(i)
...
nice to meet you!nice to meet you!

nice to meet you!

nice to meet you!

nice to meet you!1

nice to meet you!2

2、f.readlines()     将文件内容以列表的形式存放

>>> f = open("e:/python/fileIO/test.txt")
>>> f.readlines()
['nice to meet you!nice to meet you!\n', 'nice to meet you!\n', 'nice to meet yo
u!\n', 'nice to meet you!1\n', 'nice to meet you!2']
>>> f.close()

f.next()   逐行读取数据,和f.readline() 相似,唯一不同的是,f.readline() 读取到最后如果没有数据会返回空,而f.next() 没读取到数据则会报错(python 3.X中enerator【有yield关键字的函数则会被识别为generator函数【中的next变为__next__了)

>>> f = open('e:/python/fileIO/test.txt')
>>> f.next()
'nice to meet you!nice to meet you!\n'
>>> f.next()
'nice to meet you!\n'
>>> f.next()
'nice to meet you!\n'
>>> f.next()
'nice to meet you!1\n'
>>> f.next()
'nice to meet you!2'
>>> f.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration

f.writelines()   多行写入

>>> l = ['\nhello one!','\nhello two','\nhello three']
>>> f = open("e:/python/fileIO/test.txt",'a')
>>> f.writelines(l)
>>> f.close()

$ cat E:/python/fileIO/test.txt

hello one!
hello two
hello three

f.seek(偏移量,选项)

f.seek(偏移量,选项)
选项=0,表示将文件指针指向从文件头部到“偏移量”字节处
选项=1,表示将文件指针指向从文件的当前位置,向后移动“偏移量”字节
选项=2,表示将文件指针指向从文件的尾部,向前移动“偏移量”字节
 偏移量:正数表示向右偏移,负数表示向左偏移

>>> f = open('e:/python/fileIO/test.txt','r+')
>>> f.seek(0,2)
36
>>> f.readline()
''
>>> f.seek(0,0)
0
>>> f.readline()
'\n'
>>> f.readline()
'hello one!\n'
>>> f.readline()
'hello two\n'
>>> f.readline()
'hello three'
>>> f.readline()
''

f.flush()    将修改写入到文件中(无需关闭文件)

>>> f.write('\nhello python!')
14
>>> f.flush()

f.tell()   获取指针位置

>>> f.seek(0,0)
0
>>> f.readline()
'\n'
>>> f.tell()
2
>>> f.readline()
'hello one!\n'
>>> f.tell()
14

内容查找和替换

一、内容查找

实例:统计文件中hello个数

思路:打开文件,遍历文件内容,通过正则表达式匹配关键字,统计匹配个数。

方法一

import re
f = open('e:/python/fileIO/test.txt')
source = f.read()
f.close()
r = r'hello'
s = len(re.findall(r,source))
for i in re.findall(r,source):
  print (i)
print(s)

方法二、

fp = open('e:/python/fileIO/test.txt','r')
count = 0
for s in fp.readlines():
  li = re.findall('hello',s)
  if len(li)>0:
    count = count +len(li)
print("search",count,"hello")
fp.close()

二、替换

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM