1

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

主文件内容

Johnny
transfer
hello
kitty

used文件内容

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 ,当我使用 print 语句但不知道如何写入文件时显示正常。

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

3 回答 3

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- 这#1Master_Data.txt文件的作用相同

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

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

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

于 2017-04-29T21:04:56.303 回答
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')
于 2017-04-29T21:04:20.787 回答
0

使用解决方案 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)
于 2018-03-13T15:52:05.173 回答