Python双文件逐行匹配写入时后续行匹配失效问题咨询
问题原因
- 文件对象属于单次遍历的迭代器类型,完成一次全量遍历后文件指针会停在文件末尾,后续再次执行遍历操作时会直接返回空,不会读取到任何内容。你的代码第一次遇到
N开头的行时,内层循环已经把openfileNPI对应的文件读完了,之后所有触发内层循环的逻辑都不会生效。 - 你提到的
FIN变量没有更新的问题,可以先排查对应D开头的行是否符合你预设的内容规则,但核心的匹配失效问题本质就是文件指针已到末尾的问题。
修复方案
优先选择把第二个文件的内容提前读入内存存储,避免反复IO操作,修改后代码如下:
File2Split = 'c:\\temp\\datafile\\comparionIP.txt' GetResident = 'c:\\temp\\datafile\\NPINumbers.txt' # 提前把NPI文件内容读入列表,后续多次遍历直接用列表 with open(GetResident,'r') as f: npi_lines = f.readlines() with open('c:\\temp\\datafile\\comparionIPmod.txt','w') as writefile, open(File2Split,'r') as openfile: FIN = '' for l in openfile: FirstChar = l[0:1] if FirstChar == 'D': FIN = l[21:31] if FIN.startswith('1'): writefile.write(l) elif FirstChar in ['F','G','C','R']: writefile.write(l) elif FirstChar == 'N': # 遍历内存中的列表,不会有指针问题 for l2 in npi_lines: FIN2 = l2[0:10] NPI = 'N' + l2[11:21] if FIN2 == FIN: writefile.write(NPI + '\n')
如果第二个文件体积特别大无法全部读入内存,可以在内层循环执行前调用openfileNPI.seek(0)把文件指针移回开头,注意这种方式会反复读取磁盘,性能较差:
elif FirstChar =='N': openfileNPI.seek(0) # 指针回到文件开头 for l2 in openfileNPI: FIN2 = l2[0:10] NPI = 'N' + l2[11:21] if FIN2 == FIN: writefile.write(NPI + '\n')
额外优化建议
如果NPI文件的匹配逻辑是精确匹配FIN2 == FIN,可以提前把NPI文件的内容处理成字典,匹配时间复杂度从O(n)降到O(1),性能提升非常明显:
# 提前构造字典,key是前10位匹配值,value是要写入的NPI字符串 npi_map = {} with open(GetResident,'r') as f: for line in f: key = line[0:10] npi_map[key] = 'N' + line[11:21] + '\n' # 匹配的时候直接查字典 elif FirstChar == 'N': if FIN in npi_map: writefile.write(npi_map[FIN])
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

