Python write()无法写入完整内容,超2MB十六进制转文件故障排查
解决大文件十六进制数据转存不完整的问题
原代码一次性将整个十六进制字符串解码为字节对象并写入文件,当数据超过2MB时,内存占用过高会导致系统隐性截断数据,或因内存限制无法完整处理全部内容。
修改思路
通过分块处理十六进制数据,每次仅解码并写入一小部分内容,避免一次性加载全部数据到内存,从而支持大文件的处理。同时使用with语句自动管理文件资源,避免资源泄漏。
修改后的代码
import os def save_image(filename, hex_imgdata, chunk_size=4096): # 用with语句自动处理文件打开/关闭,无需手动调用close mode = "wb" if os.path.exists(filename) else "xb" with open(filename, mode) as current_file: # 分块遍历十六进制字符串,每次处理chunk_size长度的片段 for i in range(0, len(hex_imgdata), chunk_size): chunk = hex_imgdata[i:i+chunk_size] # 确保十六进制片段为偶数长度,避免bytes.fromhex报错 if len(chunk) % 2 != 0: chunk = chunk[:-1] decoded_chunk = bytes.fromhex(chunk) current_file.write(decoded_chunk) print(f"Saved {filename}") example_hex = "A2C688B272" if not os.path.exists("extracted"): os.mkdir("extracted") os.chdir("extracted") save_image(filename="example.png", hex_imgdata=example_hex)
额外优化:从十六进制文件直接分块处理
如果你的十六进制数据是存储在文件中而非内存变量,建议直接分块读取文件处理,进一步降低内存占用:
import os def save_from_hex_file(hex_file_path, output_filename, chunk_size=4096): with open(hex_file_path, "r") as hex_file, open(output_filename, "wb") as out_file: while True: # 每次从十六进制文件读取chunk_size长度的内容 chunk = hex_file.read(chunk_size) if not chunk: break # 处理奇数长度的末尾块 if len(chunk) % 2 != 0: chunk += "0" decoded_chunk = bytes.fromhex(chunk) out_file.write(decoded_chunk) print(f"Saved {output_filename}") # 使用示例 # save_from_hex_file("large_file.hex", "extracted_large.png")
关键改进点
- 分块处理:每次仅处理固定长度的十六进制片段,大幅降低内存占用,避免大内存对象导致的截断问题。
with语句:自动管理文件生命周期,确保文件正确关闭,避免数据未刷新到磁盘。- 长度校验:处理十六进制片段的奇数长度情况,避免
bytes.fromhex抛出异常。
内容的提问来源于stack exchange,提问作者YupYupTRP
相关产品推荐
相关产品推荐

