向视频文件末尾写入字节后文件全零?求技术原因分析
问题描述
- 脚本功能:遍历目标目录下所有视频文件,在文件末尾追加一个
\0字节 - 小批量测试表现:可正常遍历文件,写入操作耗时极短,多次测试无异常
- 大规模运行异常场景:Mac OSX Ventura系统下,通过Paragon驱动访问8TB extFS格式USB3外接硬盘(约5000个视频文件)
- 单个文件处理耗时长达5-40秒
- 处理后视频无法打开,即使删除写入的
\0字节仍无法播放 - 十六进制编辑器查看发现整个文件被填充为0
- 脚本核心逻辑:以
ab模式打开文件,仅执行1次\0字节写入,无循环重复写入代码
脚本代码
import sys import glob exts = ["mkv", "mp4", "avi"] TestFile = sys.argv[1] Folders = glob.glob(TestFile+"/*/") Folders.sort(key=str.lower) for Folder in Folders: Files = [] Files = Files+[f for ext in exts for f in glob.glob(Folder+"/**/*."+ext)] Files.sort(key=str.lower) for File in Files: try: with open(File,'ab') as f: f.write(b"\0") except: continue
目标文件夹结构
ParentFolder Folder 1 File1.mp4 Folder2 File2.mkv ... ...
可能原因与解决方案
可能原因
- Paragon extFS驱动兼容性问题:Mac系统第三方extFS驱动对
ab模式的文件追加操作处理异常,错误地将文件覆盖为全0而非仅追加字节 - 外接硬盘缓存/写入策略异常:大文件量+外接硬盘的缓存机制冲突,导致写入操作被错误执行
- Python文件操作与驱动逻辑冲突:Python
open函数的ab模式行为,与Paragon驱动对extFS文件系统的处理逻辑不兼容
解决方案
更换文件系统访问方式
- 备份数据后,将硬盘格式化为Mac原生支持的APFS或HFS+格式再执行操作
- 或使用原生Linux系统挂载该extFS硬盘运行脚本,规避第三方驱动影响
修改文件写入逻辑
- 避免直接使用
ab模式,改用先读再写的方式(适合小文件,大文件谨慎使用):try: with open(File, 'rb') as f_in: content = f_in.read() with open(File, 'wb') as f_out: f_out.write(content + b"\0") except: continue - 或使用底层系统调用明确指定追加位置:
import os try: fd = os.open(File, os.O_WRONLY | os.O_APPEND) os.write(fd, b"\0") os.close(fd) except: continue
- 避免直接使用
添加操作校验逻辑
- 在写入前后校验文件大小,确认仅增加1字节,及时发现异常:
import os try: original_size = os.path.getsize(File) with open(File,'ab') as f: f.write(b"\0") new_size = os.path.getsize(File) if new_size != original_size + 1: print(f"异常文件:{File},原大小{original_size},新大小{new_size}") except: continue
- 在写入前后校验文件大小,确认仅增加1字节,及时发现异常:
内容的提问来源于stack exchange,提问作者Rodolfo Leo
相关产品推荐
相关产品推荐

