如何在python中逐行读取大文件
我想遍历整个文件的每一行。 一种方法是读取整个文件,将其保存到列表中,然后转到感兴趣的行。 这种方法使用了大量的内存,所以我正在寻找替代方案。
我的代码到目前为止:
for each_line in fileinput.input(input_file):
do_something(each_line)
for each_line_again in fileinput.input(input_file):
do_something(each_line_again)
执行此代码会给出错误消息: device active
。
有什么建议么?
编辑:目的是计算成对的字符串相似性,这意味着文件中的每一行,我想要计算每隔一行的Levenshtein距离。
没有人给出正确的,完全Pythonic的方式来读取文件。 它是以下内容:
with open(...) as f:
for line in f:
<do something with line>
with
语句处理打开和关闭文件,包括在内部块中是否引发异常。 for line in f
的for line in f
将文件对象f
视为一个迭代对象,它会自动使用缓冲IO和内存管理,因此您不必担心大文件。
应该有一个 - 而且最好只有一个 - 明显的方法来做到这一点。
按照排名顺序的两种高效存储方式(首选最佳) -
with
- 来自python 2.5及以上版本 yield
,可以使用yield
with
with
阅读大文件是一种很好且高效的pythonic方式。 优点- 1)文件对象从离开后自动关闭with
执行块。 2) with
块内的异常处理。 3)存储for
通过所述循环迭代f
由线文件对象线。 内部它可以缓冲IO(以优化昂贵的IO操作)和内存管理。
with open("x.txt") as f:
for line in f:
do something with data
2.使用yield
有时候可能需要对每次迭代中需要读取的内容进行更细粒度的控制。 在这种情况下使用它和产量。 请注意,在这种方法中,显式需要在最后关闭文件。
def readInChunks(fileObj, chunkSize=2048):
"""
Lazy function to read a file piece by piece.
Default chunk size: 2kB.
"""
while True:
data = fileObj.read(chunkSize)
if not data:
break
yield data
f = open('bigFile')
for chuck in readInChunks(f):
do_something(chunk)
f.close()
陷阱和为了完整起见 - 下面的方法对于阅读大文件来说并不是很好或不够优雅,但请阅读以获得圆润的理解。
在Python中,从文件中读取行的最常用方法是执行以下操作:
for line in open('myfile','r').readlines():
do_something(line)
但是,当完成这些时, readlines()
函数(同样适用于read()
函数)将整个文件加载到内存中,然后遍历它。 对于大文件,稍好的方法(前面提到的两种方法最好)是使用fileinput
模块,如下所示:
import fileinput
for line in fileinput.input(['myfile']):
do_something(line)
fileinput.input()
调用顺序地读取行,但是在读取之后不会将它们保存在内存中,或者甚至只是这样,因为python中的file
是可迭代的。
参考
剥离换行符:
with open(file_path, 'rU') as f:
for line_terminated in f:
line = line_terminated.rstrip('n')
...
对于通用换行符支持,无论文件中的终结符'r'
, 'n'
还是'rn'
,所有文本文件行似乎都以'n'
结尾。
编辑 -指定通用换行支持:
open(file_path, mode='rU')
- 必需[谢谢@Dave] open(file_path, mode='rU')
- 可选 open(file_path, newline=None)
- 可选 newline
参数仅在Python 3中受支持,并且默认为None
。 在所有情况下, mode
参数默认为'r'
。 U
在Python 3中被弃用。在Windows上的Python 2中,某些其他机制似乎将rn
为n
。
文档:
为了保留本地行结束符:
with open(file_path, 'rb') as f:
with line_native_terminated in f:
...
二进制模式仍然可以将文件解析为包含in
行。 每行都会有文件中的任何终止符。
感谢@ katrielalex的回答,Python的open()doc和iPython实验。
链接地址: http://www.djcxy.com/p/5391.html