Mac M1外接USB运行AB1转FASTA脚本报错求助
AB1转FASTA脚本在Mac M1外接USB运行报错的原因分析
问题背景
我在2020款Mac M1设备上,使用以下Python脚本将AB1文件转换为FASTA文件:
import os import sys from Bio import SeqIO # 获取当前目录下所有AB1文件 ab1_files = [f for f in os.listdir() if f.endswith('.ab1')] # 循环转换每个AB1文件为FASTA格式 for ab1_file in ab1_files: fasta_file = os.path.splitext(ab1_file)[0] + '.fasta' # 生成输出文件名 with open(ab1_file, 'rb') as ab1_handle, open(fasta_file, 'w') as fasta_handle: SeqIO.convert(ab1_handle, 'abi', fasta_handle, 'fasta') # 将所有FASTA文件合并为单个文件 all_fasta_file = 'all_sequences.fasta' with open(all_fasta_file, 'w') as all_fasta_handle: for ab1_file in ab1_files: fasta_file = os.path.splitext(ab1_file)[0] + '.fasta' header = '>' + ab1_file + '\n' with open(fasta_file, 'r') as fasta_handle: sequence = fasta_handle.read().strip() all_fasta_handle.write(header + sequence + '\n') os.remove(fasta_file) # 删除单个FASTA文件 print('所有AB1文件已转换为FASTA格式并合并到 ' + all_fasta_file)
脚本在本地磁盘运行完全正常,但将脚本保存到外接USB设备中运行时,出现如下错误:
Traceback (most recent call last): File "01_ab1_to_fasta.py", line 12, in <module> SeqIO.convert(ab1_handle, 'abi', fasta_handle, 'fasta') File "/Users/pmi12/Library/Python/3.8/lib/python/site-packages/Bio/SeqIO/__init__.py", line 1072, in convert records = parse(in_file, in_format) File "/Users/pmi12/Library/Python/3.8/lib/python/site-packages/Bio/SeqIO/__init__.py", line 605, in parse return iterator_generator(handle) File "/Users/pmi12/Library/Python/3.8/lib/python/site-packages/Bio/SeqIO/AbiIO.py", line 353, in __init__ super().__init__(source, mode="b", fmt="ABI") File "/Users/pmi12/Library/Python/3.8/lib/python/site-packages/Bio/SeqIO/Interfaces.py", line 63, in __init__ self.records = self.parse(self.stream) File "/Users/pmi12/Library/Python/3.8/lib/python/site-packages/Bio/SeqIO/AbiIO.py", line 364, in parse raise OSError(f"File should start ABIF, not {marker!r}") OSError: File should start ABIF, not b'\x00\x05\x16\x07'
已确认待转换的AB1文件无问题,以下是可能的原因及解决建议:
可能的原因
- 文件系统兼容性问题:Mac默认的APFS文件系统与外接USB常用的FAT32/NTFS格式存在差异,FAT32对二进制文件的存储处理逻辑不同,可能导致读取的文件起始字节偏移或损坏,无法识别
ABIF标识。 - USB读写缓存未同步:外接USB的读写速度远低于本地磁盘,脚本读取文件时可能遇到缓存未完全写入的情况,导致读取到不完整的文件起始字节。
- 文件复制损坏:将AB1文件复制到USB时,若传输过程中断或出现错误,会导致文件二进制内容损坏,虽然看起来文件正常,但实际起始标识已改变。
- 权限或访问限制:部分USB设备可能存在访问权限限制,导致Python读取文件时无法获取完整的二进制数据,只能读取到错误的字节流。
解决建议
验证文件完整性:使用哈希校验工具对比本地和USB上的AB1文件,确认文件未损坏。在终端执行:
# 本地文件哈希 shasum -a 256 /path/to/local/file.ab1 # USB文件哈希 shasum -a 256 /Volumes/USB_NAME/file.ab1如果哈希值不一致,说明文件复制过程中损坏,需重新复制。
格式化USB为APFS格式:备份USB数据后,用磁盘工具将其格式化为APFS(Mac原生格式),再测试脚本运行,避免文件系统兼容性问题。
先复制到本地再处理:修改脚本,先将USB上的AB1文件复制到本地临时目录,处理完成后再将结果复制回USB,避免直接读取USB文件:
import tempfile import shutil temp_dir = tempfile.mkdtemp() for ab1_file in ab1_files: local_ab1 = os.path.join(temp_dir, ab1_file) shutil.copy(ab1_file, local_ab1) # 后续处理使用local_ab1路径 fasta_file = os.path.splitext(local_ab1)[0] + '.fasta' with open(local_ab1, 'rb') as ab1_handle, open(fasta_file, 'w') as fasta_handle: SeqIO.convert(ab1_handle, 'abi', fasta_handle, 'fasta')添加文件验证步骤:在脚本中增加AB1文件起始标识的校验,提前过滤异常文件:
for ab1_file in ab1_files: with open(ab1_file, 'rb') as f: marker = f.read(4) if marker != b'ABIF': print(f"跳过异常文件:{ab1_file},起始标识为{marker}") continue # 执行转换逻辑 fasta_file = os.path.splitext(ab1_file)[0] + '.fasta' with open(ab1_file, 'rb') as ab1_handle, open(fasta_file, 'w') as fasta_handle: SeqIO.convert(ab1_handle, 'abi', fasta_handle, 'fasta')
内容的提问来源于stack exchange,提问作者Tyler Ruddenfort
相关产品推荐
相关产品推荐

