今天读取文件时,出现了一个问题,发现是把readlines()打成了readline()。查了一下,这才知道这二者的区别,同时读取文件还有一个read()函数。
read()
- 读取整个文件,将文件内容放到一个字符串变量中,如果需要对文件按行进行处理,则不可用该方法
- 如果文件大于可用内存(好几个G的),不可能使用这种处理,系统会报错
readline()
- 每次读取一行,比readlines()慢得多
- 返回的是一个字符串对象,保存当前行的内容
- 因为readline是按行读取,按行打印,而print函数默认输出完,需要跨行!所以每打印一行中间都有空一行
readlines()
- 一次读取整个文件
- 自动将文件内容分析成一个行的列表
读取更大文件的方法
参考:python 的read 、readline和 readlines以及如何读取大文件
1)分批读取
处理大文件是很容易想到的就是将大文件分割成若干小文件处理,处理完每个小文件后释放该部分内存。这里用了iter & yield:
def read_in_chunks(filePath, chunk_size=1024*1024):
""" Lazy function (generator) to read a file piece by piece.
Default chunk size: 1M You can set your own chunk size """
file_object = open(filePath)
while True:
chunk_data = file_object.read(chunk_size)
if not chunk_data:
break
yield chunk_data
if __name__ == "__main__":
filePath = './path/filename'
for chunk in read_in_chunks(filePath):
process(chunk) # <do something with chunk>
使用with open() as f
对可迭代对象 f,进行迭代遍历:for line in f,会自动地使用缓冲IO(buffered IO)以及内存管理,而不必担心任何大文件的问题。