【发布时间】:2018-08-30 15:39:42
【问题描述】:
我正在尝试比较 2 个 CSV 文件,其中第一个只有几个条目,另一个有 300 行。如果来自 file1.csv 的列电子邮件与来自 file2.csv 的列电子邮件匹配但日期不匹配,我试图实现的输出是打印大文件中的行输出。我想使用“CSV”模块来做到这一点。这是一个例子:
file1.csv(少数条目):
Tom,Johns,tom.johns@email.com,14 May 2017
Imaginary,User,imaginary@email.com,23 May 2018
file2.csv(大文件):
First,User,first.user@email.com,10 Jan 2018
Second,User,second.user@email.com,13 Feb 2018
Tom,Johns,tom.johns@email.com,16 Jun 2017
Imaginary,User,imaginary@email.com,23 May 2018
result.csv(期望的结果)
Tom,Johns,tom.johns@email.com,16 Jun 2017
我尝试使用函数“next”来实现这一点,但由于 file1.csv 中只有 2 个条目,脚本会停止。我已经重写了代码,但现在我正在对关闭的文件进行 I/O 操作。
import csv
with open('file1.csv', 'r') as first_csv:
dialect = csv.excel()
file1 = csv.reader(first_csv, dialect)
with open('file2.csv', 'r') as second_csv:
dialect = csv.excel()
file2 = csv.reader(second_csv, dialect)
writer = csv.writer(open('result.csv', 'w'))
output = set()
for row1 in file1:
for row2 in file2:
if (row1[2] == row2[2]) and (row1[3] != row1[3]):
writer.writerow(row2)
output.append(row2)
【问题讨论】:
-
将每个 csv 文件输入到单独的 SQLite 表中然后加入这些表可能更容易(也更快)。更多阅读:docs.python.org/3/library/sqlite3.html、sqlite.org/docs.html。 @StefanosGkouts
-
@Mr.Zeus 我对 Python 还是很陌生,所以我仍然对基础知识有所了解。我宁愿使用“import csv”来做,很抱歉没有提到这一点。我已经更新了最初的帖子。
-
在这种情况下@Python_Rookie,我会用纯 Python 和
csv代码回复你,我只是在做某事。 -
我刚刚意识到这是因为当你使用
withstatement 时,当你到达它的末尾时会关闭 I/O 流。我解决了这个问题,但你的逻辑仍然存在问题。
标签: python-3.x csv