如何在Python中唯一合并多个文本文件内容?

时间:2017-01-24 15:43:27

标签: 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)

如何阅读所有文件并在单个文本文件中仅写入唯一内容?

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

我们需要更多关于您的文件。如果文件很小,打开每个文件,将每一行放在一个数组中,使它们唯一并写入。

或者您可以将每一行放在set中并在最后获取值并将其写入文件中(set仅具有唯一值并拒绝重复而不会引发异常)。

但是如果你有GB的文件,即远远超过计算机的RAM大小,你可能需要使用TRIE数据结构。

答案 2 :(得分: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所提到的,如果你的文件远远大于计算机的RAM大小,你可能需要使用TRIE数据结构。