2009-07-31 49 views

Trả lời

31

Nếu bạn đang ở trên * nix, hãy thử chạy lệnh sau:

sort <file name> | uniq 
+10

Hoặc chỉ cần sắp xếp -u –

47

Trên Unix/Linux, sử dụng lệnh uniq, như mỗi câu trả lời David Locke, hoặc sort, theo bình luận William Pursell của.

Nếu bạn cần một kịch bản 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() 

Cập nhật: Sự kết hợp sort/uniq sẽ loại bỏ bản sao nhưng trả về một tập tin với các dòng được sắp xếp, mà có thể hoặc không thể là những gì bạn muốn. Kịch bản Python ở trên sẽ không sắp xếp lại các dòng, nhưng chỉ cần thả các bản sao. Tất nhiên, để có được kịch bản ở trên để sắp xếp là tốt, chỉ cần bỏ qua các outfile.write(line) và thay vào đó, ngay lập tức sau khi vòng lặp, làm outfile.writelines(sorted(lines_seen)).

+0

Bạn cần chạy sắp xếp trước khi bạn chạy uniq vì uniq sẽ chỉ xóa các dòng nếu chúng giống với dòng trước đó. –

+0

Có - Tôi đã đề cập đến câu trả lời của bạn nhưng không nhắc lại rằng đó là sắp xếp theo sau là uniq. –

+6

+1 cho giải pháp này. Một tăng cường hơn nữa có thể là lưu trữ tổng md5 của dòng và so sánh tổng md5 của dòng hiện tại. Điều này sẽ giảm đáng kể yêu cầu bộ nhớ. (xem http://docs.python.org/library/md5.html) – joeslice

13
uniqlines = set(open('/tmp/foo').readlines()) 

điều này sẽ cung cấp cho bạn danh sách các dòng duy nhất.

viết lại cho rằng một số tập tin sẽ được dễ dàng như:

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

bar.close() 
+2

Đúng, nhưng các dòng sẽ theo thứ tự ngẫu nhiên theo cách chúng băm. –

+4

vấn đề với các dòng không được sắp xếp là gì? về câu hỏi ở đây ... – marcell

+0

Sự cố với mã này là sau khi bạn viết và dòng cuối cùng không có '\ n'. Sau đó, kết quả đầu ra sẽ có một dòng với hai dòng được hợp nhất. – wmlynarski

4

có được tất cả các dòng của bạn trong danh sách và thực hiện một tập hợp các dòng và bạn đã làm xong. ví dụ,

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

và viết nội dung trở lại tập tin.

+0

Đúng, nhưng các dòng sẽ theo thứ tự ngẫu nhiên theo cách chúng băm. –

1

Đây là giải pháp của tôi

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() 
2

Python Một lót:

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

Bạn có thể làm:

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

đây Bạn đang sử dụng bash vào python :)

.210

Bạn cũng có cách khác:

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

nó một rehash của whats đã được nói ở đây - đây là những gì tôi sử dụng.

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() 
0

thêm vào câu trả lời @ David Locke, với hệ thống * nix bạn có thể chạy

sort -u messy_file.txt > clean_file.txt 

mà sẽ tạo clean_file.txt bản sao loại bỏ trong thứ tự chữ cái.

1

Nếu bất cứ ai đang tìm kiếm một giải pháp mà sử dụng một băm và là nhỉnh hơn một chút, đây là những gì tôi hiện đang sử dụng:

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)) 

Chức năng này là không hoàn toàn hiệu quả như băm được tính hai lần, tuy nhiên , Tôi khá chắc chắn giá trị được lưu vào bộ nhớ cache.

Các vấn đề liên quan