如何使用Python根据一个文件的内容提取另一个文件的匹配行
现有代码问题原因
你运行后生成空文件的核心原因是:直接将File-A的纯贷款号行和File-B的完整业务行做集合交集匹配,二者字符串内容完全不一致,自然没有匹配结果。另外if loan in source的写法也存在逻辑问题,文件对象遍历一次后指针就会移动到末尾,重复遍历不会返回任何内容。
实现思路
- 第一步:读取File-A的所有贷款号,去除每行末尾的换行符和空白后存入
set结构,利用setO(1)的查找效率提升匹配速度,哪怕两个文件均为数十万行量级也不会卡顿。 - 第二步:逐行读取File-B,每行取第一个
~分隔符前的内容作为待匹配贷款号,判断是否在第一步的贷款号集合中。 - 第三步:将所有匹配到的File-B行直接写入结果文件,逐行读写的方式内存占用极低,不会受大文件体积限制。
可运行解决方案
import os os.chdir('C:\\Temp\\') # 配置对应文件名 loan_file = 'Loans.txt' source_file = 'Orig.txt' output_file = 'PulledLoans.txt' # 读取所有贷款号存入set loan_set = set() with open(loan_file, 'r', encoding='utf-8') as f: for line in f: # 去除换行、首尾空白,过滤空行 loan_no = line.strip() if loan_no: loan_set.add(loan_no) # 逐行匹配并写入结果 with open(source_file, 'r', encoding='utf-8') as src_f, open(output_file, 'w', encoding='utf-8') as out_f: for line in src_f: # 仅分割1次取贷款号,减少不必要的性能消耗 current_loan = line.split('~', 1)[0].strip() if current_loan in loan_set: out_f.write(line) print(f"匹配完成,结果已写入{output_file}")
优化点说明
- 用
set存储贷款号,比列表查找效率高数百倍,完全适配大文件处理场景 - 逐行读取File-B,不需要把整个文件加载到内存,哪怕File-B体积达到GB级别也能正常运行
- 仅做单次字符串分割取贷款号,进一步降低性能损耗
内容的提问来源于stack exchange,提问作者DataLore
相关产品推荐
相关产品推荐

