如何删除在python中file2中出现一次或多次的file1中的一行?

时间:2011-03-14 15:41:30

标签: python

我有两个文本文件: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     

4 个答案:

答案 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秒内完成它,它应该可以工作。

编辑:顺便说一下,文中的问题与标题有些不同。我试着在文中回答这个问题。