在Python中,为什么我的“for entry in csv_compare:“循环只迭代一次,并且在最后一个输入上卡住了

qco9c6ql  于 2022-12-06  发布在  Python
关注(0)|答案(3)|浏览(108)

我尝试比较2个csv文件,然后把共同的条目放在第三个csv文件中写入文件。由于某种原因,它迭代整个循环的行在csv_input,但在csv_compare循环的条目只迭代一次,并停止在最后一个条目。我想比较每一行条目与每一个条目条目。

import csv
finalCSV = {}
with open('input.csv', newline='') as csvfile, open('compare.csv', newline='') as keyCSVFile, open('output.csv', 'w' ,newline='') as OutputCSV:
    csv_input = csv.reader(csvfile)
    csv_compare = csv.reader(keyCSVFile)
    csv_output = csv.writer(OutputCSV)
    csv_output.writerow(next(csv_input))

    for row in csv_input:
        for entry in csv_compare:
            print(row[0] + ' ' + entry[0])
            if row[0] == entry[0]:
                csv_output.writerow(row)
                break
    
print('wait...')
ljsrvy3e

ljsrvy3e1#

当你中断内部循环并开始外部循环的下一次迭代时,csv_compare不会重置到开始,它会从你停止的地方继续,一旦你用完了迭代器,就结束了。
您需要在外部循环的每次迭代的顶部重置迭代器,这最容易通过简单地打开那里的文件来完成。

with open('input.csv', newline='') as csvfile, open('output.csv', 'w' ,newline='') as OutputCSV:
    csv_input = csv.reader(csvfile)
    csv_output = csv.writer(OutputCSV)
    csv_output.writerow(next(csv_input))

    for row in csv_input:
        with  open('compare.csv', newline='') as keyCSVFile:
            csv_compare = csv.reader(keyCSVFile)
            for entry in csv_compare:
                if row[0] == entry[0]:
                    csv_output.writerow(row)
                    break
lxkprmvk

lxkprmvk2#

我建议从csv_compare读取第一列到list或set,然后只使用单个for循环:

import csv

finalCSV = {}
with open("input.csv", newline="") as csvfile, open(
    "compare.csv", newline=""
) as keyCSVFile, open("output.csv", "w", newline="") as OutputCSV:
    csv_input = csv.reader(csvfile)
    csv_compare = csv.reader(keyCSVFile)
    csv_output = csv.writer(OutputCSV)
    csv_output.writerow(next(csv_input))

    compare = {entry[0] for entry in csv_compare}   # <--- read csv_compare to a set

    for row in csv_input:
        if row[0] in compare:     # <--- use `in` operator
            csv_output.writerow(row)
xt0899hw

xt0899hw3#

您可以完全跳过内部循环。当第一列与compare.csv中的任何第一列值匹配时,您可以添加input.csv中的行。因此,将这些值放在一个集合中以便于查找。

import csv

with open('compare.csv', newline='') as keyCSVFile:
    key_set = {row[0] for row in csv.reader(keyCSVFile)}

with open('input.csv', newline='') as csvfile, open('output.csv', 'w' ,newline='') as OutputCSV:
    csv_input = csv.reader(csvfile)
    csv_output = csv.writer(OutputCSV)
    csv_output.writerow(next(csv_input))
    csv_output.writerows(row for row in csv_input if row[0] in key_set)

del key_set
print('wait...')

相关问题