Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.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 大小为uknown的两个文本文件之间的差异_Python - Fatal编程技术网

Python 大小为uknown的两个文本文件之间的差异

Python 大小为uknown的两个文本文件之间的差异,python,Python,在希望找到解决办法的过程中,我损失了几天但没有成功!我有两个多行的文本文件。一个文件可以包含数千行数字,例如:79357795 79357796 68525650 第二个文件也包含数字,但不太多,可能有一百行(同样,每行一个数字)。我尝试了一些“算法”,但没有成功。现在,我的问题是:我能检查第一个文件的第一行和第二个文件的所有行吗?然后,检查第一个文件的第二行和第二个文件的所有行,依此类推,直到文件的末尾?因此,我想将这两个文件之间的差异保存在第三个文件中。感谢大家的回复,并为我最糟糕的英语感到

在希望找到解决办法的过程中,我损失了几天但没有成功!我有两个多行的文本文件。一个文件可以包含数千行数字,例如:79357795 79357796 68525650

第二个文件也包含数字,但不太多,可能有一百行(同样,每行一个数字)。我尝试了一些“算法”,但没有成功。现在,我的问题是:我能检查第一个文件的第一行和第二个文件的所有行吗?然后,检查第一个文件的第二行和第二个文件的所有行,依此类推,直到文件的末尾?因此,我想将这两个文件之间的差异保存在第三个文件中。感谢大家的回复,并为我最糟糕的英语感到抱歉。:)

PS:哦,是的,我需要用Python来做这个

更多详情: 第一个_file.txt包含:

79790104
79873070
69274656
69180377
60492209
78177852
79023241
69736256
68699620
79577311    
78509545
69656007
68188871
60643247
78898817
79924105
79684143    
79036022
69445507
60605544
79348181
69748018
69486323
69102802
68651099
第二个_file.txt包含:

78509545    
69656007    
68188871    
60643247
78898817    
79924105    
79684143    
79036022    
69445507
60605544    
79348181    
69748018    
69486323    
69102802
68651099
79357794
78953958
69350610
78383111
68629321
78886856
第三个文件需要包含第一个文件中不存在但第二个文件中存在的编号,在这种情况下:

79357794
78953958
69350610
78383111
68629321
78886856

编辑:这将为您提供两个列表中的所有数字(这是您第一次要求的)。请参阅其他答案以了解您的数据集需要什么。(我喜欢1_CR的答案。)


可以提高效率,但文件听起来没有那么大,这是最简单的方法

如果我是你,我会将这些文件加载到两个文件中,然后遍历其中一个,在第二个文件中查找每个值。

类似于:

from itertools import ifilterfalse

with open('first') as fst, open('second') as snd, open('not_second', 'w') as fout:
    snd_nums = set(int(line) for line in snd)
    fst_not_in_snd = ifilterfalse(snd_nums.__contains__, (int(line) for line in fst))
    fout.writelines(num + '\n' for num in fst_not_in_snd)

如果文件足够小,可以加载到内存中,则可以选择集合

with open('firstfile.txt') as f1, open('second_file.txt') as f2:
    print '\n'.join(set(f2.read().splitlines()).difference(f1.read().splitlines()))

很难找出你想要达到的目标。请发布一些小的示例文件和预期的输出。您可能希望查看
set
函数,通过将所有值加载到两个集合中,您可以得到交集、并集等-在本例中,您所说的“比较”和“差异”是什么意思?例如,如果第一个文件有
79357795 79357796 68525650
,而第二个文件只有一个数字,您如何比较这些数字?总的来说?通过文本匹配?一行一行?需要更多的细节是行不通的。一旦你迭代了
文件2
,它就结束了,你必须重新打开它。不。。。file1和file2是行列表,而不是文件列表。我在文件对象上使用了read(),OP请求的是第二个对象中的项,而不是第一个对象中的项,而不是两个对象中的项。这也是非常低效的。哦,对不起,误读了。太好了,它可以工作了,谢谢!因为他们在寻找第二个项目,而不是第一个项目,而且第二个项目要小得多,所以您可能希望遍历该项目,检查第一个项目中的匹配项。1)“一”!=“首先”,在我发布答案后,OP决定选择哪一个。原始版本中没有任何数据。我没有做出这样的假设,只是为OP添加了一个澄清点。OP声明
snd
fst
短得多-将
ifilterfalse
更改为迭代
snd
,而不是
fst
,难道不能获得一些效率吗?还是
\uuuu包含的真正瓶颈?@ernie最简单的方法是将最短的项目和比较放在内存中,然后从主文件中选择行,这意味着迭代大量项目的性能影响小于比较大型项目的内存成本?我想现实是,它取决于相对大小,但我只是好奇@厄尼,事实上,我想我搞错了——误读了OP问题中的
而不是
。。。
with open('firstfile.txt') as f1, open('second_file.txt') as f2:
    print '\n'.join(set(f2.read().splitlines()).difference(f1.read().splitlines()))