Python 读取两个文件并根据第一个文件的列筛选第二个文件

Python 读取两个文件并根据第一个文件的列筛选第二个文件,python,loops,csv,for-loop,Python,Loops,Csv,For Loop,我有一个包含关键字的输入文件,还有一个需要根据这些关键字过滤的csv文件 下面是我使用python自动化任务的尝试 import csv with open('Input.txt', 'rb') as InputFile: with open('28JUL2017.csv', 'rb') as CM_File: read_Input=csv.reader(InputFile) for row1 in csv.reader(InputFile):

我有一个包含关键字的输入文件,还有一个需要根据这些关键字过滤的csv文件

下面是我使用python自动化任务的尝试

import csv
with open('Input.txt', 'rb') as InputFile:
    with open('28JUL2017.csv', 'rb') as CM_File:
        read_Input=csv.reader(InputFile)
        for row1 in csv.reader(InputFile):
            #print row1

            read_CM=csv.reader(CM_File)
            next(read_CM, None)
            for row2 in csv.reader(CM_File):
                #print row2
                if row1[0] == row2[0] :

                    Output= row2[0]+","+row2[1]+","+row2[5]+","+row2[6]
                    print Output

我只从要筛选的文件中获取第一行。尝试了各种各样的事情,但不明白我错在哪里。请在这里为我指出错误

read\u Input
read\u CM
本质上是迭代器。一旦你在它们上面循环-你就完成了:你不能重复两次。如果您坚持按自己的方式操作,那么每次要开始新循环并“重新读取”CSV文件时,您都必须倒回文件的开头。这里有一个修正:

import csv
with open('file1.csv', 'rb') as InputFile:
    with open('file2.csv', 'rb') as CM_File:
        read_Input=csv.reader(InputFile)
        for row1 in csv.reader(InputFile):
            CM_File.seek(0) # rewind to the beginning of the file
            read_CM=csv.reader(CM_File)
            next(read_CM, None)
            for row2 in csv.reader(CM_File):
                if row1[0] == row2[0] :
                    Output= row2[0]+","+row2[1]+","+row2[5]+","+row2[6]
                    print Output
与此相反,我建议您循环已经读取的行,而不是重新读取文件。另外,不要使用嵌套循环,而是创建一个“关键字”列表,只需检查
row2[0]
是否在该列表中:

import csv
with open('file1.csv', 'rb') as InputFile:
    with open('file2.csv', 'rb') as CM_File:
        read_Input = csv.reader(InputFile) # read file only once
        keywords = [rec[0] for rec in read_Input]
        read_CM = csv.reader(CM_File) # read file only once
        next(read_CM, None) # not sure why you do this? to skip first line?
        for row2 in read_CM:
            if row2[0] in keywords:
                Output = row2[0]+","+row2[1]+","+row2[5]+","+row2[6]
                print("Output: {}".format(Output))

要使用
csv.reader
多次读取
CM\u文件,您需要倒带(或关闭并重新打开)。一次读取所有关键字并创建一个
集合
,然后一次读取
CM_文件
,并在读取时检查每一行中是否有任何关键字。如果您多次需要文件中的数据,请将其全部读取到可以多次解析的字符串或列表中。文件对象不像要传递的doobie。您的逻辑应该是:1)读取第一个文件2)关闭第一个文件3)读取第二个文件4)将第一个文件中的数据与第二个文件中的数据进行比较5)对第二个文件执行操作6)关闭第二个文件。进行建议的更改不会产生任何结果。我得到的第一排也不见了。如果我添加一些示例数据会有帮助吗?当然,一些数据肯定会有帮助。同样,预期的结果也不会有任何影响。@user3017186我已经在使用两个测试文件进行测试的基础上编辑了我的答案。这非常有效。我的工作文件有一个标题行。要跳过阅读,请使用next(read_CM,None)谢谢@agn gazer您的帮助