我有许多文本文件的文件夹,有些文件与其他文件具有完全相同的内容。如何合并唯一内容并忽略重复内容? 我不删除重复的行。我的文件如下:
文字文件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)
如何阅读所有文件并在单个文本文件中仅写入唯一内容?
答案 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数据结构。