python文件去重_python实现文件内容去重

python 实现文件内容去重

文本内容去重有很多很简单的方法可以实现,很多编辑器自带去除重复行的功能。写这篇文章的原因主要有两个

有的文本文件很大,超出了编译器能读取的范围

能有代码解决的代码解决,写好代码可以在其他代码中调用,更方便使用

简单的可以分为两种情况小文件和大文件,先来看小文件去重实现。如同把大象关冰箱一样分三步:

第一步,读取文件每一行,并处理掉换行符

第二步,将文件内容去重

第三步,写到新文件里(把冰箱门关上)

上代码

def file_remove_same(input_file, output_file):

"""

针对小文件去重

:param input_file: 输入文件

:param out_file: 去重后出文件

:return:

"""

with open(input_file, 'r', encoding='utf8') as f, open(output_file, 'a', encoding='utf8') as ff:

data = [item.strip() for item in f.readlines()] # 针对最后一行没有换行符,与其他它行重复的情况

new_data = list(set(data))

ff.writelines([item + '\n' for item in new_data if item]) # 针对去除文件中有多行空行的情况

对于大文件几十个G那种(更大的也别放在本地了,放数据库)就不能加载到内存中了,强行加载到内存中直接报内存错误

解决方案是:将文件按行读取,根据内容生成一个指纹(md5值或者其他唯一可识别的值),将指纹存集合中,当逐行读取的过程中判断集合中是否已经含有该行元素的指纹。如果指纹没有添加到集合中,则添加指纹到集合中并将此行追加输出到输出文件中。如果指纹已经在集合中了,说明此行与上面的某一行重复。

def gen_md5(data):

"""

生成md5

:param data: 字符串数据

:return:

"""

md5 = hashlib.md5()

md5.update(data.encode('utf-8'))

return md5.hexdigest()

def big_file_remove_same(input_file, output_file):

"""

针对大文件文件去重(将文件文件写在一行的,没有办法去重)

:param input_file:

:param output_file:

:return:

"""

finger_print_set = set()

with open(input_file, 'r', encoding='utf8') as f, open(output_file, 'w', encoding='utf8') as ff:

for line in f:

line_string = line.strip()

finger_print = gen_md5(line_string)

if finger_print not in finger_print_set:

finger_print_set.add(finger_print)

ff.write(line)

这样解决大小文件去重的问题

还有一种极端情况,就是指纹集合非常大,将内存占用溢出。这种情况几乎不会遇到,做一个大致的估计:当这个指纹集合内存占用到3G的时候,按照集合的占用效率大致是67%算,就能容纳2G的指纹,指纹按照md5值计算,就能容纳6710万行数据 。如果文件超过6710万行可以考虑采用数据库(redis)方案。数据库方案有空再补充吧

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,可以使用以下步骤来合并和去重根目录下的所有txt文件: 1. 遍历根目录下的所有文件,筛选出txt文件。 2. 打开每个txt文件,读取其中的内容。 3. 将每个文件中的内容添加到一个列表中。 4. 使用集合(set)数据结构对列表进行去重操作。 5. 将去重后的内容写入一个新的txt文件中。 以下是一个示例代码,用于实现这个功能: ```python import os root_dir = "根目录路径" output_file = "合并去重后的文件.txt" file_content_set = set() # 遍历根目录下的所有文件 for root, dirs, files in os.walk(root_dir): for file in files: # 筛选出txt文件 if file.endswith(".txt"): file_path = os.path.join(root, file) # 打开文件并读取内容 with open(file_path, "r", encoding="utf-8") as f: content = f.read() # 将内容添加到集合中 file_content_set.update(content.splitlines()) # 将去重后的内容写入新的txt文件 with open(output_file, "w", encoding="utf-8") as f: f.write("\n".join(file_content_set)) ``` 以上代码会遍历根目录下的所有txt文件,并将它们的内容合并并去重,最终将去重后的内容写入一个新的txt文件中。请根据实际情况修改代码中的根目录路径和输出文件名。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [python3.7.2下多个txt文件合并去重](https://download.csdn.net/download/qq_41650481/11007723)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [使用python文件夹里的所有表格合并且去重](https://blog.csdn.net/weixin_47970003/article/details/121792711)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值