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

Python 2.7 - Compare two text files and write only the unique values from first file

我正在尝试执行以下操作。比较两个文本文件(Masterfile 和 usedfile)并将 Masterfile 的唯一值(两者都不常见)写入第三个文件(Newdata)。两个文件每一行都有一个词。示例:

主文件内容

Johnny
transfer
hello
kitty

使用的文件内容

transfer
hello

Newdata 中的预期输出

Johnny
kitty

我有两个解决方案,但都有问题

解决方案1:This 给出诸如 -,+ 之类的信息作为数据最终输出的前缀。

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. 实现最终结果的任何更好的解决方案

如果数据不是太大,您可以使用两个列表来包含这些行,并将一个列表的每个元素与另一个列表进行比较,例如:

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]

这是一种 shorthand 方法:

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 - 这是一种 shorthanded 循环遍历 Used_Data.txt 文件中的每一行并删除每行末尾的 \n 的方法,因此我们可以适当地比较单词。

#2 - 除了 Master_Data.txt 文件

之外,这与 #1 做同样的事情

#3 - 我遍历 Master_Data.txt 文件中的每一行

#4 - 我检查该行是否为 not in masterfile 数组是否也存在于 usedfile 数组中。

#5 - 如果 if 语句为真,那么我们正在检查的来自 Master_File.txt 的行不会出现在 Used_Data.txt 中,因此我们将其写入Ready_to_use.txt 文件使用调用 Newdata.write(line + '\n')。我们需要 '\n' 的原因是文件知道下次我们尝试写东西时开始一个新行。

使用解决方案 2:

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)