使用file.flush()后仍无法将结果写入TXT文件的技术求助
问题排查与解决方案
我来帮你梳理下代码里的问题,这几个点是导致你无法正常写入文件的核心原因:
1. 文件打开模式错误,每次循环都会清空文件
你在for循环内部用'w'模式打开文件,这个模式的行为是每次打开就会截断(清空)文件原有内容,然后写入当前的内容。也就是说,哪怕你循环处理了10个符合条件的 gaze 位置,最后文件里只会保留最后一个写入的内容——如果最后一次循环没有符合条件的位置,文件甚至会是空的。
2. 重复打开/关闭文件,效率低且易出问题
每次处理一个 gaze 位置就打开一次文件,哪怕调用了flush(),频繁的IO操作也可能导致系统缓存的写入延迟,而且这种写法本身就不符合最佳实践。
3. 潜在的类型错误(可能导致写入中断)
norm_gp_x和norm_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




