我有两个以相同方式格式化的csv文件(两列数据):
Name Link
Name Link
Name Link
Name Link
它们之间的唯一区别是这两列中的数据(不同的名称和不同的链接)。我想找到两个csv文件中出现的名称和链接,并将它们写入新的csv文件。到目前为止,我已经尝试过:
import csv
f1 = file('/path/to/f1.csv', 'r')
f2 = file('/path/to/f2.csv', 'r')
f3 = file('/path/to/f3.csv', 'w')
c1 = csv.reader(f1)
c2 = csv.reader(f2)
c3 = csv.writer(f3)
masterlist = [row for row in c2]
for hosts_row in c1:
row = 1
found = False
for master_row in masterlist:
results_row = hosts_row
if hosts_row[3] == master_row[1]:
results_row.append('FOUND in master list (row ' + str(row) + ')')
found = True
break
row = row + 1
if not found:
results_row.append('NOT FOUND in master list')
c3.writerow(results_row)
f1.close()
f2.close()
f3.close()
这是基于对a similar question的回答,但是我意识到在这种情况下csv文件的格式是不同的。所以我得到了这个错误:
masterlist = [row for row in c2]
_csv.Error: new-line character seen in unquoted field - do you need to open the file in universal-newline mode?
如何调整上述代码以适合我的csv文件的格式。或者有更好的方法吗?任何帮助都会非常受欢迎,因为我刚开始使用python而且我认为我还没有完全掌握在两个文件中比较数据的概念。
答案 0 :(得分:1)
l1 = set(open('f1.csv'))
l2 = set(open('f2.csv'))
open('f3.csv', 'wb').writelines(l1 & l2)
l1
和l2
分别是f1.csv和f2.csv中的行集。 l1 & l2
计算set intersection两个文件中找到的行,并将它们输出到f3.csv。
答案 1 :(得分:0)
你的文件有多大?你可以在内存中加载它们吗?上面的代码加载其中一个。而且因为你对整行感兴趣(我猜),你不必在行内comapre内容。
你也不需要csv阅读器。
所以,试试
f1 = open('/path/to/f1.csv', 'r').readlines()
f2 = open('/path/to/f2.csv', 'r').readlines()
f3 = open('/path/to/f3', 'a')
for lines in f1:
if lines in f2:
f3.write(lines)
f1.close()
f2.close()
f3.close()
答案 2 :(得分:0)
根据文件的大小,使用字典来查明master_row中是否已找到host_rows [3]是有意义的。您的算法复杂度将从N1xN2下降到N1,因为字典访问是O(1)
这将是这样的:
master_dct = {}
for master_row in master_list :
master_dct[master_row[3]] = None
results_row = []
for hosts_row in c1 :
if hosts_row[1] in master_dct :
results_row.append(hosts_row)