我有两个需要比较的csv文件然后吐出差异:
CSV格式:
Name Produce Number
Adam Apple 5
Tom Orange 4
Adam Orange 11
我需要比较两个csv文件,然后告诉我表单和表2上的Adams苹果之间是否存在差异,并为所有名称和生成数字执行此操作。两个CSV文件的格式都相同。
任何指针都将非常感谢
答案 0 :(得分:6)
我使用过csvdiff
$pip install csvdiff
$csvdiff --style=compact col1 a.csv b.csv
答案 1 :(得分:5)
如果您的CSV文件不是很大,如果您将它们加载到内存中,它们会让您的机器瘫痪,那么您可以尝试以下方法:
import csv
csv1 = list(csv.DictReader(open('file1.csv')))
csv2 = list(csv.DictReader(open('file2.csv')))
set1 = set(csv1)
set2 = set(csv2)
print set1 - set2 # in 1, not in 2
print set2 - set1 # in 2, not in 1
print set1 & set2 # in both
对于大型文件,您可以将它们加载到SQLite3数据库中并使用SQL查询执行相同操作,或者按相关键进行排序,然后执行匹配合并。
答案 2 :(得分:1)
比较两个不同文件的最佳实用工具之一是diff
。
请参阅此处的Python实现:Comparing two .txt files using difflib in Python
答案 3 :(得分:1)
import csv
def load_csv_to_dict(fname, get_key, get_data):
with open(fname, 'rb') as inf:
incsv = csv.reader(inf)
incsv.next() # skip header
return {get_key(row):get_data(row) for row in incsv}
def main():
key = lambda r: tuple(r[0:2])
data = lambda r: int(r[2])
f1 = load_csv_to_dict('file1.csv', key, data)
f2 = load_csv_to_dict('file2.csv', key, data)
f1keys = set(f1.iterkeys())
f2keys = set(f2.iterkeys())
print("Keys in file1 but not file2:")
print(", ".join(str(a)+":"+str(b) for a,b in (f1keys-f2keys)))
print("Keys in file2 but not file1:")
print(", ".join(str(a)+":"+str(b) for a,b in (f2keys-f1keys)))
print("Differing values:")
for k in (f1keys & f2keys):
a,b = f1[k], f2[k]
if a != b:
print("{}:{} {} <> {}".format(k[0],k[1], a, b))
if __name__=="__main__":
main()
答案 4 :(得分:1)
如果要将Python的csv模块与函数生成器一起使用,可以使用嵌套循环并比较大型.csv文件。下面的示例使用粗略比较来比较每一行:
import csv
def csv_lazy_get(csvfile):
with open(csvfile) as f:
r = csv.reader(f)
for row in r:
yield row
def csv_cmp_lazy(csvfile1, csvfile2):
gen_2 = csv_lazy_get(csvfile2)
for row_1 in csv_lazy_get(csvfile1):
row_2 = gen_2.next()
print("row_1: ", row_1)
print("row_2: ", row_2)
if row_2 == row_1:
print("row_1 is equal to row_2.")
else:
print("row_1 is not equal to row_2.")
gen_2.close()
答案 5 :(得分:0)
这是一个不使用difflib
的开头。这真的只是一个点,因为可能亚当和苹果在表格上出现两次;你能确保不是这样吗?苹果应该相加,还是错误?
import csv
fsock = open('sheet.csv','rU')
rdr = csv.reader(fsock)
sheet1 = {}
for row in rdr:
name, produce, amount = row
sheet1[(name, produce)] = int(amount) # always an integer?
fsock.close()
# repeat the above for the second sheet, then compare
你明白了吗?