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

Python 2.7 bz2.decompress无法读取完整文件问题求助

解决Python 2.7读取SFTP上bz2文件仅获取部分内容的问题

看起来你遇到的核心问题是通过SFTP读取bz2文件时,没有完整读取全部内容,导致解压后只能得到前900KB的数据。结合你用的Python 2.7.14 Anaconda版本,以及跨Windows7/Red Hat都出现相同问题的情况,我来帮你拆解原因和解决方案:

问题根源

你当前的代码直接用f.read()读取SFTP文件对象,但SFTP的文件流和本地文件不同:当文件较大时,单次read()不一定能返回全部内容——这是SFTP协议的传输特性决定的,它会分批次传输数据,单次调用可能只拿到部分字节。不完整的bz2压缩数据自然只能解压出部分内容。

解决方案

方案1:循环读取完整的SFTP文件内容

把单次read()改成循环分块读取,直到文件流结束,确保拿到完整的压缩数据:

import bz2

# 假设client是已建立好的SFTP客户端连接
sftp = client.open_sftp()
with sftp.file(path, 'rb') as f:
    if ".bz2" in path:
        # 分块读取全部文件内容
        full_compressed_data = b''
        chunk_size = 4096  # 4KB块,可根据文件大小调整
        while True:
            chunk = f.read(chunk_size)
            if not chunk:  # 读到空字节串表示文件结束
                break
            full_compressed_data += chunk
        # 解压并处理内容
        decompressed_str = bz2.decompress(full_compressed_data).decode('utf-8')  # 按需解码为字符串
        s = decompressed_str.split("\n")
        # 后续处理s...

# 最后关闭客户端连接
client.close()

方案2:流式处理(更适合大文件)

如果你的bz2文件很大,一次性加载到内存会占用过多资源,可以用流式解压的方式,避免一次性读取全部数据:

import bz2
from io import BytesIO

sftp = client.open_sftp()
with sftp.file(path, 'rb') as f:
    if ".bz2" in path:
        # 先读取完整压缩数据到BytesIO(也可以换成循环分块读取)
        compressed_io = BytesIO()
        chunk_size = 4096
        while True:
            chunk = f.read(chunk_size)
            if not chunk:
                break
            compressed_io.write(chunk)
        compressed_io.seek(0)  # 重置文件指针到开头
        
        # 流式解压
        s = []
        with bz2.BZ2File(compressed_io, 'rb') as bz2_file:
            for line in bz2_file:
                # 按需解码并处理每行内容
                s.append(line.decode('utf-8').strip())
        # 后续处理s...

client.close()

额外检查点

  1. 验证原文件完整性:在SFTP服务器上用bzcat your_file.bz2命令测试解压,确认原文件没有损坏,能输出完整内容。
  2. 编码处理:Python 2.7中bz2.decompress返回的是字节串,记得根据文件实际编码(比如utf-8)解码为字符串,避免后续处理出现乱码或字节/字符串混淆问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:53:27