比较Python中的CSV文件-循环有问题
我正试图设计一个python脚本来读取一系列CSV文件,选择第一列并将每个行与主CSV文件进行比较。如果存在任何匹配项,则会将匹配项和行号打印到控制台中。它还发布文件名和在另一个CSV文件中找到的匹配项 到目前为止,除了我正在进行的这个该死的循环外,一切都很顺利。一旦脚本进入循环,它就会飞过它,并针对CSV文件目标目录中的每个文件重新循环它。我知道它正在处理循环,因为它将每个CSV文件中的行数输出到控制台。但是,它不会打印出是否找到了匹配项,因此我的嵌套循环有问题比较Python中的CSV文件-循环有问题,python,regex,csv,Python,Regex,Csv,我正试图设计一个python脚本来读取一系列CSV文件,选择第一列并将每个行与主CSV文件进行比较。如果存在任何匹配项,则会将匹配项和行号打印到控制台中。它还发布文件名和在另一个CSV文件中找到的匹配项 到目前为止,除了我正在进行的这个该死的循环外,一切都很顺利。一旦脚本进入循环,它就会飞过它,并针对CSV文件目标目录中的每个文件重新循环它。我知道它正在处理循环,因为它将每个CSV文件中的行数输出到控制台。但是,它不会打印出是否找到了匹配项,因此我的嵌套循环有问题 for eachFile in
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]再次运行它时,这两个选项都正确打印,这会给我一个错误,说明列表索引超出范围。那就是我迷路的地方。。。