我怎样才能从文件中删除重复的行?
我有一个列的文件。 如何删除文件中的重复行?
在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
按字母顺序删除重复项。