Python 如何将2个csv文件与>;1000行,然后找出差异?
我有一个python脚本,它可以抓取一个网站并下载csv文件中的一些数据 我每周运行这个脚本。现在我想比较两周的csv,并找出这两个csv中更改了哪一行 csv中的数据98%相同,只有1或2行被添加或删除 我找不到合适的解决办法。我使用了DictReader,试图比较内容,但没有成功 任何这样求解的指针都可能有帮助,我还读到我可以将它们转换为set,然后执行setA-setB 如果有帮助的话,我会给出CSV的格式 file1.csvPython 如何将2个csv文件与>;1000行,然后找出差异?,python,Python,我有一个python脚本,它可以抓取一个网站并下载csv文件中的一些数据 我每周运行这个脚本。现在我想比较两周的csv,并找出这两个csv中更改了哪一行 csv中的数据98%相同,只有1或2行被添加或删除 我找不到合适的解决办法。我使用了DictReader,试图比较内容,但没有成功 任何这样求解的指针都可能有帮助,我还读到我可以将它们转换为set,然后执行setA-setB 如果有帮助的话,我会给出CSV的格式 file1.csv name,userId,location aaa,abc,NY
name,userId,location
aaa,abc,NYC
bbb,cdf,UCL
文件2.csv
name,userId,location
bbb,cdf,UCL
现在,如果您看到,file2.csv中删除了一行,因此当我比较
file1.csv
和file2.csv
时,我应该能够得到值aaa、abc、NYC
尝试diff
命令:
diff file1.csv file2.csv
根据您使用的操作系统的不同,您可能需要找到适用于您的系统的副本。是的,设置差异有效
with open('file1.csv') as f, open('file2.csv') as g:
old, new = set(f), set(g)
for added in new - old:
print('added', added)
for deleted in old - new:
print('deleted', deleted)
如果文件真的如此相似,您可以只比较文件之间的行 我正在使用两个你发布的有问题的示例文件
file1 = []
file2 = []
with open('file1.csv','r') as f, open('file2.csv','r') as g:
file1, file2 = list(f), list(g)
for line in file1:
if line not in file2:
print "Difference:",line
输出:
Difference: aaa,abc,NYC
使现代化
我喜欢@Stefan Pochmann解决方案,对我来说这是最优雅的方式:
with open('file1.csv','r') as f, open('file2.csv','r') as g:
file1, file2 = set(f), set(g)
print "Difference:", list(file1 - file2)
您可以为此使用
pandas
库
a.csv
name,userId,location
aaa,abc,NYC
bbb,cdf,UCL
ccc,dfg,LAC
ddd,fgh,SAC
name,userId,location
bbb,cdf,UCL
ccc,dfg,LAC
b.csv
name,userId,location
aaa,abc,NYC
bbb,cdf,UCL
ccc,dfg,LAC
ddd,fgh,SAC
name,userId,location
bbb,cdf,UCL
ccc,dfg,LAC
代码:
import pandas as pd
a = pd.read_csv('a.csv')
b = pd.read_csv('b.csv')
mask = a.isin(b.to_dict(orient='list'))
# Reverse the mask and remove null rows.
# Upside is that index of original rows that
# are now gone are preserved (see result).
c = a[~mask].dropna()
print c
name userId location
0 aaa abc NYC
3 ddd fgh SAC
[Finished in 0.7s]
结果:
import pandas as pd
a = pd.read_csv('a.csv')
b = pd.read_csv('b.csv')
mask = a.isin(b.to_dict(orient='list'))
# Reverse the mask and remove null rows.
# Upside is that index of original rows that
# are now gone are preserved (see result).
c = a[~mask].dropna()
print c
name userId location
0 aaa abc NYC
3 ddd fgh SAC
[Finished in 0.7s]
由于结合使用了
numpy
、Cython
和一些原始的C实现,pandas具有优化的优势。在学习python时需要python中的解决方案。此选项或、git diff或Beyond Compare或任何其他文件比较将执行此操作。是否执行此操作,这就是在提出“可以将这些转换为set,然后执行setA-setB”问题时可能出现的解决方案中已提到的原因。比较文本记录行中任何数据的标准方法是diff
,但它的算法已经用多种语言实现,包括Python。包括我的快速搜索结果(一个很好的练习是将CSV数据集转换为JSON),如果我使用DictReader读取CSV文件,它将是一个键/值对,也是一个JSON?json delta 1.1.3是一个python包,我可以编写它所需要的解决方案,即使它不能处理所有的边缘情况,但我可以想象,然后搜索数据差异算法并实现它们。标准的diff
算法非常快,如果文件与Python代码中的解决方案几乎相同,我已经知道diff和uniq命令。如果可能,还有其他选项吗。因为将来可能会有一些Set不会提供的增强功能。这也是一个有效的解决方案吗?@Archer想象一下,这相当有效,是的。预期线性时间。你试过了吗?还有什么样的增强功能?这个解决方案我已经尝试过了,而且很有效。我不确定将其更改为Set,然后使用Set操作是否是一个有效的解决方案,它基本上解决了问题,但感觉不是一个解决方案。Set非常快。看一看它的表格。感谢链接,看起来这就是解决方案,不会打断我的头来得到一个有效的解决方案,因为根据链接,它将是O(len(s)),如果我是正确的,这是一个O(n^2)解决方案,我们可以在线性时间内这样做吗?甚至我也消除了在两个for循环中读取文件的成本,这可能只是一次成本。