在python中循环遍历文本文件的行

在python中循环遍历文本文件的行,python,python-3.x,text,Python,Python 3.x,Text,我有两个文本文件,我想逐行阅读,检查是否匹配,如果匹配,则打印或不执行任何操作。但在下面的代码中,它只检查第一个文件的第一行,并检查第二个for循环文件的所有行。但我想检查第一个文件和第二个文件的所有行。我不确定我犯了什么错误 with open("changed_commands_from_default_value", "a") \ as changed_commands_from_default_value, \ open(command_file, "r

我有两个文本文件,我想逐行阅读,检查是否匹配,如果匹配,则打印或不执行任何操作。但在下面的代码中,它只检查第一个文件的第一行,并检查第二个for循环文件的所有行。但我想检查第一个文件和第二个文件的所有行。我不确定我犯了什么错误

with open("changed_commands_from_default_value", "a") \
            as changed_commands_from_default_value, \
     open(command_file, "r") \
            as command_executed_file, \
     open("default_command_values", "r") \
            as default_command_values:
    for default_command in default_command_values:
       for command_executed in command_executed_file:
           only_command = command_executed.split()[0]
           only_default_command = default_command.split()[0]
           if only_command == only_default_command:
               if command_executed != default_command:
                   print("   > The default value " +
                         default_command.rstrip() + " is changed to " +
                         command_executed.rstrip())
                   changed_commands_from_default_value.write(
                       "The default value " + '"' + default_command + '"' +
                       "is changed to " + '"' + command_executed + '"')
我的数据就像

File 1:

Data1 1
Data2 2
Data3 3
Data4 6
Data5 10

File 2:

Data1 4
Data2 4
Data3 6
....
我想有一个像这样的输出

Data1 is changed from 1 to 4
Data2 is changed from 2 to 4 and so on...

只需将读数放在同一个循环中。两个文件(分别命名为t1.in和t2.in)的最小工作示例如下:

with open('t1.in', 'r') as f1:
    with open('t2.in', 'r') as f2:
        while True:
        l1, l2 = f1.readline(), f2.readline() # read lines simultaneously

        # handle case where one of the lines is empty 
        # as file line count may differ
        if (not l1) or (not l2): break
        else: 
            # process lines here
本例同时读取两个文件中的行,如果其中一个文件的行数少于另一个文件,则读取
min(文件1的行数,文件2的行数)
行数。

要在两个迭代器上“并行”循环,请使用内置的
zip
,或者在Python 2中使用
itertools.izip
(当然,后者需要在模块开始时导入itertools)

例如,改变:

        for default_command in default_command_values:
            for command_executed in command_executed_file:
进入:

这假设两个文件确实是“平行的”——即,一行一行地对应。如果不是这样,那么最简单的方法(除非文件太大以至于你的内存无法容纳)是首先将一个文件读入
dict
,然后循环另一个文件,用
dict
签入。例如:

    cmd2val = {}
    with open("default_command_values", "r") as default_command_values:
        for default_command in default_command_values:
            cmd2val[default_command.split()[0]] = default_command.strip()
然后,分别:

with open(command_file, "r") as command_executed_file:
    for command_executed in command_executed_file:
        only_command = command_executed.split()[0]
        if only_command not in cmd2val: continue   # or whatever
        command_executed = command_executed.strip()
        if command_executed != cmd2val[only_command]:
            # etc, etc, for all output you desire in this case

反之亦然,从预期较小的文件构建dict,然后使用它逐行检查预期较大的文件。

以下是一个实现:


这是因为您正在嵌套循环中读取两个文件的行。如果两个文件的行数相同,您可以从同一循环中的每个文件中读取一行。@vhariop否,它们的行数完全不同:/“我有两个文本文件,我想逐行读取…”这两个文件中的哪一个是“it”。您的
命令文件的内容是什么?
?该模块可能会对您有所帮助。您听说过差异吗?将数据放入这样一个dict中不会保留更改的顺序,这在OP所需的输出中似乎很重要。@martineau,顺序来自另一个文件,即按顺序处理的文件。@martineau如果两个文件的顺序不同,那么显然你不能同时“保持顺序”——如果顺序很重要,但文件之间可能不同,那么你需要选择一个输入文件,然后将另一个文件转换为
dict
with open(command_file, "r") as command_executed_file:
    for command_executed in command_executed_file:
        only_command = command_executed.split()[0]
        if only_command not in cmd2val: continue   # or whatever
        command_executed = command_executed.strip()
        if command_executed != cmd2val[only_command]:
            # etc, etc, for all output you desire in this case
#!/usr/bin/env python3
"""Match data in two files. Print the changes in the matched values.

Usage: %(prog)s <old-file> <new-file>
"""
import sys

if len(sys.argv) != 3:
    sys.exit(__doc__ % dict(prog=sys.argv[0]))

old_filename, new_filename = sys.argv[1:]

# read old file
data = {}
with open(old_filename) as file:
    for line in file:
        try:
            key, value = line.split()
            data[key] = int(value)
        except ValueError:
            pass # ignore non-key-value lines

# compare with the new file
with open(new_filename) as file:
    for line in file:
        columns = line.split()
        if len(columns) == 2 and columns[0] in data:
            try:
                new_value = int(columns[1])
            except ValueError:
                continue # ignore invalid lines
            else: # matching line
                value = data[columns[0]]
                if value != new_value: # but values differ
                    print('{key} is changed from {value} to {new_value}'.format(
                        key=columns[0], value=value, new_value=new_value))
Data1 is changed from 1 to 4
Data2 is changed from 2 to 4
Data3 is changed from 3 to 6