【问题标题】:How to loop & print line 1 then line 2 from 2 different text files [duplicate]如何从2个不同的文本文件中循环和打印第1行然后第2行[重复]
【发布时间】:2018-01-31 22:09:15
【问题描述】:

我有 2 个包含数据的文本文件,我想要一个循环,它同时遍历每个文本文件的第一行,然后是第二行,然后是第三行。所以我对它们都使用了一个内部“for”循环,但它并没有像我想要的那样循环,而是循环第一个文本文件的第一行,第二个文本文件中的所有行,然后第一个文件的第二行,所有来自第二个文件的行。

我已经尝试了所有方法,但没有任何效果。如果我使用如下所示的 break 语句,它将开始使用第一个文本文件的所有行与第二个文本文件的第一行相同,但如果我删除该 break 语句,那么它将选择相同第一个文本文件的第一行,但包含第二个文本文件的所有行。

这是我的代码:

fi  =open("C:\\Users\\file1.txt","r")
file1 = fi.read().splitlines()    
fi2 =  open("C:\\Users\\file2.txt","r")
file2 = fi2.read().splitlines()

for file1_data in file1:
    for file2_data in file2:    
        try:
            print(file1_data)
            print(file2_data)

        except:

            print("exit")

        break

【问题讨论】:

  • zip 文件迭代器一起...另外,在使用大文件时尽量避免read().splitlines().. 你可以这样做for line in file1
  • 也在这里更一般地回答stackoverflow.com/questions/21248122/…
  • 谢谢你们,非常感谢。它通过使用zip方法工作,你们真的很棒。

标签: python python-3.x for-loop


【解决方案1】:

你可以这样做:

for file1_data, file2_data in zip(file1,file2):
    try:
        print(file1_data)
        print(file2_data)

    except:
        print("exit")

    break

您可以找到有关 zip here 的更多信息。

如果文件的长度不同,请使用itertools.zip_longest。所以,你会这样做:

from itertools import zip_longest
for file1_data, file2_data in zip_longest(file1,file2):
    try:
        print(file1_data)
        print(file2_data)

    except:
        print("exit")

    break

【讨论】:

  • 虽然使用zip() 可能比我的答案更好,但这段代码只打印文件的第一行。
  • @EdwinvanMierlo 这可能是您读取数据方式的问题。在迭代检查之前打印两个行列表..
  • 非常感谢@MedAli,它成功了。看完你们之后,我想我必须学习的远不止这些。
  • @Rahul 不客气 :)
【解决方案2】:

我只会使用 1 个for 循环和一个行计数器。 如果文件比较小,可以使用readlines()读取数据,这样就不用split(),然后得到两个文件的最小行数,然后一个一个读取。

类似这样的:

def read_data(filename):
    openfile = open(filename, 'r')
    data = openfile.readlines()
    openfile.close()
    return data


def get_min_lines(list1, list2):
    """
    returns the minimum number of lines 
    comparing the two lists
    """
    return min([len(list1), len(list2)])


def main():
    #
    # read the data of both files
    file_1_data = read_data(r'c:\somedir\somefile1.txt')
    file_2_data = read_data(r'c:\somedir\somefile2.txt')
    #
    # get the max number of lines you need to iterate to
    # this will be the smaller of the two files
    # just in case the files are not equal size
    max_lines = get_min_lines(file_1_data, file_2_data)
    #
    # use one for loop to go over all lines
    # added in the .strip('\n') to get rid of extra linefeeds
    # which are still present in the data from the original readlines()
    for line_counter in range(0, max_lines):
        print(file_1_data[line_counter].strip('\n'))
        print(file_2_data[line_counter].strip('\n'))


if __name__ == '__main__':
    main()

【讨论】:

  • 使用 zip_longest 不需要计算行数
  • 我知道zip()zip_longest() 是更好的答案,这只是一个替代的工作答案。我暂时保留这个答案,因为我相信这是一个有效的答案。
  • 不过,这不会迭代两个文件的全部内容
  • @cricket_007 嗯;我只是用两个1000行的文件测试了一下,都迭代了,然后我拿了一个1000行和a1001行的文件,迭代了其中的1000行。如果我的代码不起作用,您能否详细说明您的经历,以便我可以更好地调查并更新我的答案。 (并自学)
  • 正如我所说,两个文件的全部内容。如果您在一个文件中有一行,而在另一个文件中有 1000 行,则理想情况下,您希望输出总行数,该总行数等于所有文件中的总行数
猜你喜欢
  • 1970-01-01
  • 2020-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
  • 2016-10-20
  • 1970-01-01
  • 2014-07-06
相关资源
最近更新 更多