我怎样才能从文件中删除重复的行?

我有一个列的文件。 如何删除文件中的重复行?

在Unix / Linux上,根据David Locke的回答,按照William Pursell的评论,使用uniq命令。

如果你需要一个Python脚本:

 lines_seen = set() # holds lines already seen outfile = open(outfilename, "w") for line in open(infilename, "r"): if line not in lines_seen: # not a duplicate outfile.write(line) lines_seen.add(line) outfile.close() 

更新: sort / uniq组合将删除重复,但返回一个文件的行sorting,这可能是也可能不是你想要的。 上面的Python脚本不会重新sorting行,但只是删除重复。 当然,为了得到上面的脚本也要sorting,只是省略outfile.write(line) ,而是在循环之后立即执行outfile.writelines(sorted(lines_seen))

如果您使用的是* nix,请尝试运行以下命令:

 sort <file name> | uniq 
 uniqlines = set(open('/tmp/foo').readlines()) 

这会给你独特的线路列表。

把它写回某个文件就像下面这样简单:

 bar = open('/tmp/bar', 'w').writelines(set(uniqlines)) bar.close() 

这是什么在这里已经说了什么 – 这里我用什么。

 import optparse def removeDups(inputfile, outputfile): lines=open(inputfile, 'r').readlines() lines_set = set(lines) out=open(outputfile, 'w') for line in lines_set: out.write(line) def main(): parser = optparse.OptionParser('usage %prog ' +\ '-i <inputfile> -o <outputfile>') parser.add_option('-i', dest='inputfile', type='string', help='specify your input file') parser.add_option('-o', dest='outputfile', type='string', help='specify your output file') (options, args) = parser.parse_args() inputfile = options.inputfile outputfile = options.outputfile if (inputfile == None) or (outputfile == None): print parser.usage exit(1) else: removeDups(inputfile, outputfile) if __name__ == '__main__': main() 

在列表中获取所有的行并制作一系列的行,然后就完成了。 例如,

 >>> x = ["line1","line2","line3","line2","line1"] >>> list(set(x)) ['line3', 'line2', 'line1'] >>> 

并将内容写回文件。

Python一个衬里:

 python -c "import sys; lines = sys.stdin.readlines(); print ''.join(sorted(set(lines)))" < InputFile > OutputFile 

你可以做:

 import os os.system("awk '!x[$0]++' /path/to/file > /path/to/rem-dups") 

这里你正在使用bash进入python 🙂

你也有其他的方法:

 with open('/tmp/result.txt') as result: uniqlines = set(result.readlines()) with open('/tmp/rmdup.txt', 'w') as rmdup: rmdup.writelines(set(uniqlines)) 

如果有人正在寻找一种使用散列法的解决scheme,并且更加华丽一点,这就是我目前使用的:

 def remove_duplicate_lines(input_path, output_path): if os.path.isfile(output_path): raise OSError('File at {} (output file location) exists.'.format(output_path)) with open(input_path, 'r') as input_file, open(output_path, 'w') as output_file: seen_lines = set() def add_line(line): seen_lines.add(hash(line)) return line output_file.writelines((add_line(line) for line in input_file if hash(line) not in seen_lines)) 

这个函数不是完全有效的,因为哈希计算两次,但是,我很确定这个值被caching。

这是我的解决scheme

 if __name__ == '__main__': f = open('temp.txt','w+') flag = False with open('file.txt') as fp: for line in fp: for temp in f: if temp == line: flag = True print('Found Match') break if flag == False: f.write(line) elif flag == True: flag = False f.seek(0) f.close() 

添加到@David Locke的答案,您可以运行* nix系统

 sort -u messy_file.txt > clean_file.txt 

这将创buildclean_file.txt按字母顺序删除重复项。