我希望遍历整个文件的每一行。一种方法是读取整个文件,将其保存到一个列表中,然后遍历感兴趣的行。这种方法使用大量内存,所以我正在寻找一种替代方法。

到目前为止我的代码:

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)

执行这段代码会给出一个错误消息:设备处于活动状态。

有什么建议吗?

目的是计算成对字符串的相似性,这意味着对于文件中的每一行,我想计算与其他每一行的Levenshtein距离。

编辑:在这个问题8个月后提出的一个相关问题有许多有用的答案和评论。要更深入地了解python逻辑,请阅读以下相关问题:如何在python中逐行读取文件?


当前回答

正确的、完全python式的读取文件的方法如下:

with open(...) as f:
    for line in f:
        # Do something with 'line'

with语句处理打开和关闭文件,包括在内部块中引发异常。f中的for行将文件对象f视为可迭代对象,它自动使用缓冲I/O和内存管理,因此您不必担心大文件。

应该有一种——最好只有一种——明显的方法来做到这一点。

其他回答

正确的、完全python式的读取文件的方法如下:

with open(...) as f:
    for line in f:
        # Do something with 'line'

with语句处理打开和关闭文件,包括在内部块中引发异常。f中的for行将文件对象f视为可迭代对象,它自动使用缓冲I/O和内存管理,因此您不必担心大文件。

应该有一种——最好只有一种——明显的方法来做到这一点。

这是python中读取文件的一种可能方式:

f = open(input_file)
for line in f:
    do_stuff(line)
f.close()

它不分配一个完整的列表。它在直线上迭代。

Katrielalex提供了打开和读取一个文件的方法。

不管你的算法是如何运行的,它会为文件的每一行读取整个文件。这意味着,如果N是文件中的行数,那么读取文件的总量(以及计算Levenshtein距离)将是N*N。由于您关心文件大小,并且不想将其保存在内存中,因此我关心的是所产生的二次运行时。你的算法属于O(n^2)类算法,通常可以通过专门化来改进。

我怀疑您已经知道这里内存与运行时的权衡,但是您可能想要研究是否有一种并行计算多个Levenshtein距离的有效方法。如果是这样的话,在这里分享你的解决方案会很有趣。

你的文件有多少行,你的算法必须在什么样的机器(mem和cpu功率)上运行,以及容忍的运行时间是多少?

代码如下所示:

with f_outer as open(input_file, 'r'):
    for line_outer in f_outer:
        with f_inner as open(input_file, 'r'):
            for line_inner in f_inner:
                compute_distance(line_outer, line_inner)

但问题是你如何存储距离(矩阵?),你能获得一个优势准备例如outer_line处理,或缓存一些中间结果以供重用。

逐行读取大文件的最佳方法是使用python枚举函数

with open(file_name, "rU") as read_file:
    for i, row in enumerate(read_file, 1):
        #do something
        #i in line of that line
        #row containts all data of that line

来自python文档fileinput.input():

这将遍历sys. exe中列出的所有文件的行。Argv[1:],默认为sys。如果列表为空,则输入

进一步,函数的定义为:

fileinput.FileInput([files[, inplace[, backup[, mode[, openhook]]]]])

字里行间,这告诉我文件可以是一个列表,所以你可以有这样的东西:

for each_line in fileinput.input([input_file, input_file]):
  do_something(each_line)

更多信息请参见这里