You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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读取文件时无法获取完整的二进制数据,只能读取到错误的字节流。

解决建议

  1. 验证文件完整性:使用哈希校验工具对比本地和USB上的AB1文件,确认文件未损坏。在终端执行:

    # 本地文件哈希
    shasum -a 256 /path/to/local/file.ab1
    # USB文件哈希
    shasum -a 256 /Volumes/USB_NAME/file.ab1
    

    如果哈希值不一致,说明文件复制过程中损坏,需重新复制。

  2. 格式化USB为APFS格式:备份USB数据后,用磁盘工具将其格式化为APFS(Mac原生格式),再测试脚本运行,避免文件系统兼容性问题。

  3. 先复制到本地再处理:修改脚本,先将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')
    
  4. 添加文件验证步骤:在脚本中增加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 03:15:04