Python程序写入输出文件至332KB后停止问题求助
问题分析与解决方案
咱们先拆解下你遇到的问题,核心是代码逻辑出了问题,和flush()或者sleep()关系不大,具体来看:
最关键的逻辑错误:文件读取方式完全错误
你的代码里,在遍历file2的每一行g时,每次都打开file1,但只写了c = c.rstrip().split('\t')——这里不仅犯了变量名冲突(cc是打开的文件对象,你却用c来接收处理后的数据),更致命的是你根本没有遍历file1的所有行!
这意味着:每次循环g的时候,你只读取了file1的第一行,然后用这一行和当前的g做匹配。当file1的第一行和后续的g不再匹配时,就不会再往输出文件里写内容了,但遍历file2的循环还在继续运行——所以你会看到输出文件停在332KB,程序却还在空跑。
其他次要问题
'rU'是Python 2的过时模式,Python 3已经移除,建议用open("file2", 'r', newline='')来处理跨平台换行符;- 每次匹配成功都打开一次
output.txt再关闭,虽然功能没问题,但效率极低,应该把输出文件的打开放在最外层循环外面; - 没有异常处理,比如
int(c[0])如果遇到非数字内容会直接报错,不过这不是当前问题的核心。
修正后的代码思路
因为file2只有446KB,很小,建议先把它的内容加载到内存(比如字典),再遍历大文件file1做匹配,这样避免重复打开大文件,效率会高很多:
# 先预处理file2,把数据存到字典里方便快速匹配 file2_map = {} with open("file2", 'r', newline='') as gg: for g in gg: g_parts = g.rstrip().split('\t') # 用g[0]作为键,存下需要对比的范围和完整行数据 g_id = int(g_parts[0]) file2_map[g_id] = (int(g_parts[2]), int(g_parts[3]), g_parts) # 遍历file1,匹配后写入输出文件 with open("file1", 'r', newline='') as cc, open('output.txt', 'w') as ii: for c_line in cc: c_parts = c_line.rstrip().split('\t') try: c_id = int(c_parts[0]) c_val = int(c_parts[1]) except ValueError: # 遇到非数字行直接跳过,避免报错中断 continue # 检查是否有匹配的ID,再判断范围 if c_id in file2_map: g_min, g_max, g_full = file2_map[c_id] if g_min <= c_val <= g_max: ii.write(f"{c_parts[1]}\t{'\t'.join(g_full)}\n") # with块结束会自动刷新缓冲区并关闭文件,不需要手动flush
关于sleep()的疑问
完全不需要用sleep()!你的问题不是程序被阻塞或者需要等待IO,而是代码逻辑错误导致后续没有匹配的内容写入,程序只是在空跑遍历file2的剩余行而已。
内容的提问来源于stack exchange,提问作者user3698773
相关产品推荐
相关产品推荐

