五、Python文件读取相关方法
我们知道,对文件的读取操作需要将文件中的数据加载到内存中,而上面所用到的read()方法会一次性把文件中所有的内容全部加载到内存中。这明显是不合理的,当遇到一个几个G的的文件时,必然会耗光机器的内存。这里我们来介绍下Python中读取文件的相关方法:
方法描述
read()
一次读取文件所有内容,返回一个str
read(size)
每次最多读取指定长度的内容,返回一个str;在Python2中size指定的是字节长度,在Python3中size指定的是字符长度
readlines()
一次读取文件所有内容,按行返回一个list
readline()
每次只读取一行内容
此外,还要两个与文件指针位置相关的方法
方法描述
seek(n)
将文件指针移动到指定字节的位置
tell()
获取当前文件指针所在字节位置
下面来看下操作实例
1. 读取指定长度的内容
Python2
with open(‘song.txt’, ‘r’) as f:
print(f.read(12).decode(‘utf-8’))
输出结果:
匆匆那年
结果说明:Python2中read(size)方法的size参数指定的要读取的字节数,而song.txt文件是UTF-8编码的内容,一个汉字占3个字节,因此12个字节刚好是4个汉字。
Python3
with open(‘song.txt’, ‘r’, encoding=’utf-8′) as f:
print(f.read(12))
输出结果:
匆匆那年我们 究竟说
结果说明:Python3中read(size)方法的size参数指定的要读取的字符数,这与文件的字符编码无关,就是返回12个字符。
2. 读取文件中的一行内容
Python2
with open(‘song.txt’, ‘r’, encoding=’utf-8′) as f:
print(f.readline())
Python3
with open(‘song.txt’, ‘r’) as f:
print(f.readline().decode(‘utf-8’))
输出结果都一样:
匆匆那年我们 究竟说了几遍 再见之后再拖延
3. 遍历打印一个文件中的每一行
这里我们只以Python3来进行实例操作,Python2仅仅是需要在读取到内容后进行手动解码而已,上面已经有示例。
方式一:先一次性读取所有行到内存,然后再遍历打印
with open(‘song.txt’, ‘r’, encoding=’utf-8′) as f:
for line in f.readlines():
print(line)
输出结果:
匆匆那年我们 究竟说了几遍 再见之后再拖延
可惜谁有没有 爱过不是一场 七情上面的雄辩
匆匆那年我们 一时匆忙撂下 难以承受的诺言
只有等别人兑现
这种方式的缺点与read()方法是一样的,都是会消耗大量的内存空间。
方式二:通过迭代器一行一行的读取并打印
with open(‘song.txt’, ‘r’, encoding=’utf-8′, newline=”) as f:
for line in f:
print(line)
输出结果:
匆匆那年我们 究竟说了几遍 再见之后再拖延
可惜谁有没有 爱过不是一场 七情上面的雄辩
匆匆那年我们 一时匆忙撂下 难以承受的诺言
只有等别人兑现
另外,发现上面的输出结果中行与行之间多了一个空行。这是因为文件每一行的默认都有换行符,而print()方法也会输出换行,因此就多了一个空行。去掉空行也比较简单:可以用line.rstrip()去除字符串右边的换行符,也可以通过print(line, end=”)避免print方法造成的换行。
file类的其他方法:
方法描述
flush()
刷新缓冲区数据,将缓冲区中的数据立刻写入文件
next()
返回文件下一行,这个方法也是file对象实例可以被当做迭代器使用的原因
truncate([size])
截取文件中指定字节数的内容,并覆盖保存到文件中,如果不指定size参数则文件将被清空; Python2无返回值,Python3返回新文件的内容字节数
write(str)
将字符串写入文件,没有返回值
writelines(sequence)
向文件写入一个字符串或一个字符串列表,如果字符串列表中的元素需要换行要自己加入换行符
fileno()
返回一个整型的文件描述符,可以用于一些底层IO操作上(如,os模块的read方法)
isatty()
判断文件是否被连接到一个虚拟终端,是则返回True,否则返回False
六、文件读写与字符编码
前面已经写过一篇介绍Python中字符编码的相关文件<> 里面花了很大的篇幅介绍Python中字符串与字符编码的关系以及转换过程。其中谈到过两个指定的字符编码的地方,及其作用:
文章知识点与官方知识档案匹配,可进一步学习相关知识Python入门技能树基本技能数据文件读写209413 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!