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
谁能推荐一下
- 如何更正解决方案 2 以写入文件。
- 我可以使用 difflib 来完成任务吗
- 实现最终结果的任何更好的解决方案
如果数据不是太大,您可以使用两个列表来包含这些行,并将一个列表的每个元素与另一个列表进行比较,例如:
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)
我正在尝试执行以下操作。比较两个文本文件(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
谁能推荐一下
- 如何更正解决方案 2 以写入文件。
- 我可以使用 difflib 来完成任务吗
- 实现最终结果的任何更好的解决方案
如果数据不是太大,您可以使用两个列表来包含这些行,并将一个列表的每个元素与另一个列表进行比较,例如:
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)