Python中如何正确读写bitstreams及现有写入代码问题排查
Python 持续bit流写入文件问题排查与正确实现
现有代码问题
- 重复打开文件:每次循环都重新调用
open(filename, "ab")创建新的文件句柄,频繁触发系统IO调用大幅降低性能,同时会导致文件句柄泄漏,运行时间过长会触发系统最大打开文件数限制报错。 - 无循环终止条件:
while True为死循环,当数据流读取结束时fd.read(8192)会返回空字节,代码不会识别该状态停止写入,会持续向文件写入空内容。 - 无文件回收逻辑:打开的文件对象未执行关闭操作,写入的数据可能滞留在操作系统缓存中未刷入磁盘,程序异常退出时易丢失数据。
- 追加模式逻辑隐患:若程序重复运行,新的流数据会直接追加到历史文件末尾,不符合大多数场景下写入全新文件的需求。
正确实现方案
基础修复版
解决核心逻辑问题,适配绝大多数场景:
fd = stream.open() filename = 'file.ts' # 提前打开文件,使用with上下文管理器自动处理文件关闭、缓存刷盘 with open(filename, "wb") as file_output: while True: data = fd.read(8192) # 读取到空字节代表流已经结束,终止循环 if not data: break file_output.write(data)
如果确实需要保留追加写入的逻辑,把open的模式从wb改为ab即可。
高可用增强版
适合长时间运行、流稳定性差的场景,增加异常捕获与手动刷盘控制:
import time fd = stream.open() filename = 'file.ts' write_chunk_count = 0 with open(filename, "wb") as file_output: try: while True: data = fd.read(8192) if not data: # 等待1秒重试,避免因为流暂时无数据误判结束 time.sleep(1) continue file_output.write(data) write_chunk_count += 1 # 每写10块数据主动刷一次盘,避免异常退出丢失过多数据 if write_chunk_count % 10 == 0: file_output.flush() except KeyboardInterrupt: # 处理手动终止的情况,正常退出 pass finally: fd.close()
内容的提问来源于stack exchange,提问作者OWGrant24
相关产品推荐
相关产品推荐

