Tôi có một tệp với một cột. Làm thế nào để xóa các dòng lặp đi lặp lại trong một tập tin?Làm cách nào để xóa các dòng trùng lặp khỏi một tệp?
Trả lời
Nếu bạn đang ở trên * nix, hãy thử chạy lệnh sau:
sort <file name> | uniq
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))
.
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 đó. –
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. –
+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
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()
Đúng, nhưng các dòng sẽ theo thứ tự ngẫu nhiên theo cách chúng băm. –
vấn đề với các dòng không được sắp xếp là gì? về câu hỏi ở đây ... – marcell
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
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.
Đúng, nhưng các dòng sẽ theo thứ tự ngẫu nhiên theo cách chúng băm. –
Đâ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()
Python Một lót:
python -c "import sys; lines = sys.stdin.readlines(); print ''.join(sorted(set(lines)))" <InputFile> OutputFile
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 :)
.210Bạ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))
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()
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.
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.
- 1. Xóa các dòng trùng lặp khỏi tệp văn bản?
- 2. công cụ unix để xóa các dòng trùng lặp khỏi một tệp
- 3. Làm cách nào để xóa các mục trùng lặp khỏi một mảng trong Perl?
- 4. Xóa trùng lặp khỏi TStringList
- 5. Làm cách nào để xóa các đối tượng trùng lặp khỏi hai ArrayLists riêng biệt?
- 6. Xóa các từ trùng lặp trong một dòng với sed
- 7. Xóa các ký tự trùng lặp khỏi chuỗi
- 8. Xóa các phần tử trùng lặp khỏi mảng trong Ruby
- 9. Xóa các khai báo CSS trùng lặp trên nhiều tệp
- 10. Xóa các hàng trùng lặp khỏi một tệp lớn trong Python
- 11. Hàng loạt để xóa các hàng trùng lặp khỏi tệp văn bản
- 12. Làm thế nào để xóa tất cả các bản ghi trùng lặp khỏi Bảng SQL?
- 13. Xóa các chuỗi trùng lặp khỏi danh sách
- 14. Cách xóa trùng lặp khỏi mã của tôi
- 15. Xóa các mục trùng lặp khỏi LEFT OUTER JOIN
- 16. Cách xóa hàng trùng lặp khỏi ma trận
- 17. Cách xóa hàng trùng lặp khỏi tuyên bố công đoàn
- 18. Xóa các hàng trùng lặp
- 19. Cách xóa tất cả các phiên bản của các giá trị trùng lặp khỏi một mảng
- 20. Cách hiệu quả nhất để xóa tất cả các hàng trùng lặp khỏi bảng?
- 21. Xóa các dòng có chứa từ khóa khỏi một tệp
- 22. Xóa các dòng X đầu tiên khỏi một tệp PHP
- 23. Làm cách nào để xóa thêm các dòng trống khỏi tệp XML?
- 24. làm thế nào để xóa các dòng trùng lặp trong một tập tin văn bản trong bash unix?
- 25. Làm cách nào để so sánh hai bảng và xóa các hàng trùng lặp trong SQL?
- 26. xóa bỏ trùng lặp khỏi chuỗi trong PHP
- 27. Làm cách nào để xóa các nút trùng lặp trong XQuery?
- 28. Cách xóa theo dõi tệp trùng lặp trong Git
- 29. Xóa di chuyển db trùng lặp khỏi kho git
- 30. Làm thế nào để xóa hoàn toàn trùng lặp hàng
Hoặc chỉ cần sắp xếp -u –