我想遍历整个文件的每一行。一种方法是读取整个文件,将其保存到列表中,然后转到感兴趣的行。这种方法使用了大量的内存,所以我正在寻找一个替代方案。
我的代码到目前为止:
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距离。
1.使用 with
with是读大文件的好方法。优点 - 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()调用是按顺序读取行的,但是在读取之后不会将它们保存在内存中,甚至不会将它们保存在内存中,因为file在Python中是可迭代的。
没有人给出正确的,完全Pythonic的方式来阅读文件。这是以下内容:
with open(...) as f:
for line in f:
<do something with line>
该with语句处理打开和关闭文件,包括如果在内部块中引发异常。该for line in f会将文件对象f视为可迭代,它会自动使用缓冲IO和内存管理,所以你不必担心大文件。
应该有一个 - 最好只有一个 - 明显的方法来做到这一点。