读取其他文件
二进制文件
前面讲的默认都是读取文本文件,并且是UTF-8编码的文本文件。要读取二进制文件,比如图片、视频等等,用’rb’模式打开文件即可:
>>> f = open('/Users/michael/test.jpg', 'rb')
>>> f.read()
b'\xff\xd8\xff\xe1\x00\x18Exif\x00\x00...' # 十六进制表示的字节
字符编码
要读取非UTF-8编码的文本文件,需要给open()函数传入encoding参数,例如,读取GBK编码的文件:
>>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk')
>>> f.read()
异常编码字符处理
遇到有些编码不规范的文件,你可能会遇到UnicodeDecodeError,因为在文本文件中可能夹杂了一些非法编码的字符。遇到这种情况,open()函数还接收一个errors参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略:
>>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')
read()、readline() 和 readlines()对比
Python的文本文件的内容读取中,有三类方法:read()、readline()、readlines(),这三种方法各有利弊,下面逐一介绍其使用方法和利弊。
假设 sxl.txt文件内容如下:
i like the movie
i ate an egg
###read()方法
read()方法表示一次读取文件全部内容,该方法返回字符串。
f = open("sxl.txt")
lines = f.read()
print lines
print(type(lines))
f.close()
输出结果:
i like the movie
i ate an egg
<class 'str'>
read()是最简单的一种方法,一次性读取文件的所有内容放在一个大字符串中,即存在内存中。
read()的利端:
方便、简单
一次性独读出文件放在一个大字符串中,速度最快
read()的弊端:
文件过大的时候,占用内存会过大
readline()方法
该方法每次读出一行内容,所以,读取时占用内存小,比较适合大文件,该方法返回一个字符串对象。
f = open("sxl.txt")
line = f.readline()
while line:
print (line)
print(type(line))
line = f.readline()
f.close()
输出结果:
i like the movie
<class 'str'>
i ate an egg
<class 'str'>
readline()逐行读取文本,结果是一个list。
readline()的利端:
占用内存小,逐行读取
readline()的弊端:
由于是逐行读取,速度比较慢 |