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

Python大文件拆分:二进制读取与字符串匹配问题求助

问题解决方案

一、解决文本模式的UnicodeDecodeError

文件标注为ASCII但包含0x9b这类扩展ASCII字节(超出标准ASCII 0-127范围),文本模式默认用utf-8解码会失败。指定编码为latin-1(或iso-8859-1)即可读取所有字节,因为该编码会把每个字节直接映射为对应字符,不会报错:

with open(s3_dest, 'r', encoding='latin-1') as f:
    # 后续逻辑保持不变

二、二进制模式下的正则匹配

二进制模式读取的内容是字节串(bytes类型),正则表达式必须使用字节模式才能匹配:

  1. 修改正则表达式,添加b前缀:
pattern = re.compile(b"^SE~\d{2}~\d{8}$")
  1. 确保buffer是字节串类型(二进制模式下f.read(1)返回字节,拼接后自然是字节串),直接用pattern.match(buffer)即可匹配:
with open(s3_dest, 'rb') as f:
    topString = f.read(breakByte)  # topString为bytes类型
    offset = breakByte
    buffer = b''  # 初始化字节串缓冲区
    while True:
        c = f.read(1)
        offset += 1
        if not c: 
            break
        topString += c
        buffer += c
        if pattern.match(buffer):
            # 匹配到事务结尾,退出循环
            break
        # 分隔符比较见下文

三、二进制模式下的分隔符比较

二进制模式读取的c是单个字节(比如b'~'),需要将delimiter也定义为字节类型,直接比较即可,无需转字符串:

delimiter = b'~'  # 定义为字节类型
# 循环内直接比较
if c == delimiter:
    buffer = b''

两种模式的选择建议

  • 如果需要后续处理字符串,优先用指定latin-1编码的文本模式,避免字节/字符串转换的麻烦。
  • 如果文件可能包含非文本二进制内容,或追求更高性能,使用二进制模式,全程处理字节串即可。

内容的提问来源于stack exchange,提问作者Jason Michael

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 00:55:58