2017-01-24 12 views
-1

多くのテキストファイルを含むフォルダがありますが、ファイルの一部は他のファイルと同じ内容です。一意のコンテンツだけをマージし、重複を無視するにはどうすればよいですか? 重複する行を削除しません。複数のテキストファイルのコンテンツをPythonで一意にマージするにはどうすればよいですか?

テキストファイル1:

Line1 
Line1 
Line3 

テキストファイル2:

Line1 
Line1 
Line3 

テキストファイル3:

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は一意の値のみを持ち、例外を発生させることなく重複を拒否します)。

GBのファイル、つまりコンピュータのRAMサイズをはるかに超えるファイルがある場合は、TRIEデータ構造を使用する必要があります。

+0

私は何千ものテキストファイルをKB単位で持っています。私が言ったように私はファイル自体に重複した行を削除したくない。テキストfile1の内容が同じで、この場合はwriteText file1だけなので、text2を無視したいだけです。 – 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) 

このコードを試してみてくださいしかし、あなたは、コンピュータのRAMサイズよりもはるかに大きいファイルがある場合に述べたkawadhiya21 @として、あなたがトライデータ構造を使用する必要があります。

+0

良いですが、これは当てはまりません。 – Alsphere

関連する問題