比较Python中的CSV文件-循环有问题

比较Python中的CSV文件-循环有问题,python,regex,csv,Python,Regex,Csv,我正试图设计一个python脚本来读取一系列CSV文件,选择第一列并将每个行与主CSV文件进行比较。如果存在任何匹配项,则会将匹配项和行号打印到控制台中。它还发布文件名和在另一个CSV文件中找到的匹配项 到目前为止,除了我正在进行的这个该死的循环外,一切都很顺利。一旦脚本进入循环,它就会飞过它,并针对CSV文件目标目录中的每个文件重新循环它。我知道它正在处理循环,因为它将每个CSV文件中的行数输出到控制台。但是,它不会打印出是否找到了匹配项,因此我的嵌套循环有问题 for eachFile in

我正试图设计一个python脚本来读取一系列CSV文件,选择第一列并将每个行与主CSV文件进行比较。如果存在任何匹配项,则会将匹配项和行号打印到控制台中。它还发布文件名和在另一个CSV文件中找到的匹配项

到目前为止,除了我正在进行的这个该死的循环外,一切都很顺利。一旦脚本进入循环,它就会飞过它,并针对CSV文件目标目录中的每个文件重新循环它。我知道它正在处理循环,因为它将每个CSV文件中的行数输出到控制台。但是,它不会打印出是否找到了匹配项,因此我的嵌套循环有问题

for eachFile in files:

#each file being compared
target = scanDir+eachFile

#print a message to the console letting the user know the file we're processing
print
print 'Scanning begun on: ' + target

#open the master file we'll be using during this loop
f1 = file(masterFile, 'r')
csv1 = csv.reader(f1)



with open(target, 'rb') as targetFile:

    #for fun, let's output the rows we'll be processing in the target file
    numberOfRows = sum(1 for row in targetFile)
    print 'This file contains ' + str(numberOfRows) + ' rows to review.' 

    reader = csv.reader(targetFile)

    for targetRow in reader: #not processing this loop :(
        foundMatch = False
        for masterRow in csv1:
            if targetRow[0] == masterRow[0]:
                lineNumber = targetFile.line_num
                print 'MATCH FOUND! ' + targetRow[0] + 'found on row ' + lineNumber
                print
                _includes.CVSWriter.writeRow(target, targetRow[0])
                foundMatch = True
            if not foundMatch:
                print 'No matches found in ' + target
                print
f1.close()

print 'Scanning Completed'
print

我有六个文件供循环扫描,所有文件的长度和值都不同。我甚至有一个是完全空白的,但仍然没有找到匹配项。我完全不知所措,我相信这是一个很容易解决的问题,但在这一点上,我可以从外面看一下。提前谢谢你

如果从代码中删除行数,则会耗尽输入文件,并且读卡器循环(您说不执行)正在执行,但会立即停止,因为您的读卡器没有要读取的内容

补遗 我建议您立即插入参考文件,并将第一行项目保存在一个集合数据结构中。在本例中,我必须使用不同于您的数据,因为您不想问完整的问题

from  csv import reader
ref = 'cc2012xyz2_5_5dp.csv'
ref_set = {el[0] for el in reader(open(ref))
最后一行是

现在,在我的示例中,您已经准备好迭代目标文件,只需一个文件

for tgf in ('cc2012xyz2_5_6dp.csv',):
    rtg = reader(open(tgf))
    matches = 0
    for tg_row in rtg: 
        if tg_row[0] in s1:
            print '# MATCH FOUND! ', tg_row[0], 'found on row', rtg.line_num
            matches += 1
    if matches == 1:
        print '# In file',f2,'there is 1 (one) match.'
    elif matches:
        print  '# In file',f2,'there are',matches,'matches.'
    else:
        print  '# In file',f2,'there are no matches.'
当我在我的数据文件上运行上面的代码时,我获得以下输出

# MATCH FOUND!  395.0 found on row 2
# MATCH FOUND!  420.0 found on row 7
# MATCH FOUND!  445.0 found on row 12
# MATCH FOUND!  460.0 found on row 15
# MATCH FOUND!  475.0 found on row 18
# MATCH FOUND!  510.0 found on row 25
# In file cc2012xyz2_5_6dp.csv there are 6 matches.
关于你的线路,我无能为力

        _includes.CVSWriter.writeRow(target, targetRow[0])
因为我不知道这是怎么回事,我在谷歌上搜索了一下,但只找到了你的问题

此外,如果您仍然有IndexError,我猜如中所示,您没有提出适当的问题,这意味着您的某些数据的格式不是csv读取器可以正确解析的格式


除非你认真修改你的问题,否则我帮不了你什么忙。再见。

在嵌套循环中打印targetRow[0]和masterRow[0]的值是一个好的开始。通过这种方式,您可以调试实际值,并检查为什么比较总是返回False。此外,当读卡器仍在第一次迭代时,您正在循环遍历csv1中的每个值。在reader的第二次迭代中,csv1可能不会达到您预期的效果,因为您无法在csv阅读器中迭代两次。要补充figs所说的内容,您是否尝试过重置迭代器ala?研究熊猫。这使得这种东西变得微不足道。但如果没有看到样本数据,我无法给你一个确切的答案。但是它会像:master=pd.read_csv'master';当前=局部放电读取“当前”;current[master.first\u column==current.first\u column].first\u column我读到了Matt Ball发布的另一篇文章,我想我得到了它,所以它像应该的那样迭代,但是结果是一样的。在csv1中的“for masterRow”之后使用“f1.seek0”我想这就是我需要重置它的地方?我移除了计数器并打印出了targetRow和masterRow变量。但是,当我尝试使用targetRow[0]和masterRow[0]再次运行它时,这两个选项都正确打印,这会给我一个错误,说明列表索引超出范围。那就是我迷路的地方。。。