Python 2.7 - 比较两个文本文件并写入第一个文件中的唯一值

1 投票
3 回答
3847 浏览
提问于 2025-05-16 19:21

我正在尝试做以下事情。比较两个文本文件(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

有没有人能建议:

  1. 我该如何修正解决方案2,以便写入文件。
  2. 我可以使用difflib来完成这个任务吗?
  3. 有没有更好的方法来实现最终结果?

相关问题:

  • 暂无相关问题
暂无标签

3 个回答

0

使用方案二:

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)
0

如果数据量不大,你可以用两个列表来存储每一行,然后把一个列表里的每个元素和另一个列表里的元素进行比较,像这样:

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

好的,

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'的原因是为了让文件知道下次写东西时要换行。

撰写回答