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类型),正则表达式必须使用字节模式才能匹配:
- 修改正则表达式,添加
b前缀:
pattern = re.compile(b"^SE~\d{2}~\d{8}$")
- 确保
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
相关产品推荐
相关产品推荐

