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

如何在Python中逐行读取大型.xz压缩文件?

解决Python 3.5读取大LZMA(.xz)文件时的编码错误问题

我来帮你搞定这个头疼的问题!你遇到的'ascii' codec can't decode byte...错误,本质原因是Python 3.5在以文本模式读取LZMA文件时,默认使用了ASCII编码,但你的纯文本文件里包含了非ASCII字符,导致解码失败。下面是具体的解决方案:

核心解决方案:指定正确的编码读取

直接使用lzma.open()时,通过encoding参数指定文件的实际编码(比如最常见的UTF-8),同时可以设置错误处理策略避免程序崩溃。

代码示例(文本模式推荐)

import lzma

# 替换为你的.xz文件路径,encoding根据文件实际编码调整
with lzma.open('large_dataset.xz', mode='rt', encoding='utf-8', errors='replace') as xz_file:
    for line in xz_file:
        # 这里写你的自定义数据集处理逻辑
        cleaned_line = line.strip()
        # 示例:将处理后的行存入数据集(伪代码)
        # your_dataset.append(cleaned_line)

参数说明:

  • mode='rt':以文本模式读取,返回的直接是字符串,省去手动解码的麻烦,适合处理文本内容。
  • encoding='utf-8':指定文件的编码格式,如果不确定文件编码,可以用chardet库检测(安装后用chardet.detect(line_bytes)获取编码)。
  • errors='replace':遇到无法解码的字符时,用�替换,保证程序继续运行;如果需要严格校验,可以换成errors='strict'(默认,会抛出错误)或errors='ignore'(忽略错误字符)。

备选方案:字节模式读取后手动解码

如果你更倾向于手动控制解码过程,可以用字节模式打开,再逐行解码:

import lzma

with lzma.open('large_dataset.xz', mode='rb') as xz_file:
    for line_bytes in xz_file:
        try:
            # 按文件实际编码解码
            line = line_bytes.decode('utf-8')
            # 处理逻辑
            print(line.strip())
        except UnicodeDecodeError as e:
            # 自定义错误处理:比如跳过该行或记录错误
            print(f"解码失败,跳过该行: {e}")
            continue

为什么之前的方案无效?

大概率是你之前的代码没有指定encoding参数,Python 3.5会默认使用系统的默认编码(很多情况下是ASCII),而你的文件包含非ASCII字符,自然触发解码错误。只要明确指定正确的编码,逐行读取的逻辑是完全可行的——毕竟lzma.open()本身就支持迭代读取,不会一次性加载整个大文件到内存。

内容的提问来源于stack exchange,提问作者Andrej Hucko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:33:16