2017-01-24 2 views
-1

У меня есть папка со многими текстовыми файлами, некоторые файлы имеют одинаковый точный контент для другого. Как я могу объединить только уникальный контент и игнорировать дубликаты? Я не удаляю повторяющиеся строки. Мои файлы как следующие:Как объединить несколько текстовых файлов уникальным образом в Python?

Текст file1:

Line1 
Line1 
Line3 

Текст file2:

Line1 
Line1 
Line3 

Текст file3:

text1 
Line2 
text3 

Результат:

Line1 
Line1 
Line3 
text1 
Line2 
text3 

Я попытался это, но это только объединить их все в один файл:

import glob 
txt_files = glob.glob('*.log') 
with open('merged_files.txt','w') as merged_files: 
    for f in txt_files: 
     for line in open(f,'r'): 
      merged_files.write(line) 

Как я могу прочитать все файлы и писать только уникальный контент в одном текстовом файле?

ответ

1

Для каждого файла журнала вычислите контрольную сумму и проверьте, не скопировали ли вы идентичный файл, проверив, находится ли контрольная сумма в наборе checksums. Если вы этого не сделали, добавьте контрольную сумму в набор и скопируйте файл, в противном случае перейдите к следующему файлу.

import glob 
import hashlib 

def get_sha1(file): 
    checksum = hashlib.sha1() 
    for chunk in iter(lambda: file.read(4096), b""): 
     checksum.update(chunk) 
    return checksum.hexdigest() 

def already_copied(file, checksums): 
    checksum = get_sha1(file) 
    if checksum not in checksums: 
     checksums.add(checksum) 
     return False 
    return True 

checksums = set() 
with open("merged_files.txt", "wb") as merged: 
    for file in glob.glob("*.log"): 
     with open(file, "rb") as file: 
      if already_copied(file, checksums): 
       continue 
      file.seek(0) # Return to the beginning of the file. 
      for line in file: 
       merged.write(line) 
0

Нам нужно больше узнать о ваших файлах. Если файлы маленькие, откройте каждый файл, поместите каждую строку в массив, сделайте их уникальными и напишите их.

Или вы можете поместить каждую строку в set и в конце получить значение и записать их в файл (set имеет только уникальные значения и отклоняет дубликат без повышения исключения).

Но если у вас есть файлы в ГБ, то есть гораздо больше, чем размер оперативной памяти компьютера, возможно, вам потребуется использовать структуру данных TRIE.

+0

У меня есть тысячи текстовых файлов размером около КБ. Как я уже сказал, я не хочу удалять повторяющуюся строку в самом файле. Я просто хочу игнорировать текстовый файл2, потому что в этом случае он имеет одинаковое содержимое Текстового файла1 и только файл writeText1. – Alsphere

0

попробовать этот код

import glob 

unique_set = set() 
txt_files = glob.glob('*.log') 
for f in txt_files: 
    for line in open(f,'r'):  
     unique_set.add(line) 

with open('merged_files.txt','w') as merged_files: 
    for line in unique_set: 
     merged_files.write(line) 

Но, как @ kawadhiya21 упоминалось выше, если у вас есть файлы гораздо большего размера, чем размер оперативной памяти компьютера, то, возможно, необходимо использовать структуру данных TRIE.

+0

хорошая попытка, но это не тот случай. – Alsphere