一、打开的文件在使用完后要关闭
>>>f=file('fibs.py')
#用''表示文件名
#无''表示变量名
>>>f.read()
#打印fibs.py中的内容
#f.read()后可以列出文件内容
#但经过一次f.read()后再次f.read()不可以列出文件内容
#因为指针在文件末尾
#需要f.close()关闭文件后再重新f.read()才可以列出内容
>>> f.closed#判断文件有无关闭
False#未关闭
>>> f.close()#关闭文件
>>> f.closed#判断文件有无关闭
True#已关闭
二、readline()和readlines()的区别
以11111.txt文件为例
1.用file()方法读取文件
>>> f=file('11111.txt')
>>> f.read()
'11111111n22222222n33333333n44444444n55555555n66666666rn'
>>> f.close()
2.用readline()逐次读取各行内容
>>> f=file('11111.txt')
>>> f.readline()
'11111111n'
>>> f.readline()
'22222222n'
>>> f.readline()
'33333333n'
>>> f.readline()
'44444444n'
>>> f.readline()
'55555555n'
>>> f.readline()
'66666666rn'
3.readlines()把每行内容作为列表读取
>>> f=file('11111.txt')
>>> f.readlines()
['11111111n', '22222222n', '33333333n', '44444444n', '55555555n', '66666666rn']
三、以'w'写入方式打开注意事项
1.已有文件时,对原文件进行写入操作会清空原文件
当我们想对文件进行写入时,可能会进行如下操作
>>> f=file('11111.txt')
>>> f.write('hello')
Traceback (most recent call last):
File "", line 1, in
IOError: File not open for writing
报错了,文件未已写入方式打开
>>> f.close()
关闭文件
正确的写入文件方法是什么呢?
在此之前先看一下我们要操作的文件11111.txt内容
>>> f=file('11111.txt')
>>> f.read()
'11111111n22222222n33333333n44444444n55555555n66666666rn'
然后我们以写入的方式将文本打开
>>> f=file('11111.txt','w')#以写入方式打开11111.txt文件
>>> f.close()#关闭文件
#一般情况下,文件关闭后会自动刷新缓冲区,但有时你需要在关闭前刷新它,这时就可以使用 flush() 方法。
>>> f=file('11111.txt')#以普通方式打开文件
>>> f.read()#显示文件内容
''
#文件被清空了
当我们对含有原本11111.txt相同内容的22222.txt文件写入内容时
>>> f=file('22222.txt')
>>> f.read()
'11111111n22222222n33333333n44444444n55555555n66666666rn'
>>> f.close()
#一般情况下,文件关闭后会自动刷新缓冲区,但有时你需要在关闭前刷新它,这时就可以使用 flush() 方法。
>>> f=file('22222.txt','w')
>>> f.write('hello')
>>> f.close()
#一般情况下,文件关闭后会自动刷新缓冲区,但有时你需要在关闭前刷新它,这时就可以使用 flush() 方法。
>>> f=file('22222.txt')
>>> f.read()
'hello'
#清空原文件内容并写入新内容
2.无此文件时,创建新文件进行写入操作
$ ls
$RECYCLE.BINdesktop.ini
11111.txt培训.docx
22222.txt删除.rtf
Microsoft Edge.lnk未命名.rtf
Thumbs.db查看地址.txt – 快捷方式.lnk
Windows 10微博去除格式.rtfd
首先目录下无33333.txt文件,我们想创建一个内容是'hello',可以进行以下操作
>>> f=file('33333.txt','w')#以写入方式创建
>>> f.write('hello')#写入内容'hello'
>>> f.close()#关闭文件
#一般情况下,文件关闭后会自动刷新缓冲区,但有时你需要在关闭前刷新它,这时就可以使用 flush() 方法。
>>> f=file('33333.txt')#打开文件
>>> f.read()#读取文件
'hello'
>>> f.close()#关闭文件
目录下多了一个33333.txt的文件
$ ls
$RECYCLE.BINdesktop.ini
11111.txt培训.docx
22222.txt删除.rtf
33333.txt未命名.rtf
Microsoft Edge.lnk查看地址.txt – 快捷方式.lnk
Thumbs.db微博去除格式.rtfd
Windows 10
总结:
f=file('666.txt','w')若666.txt文件存在==>清空原文件后以写入方式打开后可直接调用write()函数写入新内容
若666.txt文件不存在==>创建此文件且以写入方式打开后可直接调用write()函数写入内容
四、使用flush() 方法立刻刷新缓冲区,缓冲区中的数据立刻写入文件,同时清空缓冲区
优点:省去关闭文件的步骤提升程序运行效率
我们以33333.txt文件为例,对内容进行修改
>>> f=file('33333.txt')
>>> f.read()
'hello'
>>> f.close()
内容是'hello'
调用write()函数对文件进行覆盖写入'China'
>>> f=file('33333.txt','w')
>>> f.write('China')#此时‘China’并未真正写入文件中
>>> f.close()#关闭文件会自动刷新缓冲区,数据写入文件
也可以直接调用flush() 方法立刻刷新缓冲区
>>> f=file('33333.txt','w')
>>> f.write('China')#此时‘China’并未真正写入文件中
>>> f.flush()#此时才讲'China'从缓存中写入文件中
五、以'a'追加写入方式打开注意事项
1.不会清空已有文件内容
>>> f=file('33333.txt')
>>> f.read()#显示原文件内容
'China'
>>> f.close()
>>> f=file('33333.txt','a')#以追加方式打开文件
>>> f.write('hello')#写入'hello'
>>> f.close()
>>> f=file('33333.txt')
>>> f.read()#显示文件内容
'Chinahello'
#发现文件原内容并未删除,且新内容也成功写入
>>> f.close()
2.追加方式也可在无文件的情况下创建新文件
$ ls
$RECYCLE.BINdesktop.ini
11111.txt培训.docx
22222.txt删除.rtf
33333.txt未命名.rtf
Microsoft Edge.lnk查看地址.txt – 快捷方式.lnk
Thumbs.db微博去除格式.rtfd
Windows 10
以追加方式创建文件
>>> f=file('qqqqq.txt','a')
>>> f.write('qqqqq')
>>> f.close()
>>> f=file('qqqqq.txt')
>>> f.read()
'qqqqq'
>>> f.close()
文件创建成功
$ ls
$RECYCLE.BINdesktop.ini
11111.txtqqqqq.txt
22222.txt培训.docx
33333.txt删除.rtf
Microsoft Edge.lnk未命名.rtf
Thumbs.db查看地址.txt – 快捷方式.lnk
Windows 10微博去除格式.rtfd
六、以'r+'追加写入方式打开注意事项以往我们以'w'、'a'方式打开文件只能写入,无法读取
以'r'方式打开文件只能读取,无法写入
但‘r+’方式打开文件,既能读取也可写入,且原文件不会被清空
优点很多同时也有些问题
>>> f=file('sssss.txt')
>>> f.read()
'1n2n3n4n5n6'
>>> f.close()
>>> f=file('sssss.txt','r+')
>>> f.write('qqqqq')
>>> f.flush()#立即刷新缓存,将数据从缓存写入文件
现文件为
>>> f.close()
>>> f=file('sssss.txt')
>>> f.read()
'qqqqqn4n5n6'
因为指针在开头,所以把原文件开始的5个字符给覆盖了
解决办法
seek() 方法
seek() 方法用于移动文件读取指针到指定位置。
seek() 方法语法如下:
fileObject.seek(offset[, whence])
参数offset — 开始的偏移量,也就是代表需要移动偏移的字节数
whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。
f.seek(2,1)#2为往后偏移量,1为当前位置
#表示从当前位置往后偏移2个字节
f.seek(0)等同于f.seek(0,0)
#表示从文件开头往后偏移0个字节,也就是把指针移到文件顶端
f.seek(0,2)
#表示从文件末尾往后偏移0个字节,也就是将指针移到文件末尾
七、各种打开方式详细细节
八、推荐使用 with open as f语句打开文件
由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try … finally来实现:
try:
f = open('/path/to/file', 'r')
print f.read()
finally:
if f:
f.close()
但是每次都这么写实在太繁琐,所以,Python引入了with语句来自动帮我们调用close()方法:
with open('/path/to/file', 'r') as f:
print f.read()
这和前面的try … finally是一样的,但是代码更佳简洁,并且不必调用f.close()方法。
调用read()会一次性读取文件的全部内容,如果文件有10G,内存就爆了,所以,要保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。另外,调用readline()可以每次读取一行内容,调用readlines()一次读取所有内容并按行返回list。因此,要根据需要决定怎么调用。
如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便:
for line in f.readlines():
print(line.strip()) # 把末尾的'n'删掉
九、二进制文件
前面讲的默认都是读取文本文件,并且是ASCII编码的文本文件。要读取二进制文件,比如图片、视频等等,用'rb'模式打开文件即可:
>>> f = open('/Users/michael/test.jpg', 'rb')
>>> f.read()
'xffxd8xffxe1x00x18Exifx00x00…' # 十六进制表示的字节
十、字符编码
要读取非ASCII编码的文本文件,就必须以二进制模式打开,再解码。比如GBK编码的文件:
>>> f = open('/Users/michael/gbk.txt', 'rb')
>>> u = f.read().decode('gbk')
>>> u
u'u6d4bu8bd5'
>>> print u
测试
如果每次都这么手动转换编码嫌麻烦(写程序怕麻烦是好事,不怕麻烦就会写出又长又难懂又没法维护的代码),Python还提供了一个codecs模块帮我们在读文件时自动转换编码,直接读出unicode:
import codecs
with codecs.open('/Users/michael/gbk.txt', 'r', 'gbk') as f:
f.read() # u'u6d4bu8bd5'
更多内容可以参考文件读写www.liaoxuefeng.comPython 文件I/O | 菜鸟教程www.runoob.com