Python 2.7 - 比较两个文本文件并写入第一个文件中的唯一值
我正在尝试做以下事情。比较两个文本文件(Masterfile和usedfile),并将Masterfile中独有的值(即在两个文件中都没有的值)写入第三个文件(Newdata)。这两个文件每行都有一个单词。举个例子:
Masterfile的内容
Johnny
transfer
hello
kitty
usedfile的内容
transfer
hello
在Newdata中期望的输出
Johnny
kitty
我有两个解决方案,但都有问题。
解决方案1:这个方法的输出结果前面会有类似“-”或“+”的标记。
import difflib
with open(r'C:\Master_Data.txt','r') as masterfile:
with open(r'C:\Used_Data.txt','r') as usedfile:
with open(r'c:\Ready_to_use.txt','w+') as Newdata:
tempmaster = masterfile.readlines()
tempusedfile = usedfile.readlines()
d = difflib.Differ()
diff = d.compare(tempmaster,tempusedfile)
for line in diff:
Newdata.write(line)
解决方案2:我尝试使用集合(set),在使用打印语句时效果不错,但不知道怎么把结果写入文件。
with open(r'C:\Master_Data.txt','r') as masterfile:
with open(r'C:\Used_Data.txt','r') as usedfile:
with open(r'c:\Ready_to_use.txt','w+') as Newdata:
difference = set(masterfile).difference(set(usedfile))
print difference
有没有人能建议:
- 我该如何修正解决方案2,以便写入文件。
- 我可以使用difflib来完成这个任务吗?
- 有没有更好的方法来实现最终结果?
相关问题:
- 暂无相关问题
3 个回答
使用方案二:
with open(r'C:\Master_Data.txt','r') as masterfile:
with open(r'C:\Used_Data.txt','r') as usedfile:
difference = set(masterfile).difference(usedfile)
with open('Ready_to_use.txt', 'w') as file_out:
for line in difference:
file_out.write(line)
如果数据量不大,你可以用两个列表来存储每一行,然后把一个列表里的每个元素和另一个列表里的元素进行比较,像这样:
with open('test1.txt', 'r') as masterfile:
with open('test2.txt', 'r') as usedfile:
with open('test3.txt', 'w+') as Newdata:
mlines = masterfile.read().splitlines()
ulines = usedfile.read().splitlines()
for line in mlines:
if ulines.__contains__(line) == False:
Newdata.write(line + '\n')
for line1 in ulines:
if mlines.__contains__(line1) == False:
Newdata.write(line1 + '\n')
好的,
1) 你可以使用解决方案2来写入文件,只需添加以下内容:
difference = set(masterfile).difference(set(usedfile))
[Newdata.write(x) for x in difference]
这是一种简化的写法:
for x in difference:
Newdata.write(line)
不过,这样做只是把difference集合中的每个元素写入Newdata文件。如果你使用这种方法,确保你的difference数组里的值是正确的。
2) 我觉得没必要使用difflib,这个库对于做这么小的事情来说是多余的。
3) 这是我不使用任何库和简单比较语句来做的方式:
with open(r'Master_Data.txt','r') as masterdata:
with open(r'Used_Data.txt','r') as useddata:
with open(r'Ready_to_use.txt','w+') as Newdata:
usedfile = [ x.strip('\n') for x in list(useddata) ] #1
masterfile = [ x.strip('\n') for x in list(masterdata) ] #2
for line in masterfile: #3
if line not in usedfile: #4
Newdata.write(line + '\n') #5
下面是解释:
首先,我像你一样打开了所有文件,只是换了变量的名字。现在,我来讲讲我改动的地方。
#1 - 这是一个简化的方式,用来遍历Used_Data.txt文件中的每一行,并去掉每行末尾的\n,这样我们就能正确比较单词了。
#2 - 这和#1做的事情一样,只不过是针对Master_Data.txt文件。
#3 - 我遍历Master_Data.txt文件中的每一行。
#4 - 我检查这一行是否not in的同时也存在于usedfile数组中。
#5 - 如果if语句为真,那么我们正在检查的Master_File.txt中的这一行在Used_Data.txt中并不存在,所以我们用Newdata.write(line + '\n')把它写入Ready_to_use.txt文件。我们在后面加'\n'的原因是为了让文件知道下次写东西时要换行。