我有两个文本文件:file1有40行,file2有130万行 我想比较file1中的每一行和file2。 如果file1中的一行在file2中出现一次或多次, 应从file2中删除此行(行),并将file2的其余行返回到第三个文件3。 我可以通过手动复制行来痛苦地从file2中删除file1中的一行, 在我的代码中表示为“unwanted_line”。有谁知道如何在python中执行此操作。 提前感谢你的帮助。 这是我的代码:
fname = open(raw_input('Enter input filename: ')) #file2
outfile = open('Value.txt','w')
unwanted_line = "222" #This is in file1
for line in fname.readlines():
if not unwanted_line in line:
# now remove unwanted_line from fname
data =line.strip("unwanted_line")
# write it to the output file
outfile.write(data)
print 'results written to:\n', os.getcwd()+'\Value.txt'
注:
这就是我为它工作的方式。我要感谢为解决方案做出贡献的所有人。我在这里提出你的想法。我使用了set(),其中file1与file2的交集(公共行)被删除,然后,file2中的唯一行返回到file3。它可能不是最优雅的方式,但它适用于我。我尊重你的每一个想法,有很棒的精彩,它让我觉得python是全世界唯一的编程语言。 谢谢你们。
def diff_lines(filenameA,filenameB):
fnameA = set(filenameA)
fnameB = set(filenameB)
data = []
#identify lines not common to both files
#diff_line = fnameB ^ fnameA
diff_line = fnameA.symmetric_difference(fnameB)
data = list(diff_line)
data.sort()
return data
答案 0 :(得分:2)
读取文件1;把这些行放到一个集合或字典中(如果你使用的是旧版本的Python,它必须是一个字典);现在浏览file2并为每一行说出if line not in things_seen_in_file_1: outfile.write(line)
之类的内容。
顺便提一下,在最近的Python版本中,你不应该打扰调用readlines
:一个打开的文件是一个迭代器,你可以说for line in open(filename2): ...
来处理文件的每一行。
答案 1 :(得分:2)
这是我的版本,但请注意,微小的变化可能导致行不被视为相同(如新行之前的一个空格)。
file1, file2, file3 = 'verysmalldict.txt', 'uk.txt', 'not_small.txt'
drop_these = set(open(file1))
with open(file3, 'w') as outfile:
outfile.write(''.join(line for line in open(file2) if line not in drop_these))
答案 2 :(得分:0)
with open(path1) as f1:
lines1 = set(f1)
with open(path2) as f2:
lines2 = tuple(f2)
lines3 = x for x in lines2 if x in lines1
lines2 = x for x in lines2 if x not in lines1
with open(path2, 'w') as f2:
f2.writelines(lines2)
with open(path3, 'w') as f3:
f3.writelines(lines3)
使用2个单独的陈述来关闭f2是个人偏好/设计选择的问题。
答案 3 :(得分:-1)
你可以做的是将file1完全加载到内存中(因为它很小)并检查file2中的每一行是否与file1中的一行匹配。如果没有,则将其写入文件三。有点像这样:
file1 = open('file1')
file2 = open('file2')
file3 = open('file3','w')
lines_from_file1 = []
# Read in all lines from file1
for line in file1:
lines_from_file1.append(line)
file1.close()
# Now iterate over lines of file2
for line2 in file2:
keep_this_line = True
for line1 in lines_from_file1:
if line1 == line2:
keep_this_line = False
break # break out of inner for loop
if keep_this_line:
# line from file2 is not in file1 so save it into file3
file3.write(line2)
file2.close()
file3.close()
也许不是最优雅的解决方案,但如果你不必在3秒内完成它,它应该可以工作。
编辑:顺便说一下,文中的问题与标题有些不同。我试着在文中回答这个问题。