1

我的代码的目的是遍历数组中的每个元素,将元素转换为字符串,并从包含该字符串的另一个文件返回行。我的代码是:

    for element in myarray:
         elementstring=''.join(element)
         for line in myfile:
              if elementstring in line:
                  print line

如果代码运行,它将仅适用于第一个元素。有人可以解释这是为什么吗?

4

4 回答 4

2

发生这种情况是因为当您通读一次文件的行时,您会到达文件的末尾并且没有剩余的行可以读取。您需要关闭文件并重新打开它以读取每个element.

这是这样做的一种方法:

for element in myarray:
    elementstring=''.join(element)
    with open('path/to/myfile') as myfile:
        for line in myfile:
            if elementstring in line:
                print line

read或者,如果这是一个足够小的文件,您可以通过预先缓存文件中的行来避免磁盘中的几个 s 来减少运行时间,如下所示:

myfile = [line.rstrip('\n') for line in open('path/to/myfile')]
for element in myarray:
    elementstring=''.join(element)
    for line in myfile:
        if elementstring in line:
            print line
于 2012-10-09T21:44:03.047 回答
0

您浏览一个文件...将指针移到末尾...您需要重新打开文件或myfile.seek(0)...但是您的代码还有其他一些问题。不看就很难回答myarray

于 2012-10-09T21:42:38.867 回答
0
with open(myfile) as f:
    lines=[x for x in f] #store all lines in a list first
    for element in myarray:    #now iterate over myarray
         elementstring=''.join(element)
         for line in lines:            #now iterate over individual line from lines
              if elementstring in line:
                  print line
于 2012-10-09T21:46:16.153 回答
0

正如其他人所说,文件不是集合。文件是按顺序读取的,每次迭代都需要使用 seek 函数返回到第一行。

无论如何,这并不是做你想做的事的最佳方式。

从文件读取通常比从 RAM 读取慢(即使有缓存),所以最好让主循环遍历文件。

最好事先计算外部数组上的所有字符串值。

最后,您可能会考虑使用许多算法来搜索文件(或更大的字符串)中的一组字符串。

这是您的代码的优化版本:

strs = [' '.join(element) for element in myarray]
for line in open(''path/to/myfile'):
    for elementstring in strs:
         if elementstring in line:
              print line
于 2012-10-09T21:47:54.060 回答