2016-06-23 175 views
-2

我有一个非常奇怪的问题。我有三个文件,其中包含一列数字。我只需要从第一个文件中获取唯一值,这些值不会出现在第二个和第三个文件中。两个文件比较

我试过的Python这样的:

for e in firstfile: 
    if e not in secondfile: 
     resultfile.append(e) 
return resultfile 

而同为第三档。

我试过的uniq,排序,DIFF,一些AWK脚本和通讯在Linux的shell喜欢这里:Fast way of finding lines in one file that are not in another?

但唯一的结果,每次我得到的是线条的相同数额,因为这是在以往的第一个文件。我一点都不明白!

也许,我错过了什么?也许这是一种格式?不过,我查了很多次。这里是文件:http://dropmefiles.com/BaKGj

P.S.后来我认为根本没有独特的线条,但我手动检查了它,第一个文件中的一些数字是唯一的。

P.P.S.文件的格式是这样的:

380500100000 
380500100001 
380500100002 
380500100003 
380500100004  
380500100005 
380500100008 
380500100020 
380500100022 
380500100050  
380500100070 
380500100080 
+0

如果它只是一列数字,那么您应该包含20个来自eacg的数据,这样我们就可以了解您使用的数据。将这些文件放在Dropmefiles中将不会在将来7天内移除文件。我也会加载第一个文件,然后删除从第二个和第三个文件加载的所有内容(如果它存在于第一个文件中)。 – IvanD

+0

当然,这是一个不错的音符。你是俄罗斯人吗? – tiredsys

回答

2

什么是错

而同为第三档

如果你真的做同为第三档,即第一档的原始内容与比较第三,你可以引入不在第二个文件但在第三个文件中的项目的重复项。例如:

 
file 1: 
1 
2 
3 

file 2: 
1 

file 3: 
2 

处理文件2之后,将resultfile然后,处理文件3后含有2和3,resultfile将含有2和3(从第一次运行) 1和3,即2, 3,1,3。但是,结果应该是3.

从代码中不清楚您是否实际将每次运行的输出写入文件resultfile。如果是,则应将其用作第二次和后续运行的输入,不要再处理第一个文件。


一个更好的办法来解决它

如果你不需要从第一个文件保存行的顺序,你可以使用set.difference()这样的:

with open('file1') as f1, open('file2') as f2, open('file3') as f3: 
    unique_f1 = set(f1).difference(f2, f3) 

注意这将包括文件中存在的任何空格(包括换行符)。如果你想忽略每行开头和结尾的空白:

from itertools import chain 

with open('file1') as f1, open('file2') as f2, open('file3') as f3: 
    unique_f1 = set(map(str.strip, f1)).difference(map(str.strip, chain(f2, f3))) 

如果你正在使用Python 2然后任选为了提高效率,进口itertools.imap并使用它,而不是map()上述假设的Python 3。

或者,你可能会喜欢把数据作为数字(我假定float这里,但你可以使用int代替):

from itertools import chain 

with open('file1') as f1, open('file2') as f2, open('file3') as f3: 
    unique_f1 = set(map(float, f1)).difference(map(float, chain(f2, f3))) 
+0

我明白你的观点,但我的代码比这更复杂。我只是不想粘贴所有这些,所以我更容易理解。最初,我打开了csv文件,从它们列出了列表,然后迭代第一个列表的每个元素并将其存储在结果列表中。然后,我将第一次迭代的结果列表作为第三个列表(文件),结果存储在另一个列表中,后来写入第四个(结果)csv文件。 – tiredsys

0

最简单的方法将每个文件读入set,然后使用Python(非常有效)集合运算来进行比较。

file1 = set() 
file2 = set() 

for element in firstfile: 
    file1.add(element) 

for element in secondfile: 
    file2.add(element) 

unique = file1 - file2 
+0

我试过这样的设置: 1.通过csv模块在Python中打开csv文件。 2.从这些文件中提取所有数据并将其转移到列表中。 3.从这些列表中进行设置。 4.试过你建议的结构(unique = file1 - file2)。 它有相同的效果,或者我应该尝试你的选择? – tiredsys

+0

这将工作正常。我只是用那个(低效率)构造,因为我不确定你是如何将文件读入内存的。 – Batman

0

很可能这个问题可能是first.csv严格ASCII文本,而second.csvthird.csv是ASCII文本,带有CRLF行结束符。我建议你将它们改为相同的格式(ASCII文本可能效果最好)。

$ file first.csv 
first.csv: ASCII text 

$ file second.csv 
second.csv: ASCII text, with CRLF line terminators 

$ file third.csv 
third.csv: ASCII text, with CRLF line terminators