Python 3.6技术问题:如何读取两个文本文件为集合并检查交集
解决两个文本文件找交集的Python方案
嘿,刚接触Python 3.6就能自己琢磨问题思路,已经超棒啦!咱们一步步把这个找交集的问题搞定,既保证正确性,又兼顾效率~
核心思路梳理
其实你的目标很明确:找出输入列表和黑名单里完全相同的行,然后生成新文件。这里关键是两点:
- 处理每行末尾的换行符(不然
"hello\n"和"hello"会被判定为不同) - 用高效的方式做存在性检查(避免低效的嵌套循环)
完整代码实现
我把代码拆成几个部分,每部分都给你解释清楚,方便你理解:
1. 读取黑名单并转成集合
# 打开黑名单文件,用集合存储内容(集合的查找速度远快于列表) with open('blacklist.txt', 'r', encoding='utf-8') as blacklist_file: # 用rstrip('\n')只去掉每行末尾的换行符,保留行内的空格等内容 blacklist_set = {line.rstrip('\n') for line in blacklist_file}
为什么用集合? 因为集合的in操作是O(1)常数时间,而列表的in是O(n)线性时间——如果黑名单有几千上万行,用集合能快好几倍!
2. 遍历输入列表,筛选交集
# 存储找到的交集内容 intersection_lines = [] with open('input_list.txt', 'r', encoding='utf-8') as input_file: for line in input_file: # 同样清理换行符,保证和黑名单的内容格式一致 cleaned_line = line.rstrip('\n') # 检查当前行是否在黑名单里 if cleaned_line in blacklist_set: intersection_lines.append(cleaned_line)
3. 将交集写入新文件
# 把结果写入新的文本文件 with open('intersection_result.txt', 'w', encoding='utf-8') as result_file: for line in intersection_lines: # 写入时记得加回换行符,让结果文件的格式和原文件一致 result_file.write(line + '\n')
新手注意事项
- 文件路径问题:如果你的文本文件和IDLE当前打开的脚本不在同一个文件夹里,要写完整的文件路径,比如Windows下的
C:/Users/你的用户名/Documents/blacklist.txt,或者macOS/Linux下的/Users/你的用户名/Documents/blacklist.txt - 编码问题:如果文件里有中文或其他非英文内容,记得加上
encoding='utf-8'参数,避免乱码 - 如果你的原始思路是嵌套循环:比如用两个列表互相遍历查找,这种写法虽然能跑,但效率极低,当文件大的时候会非常慢,换成集合就解决啦!
内容的提问来源于stack exchange,提问作者Rowan Collins
相关产品推荐
相关产品推荐

