You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用file.flush()后仍无法将结果写入TXT文件的技术求助

问题排查与解决方案

我来帮你梳理下代码里的问题,这几个点是导致你无法正常写入文件的核心原因:

1. 文件打开模式错误,每次循环都会清空文件

你在for循环内部用'w'模式打开文件,这个模式的行为是每次打开就会截断(清空)文件原有内容,然后写入当前的内容。也就是说,哪怕你循环处理了10个符合条件的 gaze 位置,最后文件里只会保留最后一个写入的内容——如果最后一次循环没有符合条件的位置,文件甚至会是空的。

2. 重复打开/关闭文件,效率低且易出问题

每次处理一个 gaze 位置就打开一次文件,哪怕调用了flush(),频繁的IO操作也可能导致系统缓存的写入延迟,而且这种写法本身就不符合最佳实践。

3. 潜在的类型错误(可能导致写入中断)

norm_gp_xnorm_gp_y大概率是数值类型(比如float),直接和字符串'['拼接会触发TypeError,如果你的代码没有异常捕获,程序会直接崩溃,自然也无法完成写入。


针对需求的两种解决方案

方案一:追加写入所有有效 gaze 位置(保留历史数据)

如果需要记录所有符合条件的位置,把文件打开移到循环外部,用'a'(追加)模式:

# some essential code to connect to the server
# 用追加模式打开文件,放在循环外避免重复IO操作
with open('/the/path/to/the/file.txt', 'a') as file:
    while True:
        try:
            # do some stuff
            try:
                gaze_positions = filtered_surface['gaze_on_srf']
                for gaze_pos in gaze_positions:
                    norm_gp_x, norm_gp_y = gaze_pos['norm_pos']
                    if 0 <= norm_gp_x <= 1 and 0 <= norm_gp_y <= 1:
                        # 用f-string安全转换数值为字符串,每行一个坐标
                        line = f'[{norm_gp_x}, {norm_gp_y}]\n'
                        file.write(line)
                        file.flush()  # 强制立即写入磁盘,避免缓存延迟
                # 补全你的print逻辑,比如打印最新的有效坐标
                # print(norm_gp_x, norm_gp_y)
            except KeyError:
                # 处理gaze_on_srf不存在的情况,避免程序崩溃
                continue
        except KeyboardInterrupt:
            # 捕获Ctrl+C中断,优雅退出
            print("程序已终止")
            break

方案二:每次覆盖文件,只保留最新一批有效位置

如果只需要保留当前循环内的所有有效位置,先收集数据再一次性写入:

# some essential code to connect to the server
while True:
    try:
        # do some stuff
        valid_positions = []
        try:
            gaze_positions = filtered_surface['gaze_on_srf']
            for gaze_pos in gaze_positions:
                norm_gp_x, norm_gp_y = gaze_pos['norm_pos']
                if 0 <= norm_gp_x <= 1 and 0 <= norm_gp_y <= 1:
                    valid_positions.append(f'[{norm_gp_x}, {norm_gp_y}]')
            
            # 收集完所有有效位置后,一次性写入覆盖文件
            with open('/the/path/to/the/file.txt', 'w') as file:
                file.write('\n'.join(valid_positions))
                file.flush()
            print(f"已写入 {len(valid_positions)} 个有效坐标")
        except KeyError:
            continue
    except KeyboardInterrupt:
        print("程序已终止")
        break

内容的提问来源于stack exchange,提问作者Unnamed

火山引擎 最新活动