如何使用Python readlines()同步遍历两个不同的文件?

时间:2015-09-02 10:38:24

标签: python file-io

我有两个文件:

test1.txt的内容:

test_outside_1
test_outside_2
test_outside_3

test2.txt的内容:

test_inside_1
test_inside_2
test_inside_3

这是我的Python代码:

fobj1 = open('test1.txt', 'r')
fobj2 = open('test2.txt', 'r')

for aline in fobj1.readlines():
    print aline
    for bline in fobj2.readlines():
        print bline

我预期的输出是:

test_outside_1
test_inside_1
test_inside_2
test_inside_3
test_outside_2
test_inside_1
test_inside_2
test_inside_3
test_outside_3
test_inside_1
test_inside_2
test_inside_3

但是当我运行我的Python代码时,输​​出是:

test_outside_1
test_inside_1
test_inside_2
test_inside_3
test_outside_2
test_outside_3

有人可以告诉我如何解决它吗?

3 个答案:

答案 0 :(得分:2)

执行file.readlines()时,您读取完整文件,光标位于文件末尾,尝试再次调用file.readlines()将返回一个空列表,因为没有更多要从文件中读取的行。

您可以做的一件事就是将每个存储在列表中并迭代列表。示例 -

with open('test1.txt', 'r') as fobj1 , open('test2.txt', 'r') as fobj2:
    alist = fobj1.readlines()
    blist = fobj1.readlines()
    for aline in alist:
        print aline
        for bline in blist:
            print bline

虽然请注意,如果文件很大,将完整的文件读入内存可能不是一个好主意。根据您的最终目标,可能会有更好的方法。

答案 1 :(得分:1)

它发生了,因为在test1.txt的第一次迭代中,test2.txt被读取,然后没有其他存在读取test2.txt

您也可以这样做:

fobj1 = list(open('test1.txt', 'r'))
fobj2 = list(open('test2.txt', 'r'))
for aline in fobj1:
    print aline
    for bline in fobj2:
        print bline

答案 2 :(得分:1)

在第一个循环中回答@Anand S Kumar你在一个循环中读取完成文件,它返回并清空列表。

如果您不想存储所有文件(因为这可能是一个坏主意),您将不得不再次打开您的文件。

with open('test1.txt', 'r') as fobj1:
  for aline in fobj1.readlines():
    print aline
    with open('test2.txt', 'r') as fobj2:
      for bline in fobj2.readlines():
        print bline

但你会打开很多时间。

编辑:#Anand的评论是正确的。

如果你想保持低内存,你应该做类似的事情

aline="."
with open('test1.txt', 'r') as fobj1:
  while aline != "":
    aline = fobj1.readline()
    print aline
    bline="."
    with open('test2.txt', 'r') as fobj2:
      while bline != "":
        bline = fobj2.readline()
        print bline