You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:00:25