一、打开的文件在使用完后要关闭

>>>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读取rtf文件_【Python】【IO】文件读写-编程之家Python 文件I/O | 菜鸟教程​www.runoob.compython读取rtf文件_【Python】【IO】文件读写-编程之家