基础读文件
传统读取文件的方法是先使用Python内置的open函数打开文件,然后标示符’r’表示读,这样,我们就成功地打开了一个文件,获得到一个f文件句柄
f = open('test.txt','r')
如果文件打开成功,接下来,调用read()方法可以一次读取文件的全部内容
f.read() # 'hello world'
Python把内容读到内存,用一个str字符串表示
type(f.read()) # str
最后一步是是任何语言都一样的操作,调用close()方法关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的。
f.close()
如果文件在读取的过程中抛出异常,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try … finally来实现:
try:
f =open('test1.txt','r')
print(f.read())
finally:
print('打开失败')
f.close()
with open() as 读文件
每次都这么写实在太繁琐,所以,Python引入了with语句来自动帮我们调用close()方法,同时也解决了异常问题:
with open('test.txt','r') as f :
print(f.read()) # hello world
这和前面的try … finally是一样的,但是代码更佳简洁,无论有无异常均可自动调用f.close()方法。
- 调用read()会一次性读取文件的全部内容,如果文件很大,内存就爆了,所以可以反复调用read(size)方法,每次最多读取size个字节的内容。
- 调用readline()可以每次读取一行内容。
- 调用readlines()一次读取所有内容并按行返回list。
如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便:
for line in f.readlines():
print(line.strip()) # 把末尾的'\n'删掉
基础写文件/with open()as
基本同上
文件读取模式
codecs.open
有时候我们爬虫或者其他方式得到一些数据写入文件时会有编码不统一的问题,所以就一般都统一转换为unicode。此时写入open方式打开的文件就有问题了。例如
line2 = u'我爱祖国'
fr.write(line2)
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
fr.write(line2)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-11: ordinal not in range(128)
怎么办,我们可以将上面的line2编码成str类型,但是太麻烦。我们要把得到的东西先decode为unicode再encode为str
代替这繁琐的操作就是codecs.open,例如
import codecs
fw = codecs.open('test1.txt','a','utf-8')
fw.write(line2)
不会报错,说明写入成功。这种方法可以指定一个编码打开文件,使用这个方法打开的文件读取返回的将是unicode。写入时,如果参数 是unicode,则使用open()时指定的编码进行编码后写入;如果是str,则先根据源代码文件声明的字符编码,解码成unicode后再进行前述 操作。相对内置的open()来说,这个方法比较不容易在编码上出现问题。