Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将2个csv文件与>;1000行,然后找出差异?_Python - Fatal编程技术网

Python 如何将2个csv文件与>;1000行,然后找出差异?

Python 如何将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

我有一个python脚本,它可以抓取一个网站并下载csv文件中的一些数据

我每周运行这个脚本。现在我想比较两周的csv,并找出这两个csv中更改了哪一行

csv中的数据98%相同,只有1或2行被添加或删除

我找不到合适的解决办法。我使用了DictReader,试图比较内容,但没有成功

任何这样求解的指针都可能有帮助,我还读到我可以将它们转换为set,然后执行setA-setB

如果有帮助的话,我会给出CSV的格式

file1.csv

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循环中读取文件的成本,这可能只是一次成本。