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

Python读取tar文件调用readlines()报StreamError:不允许向后寻址,是什么问题?

问题根因
  1. 你使用的tarfile.open参数mode="r|gz"属于流式只读压缩模式,该模式仅支持顺序向前读取数据,不支持任何向后寻址(seek)操作,设计初衷是处理管道、网络流这类无法随机访问的输入源。
  2. 直接调用tar_file.extractfile('inner.txt')时,如果inner.txt在压缩包内的存储位置不是当前流指针指向的位置,tarfile内部会尝试跳转指针到目标文件的起始偏移量,这个跳转操作在流式模式下被禁止,最终触发StreamError: seeking backwards is not allowed。
解决方案

根据你的使用场景选择对应修复方案即可:

  • 如果处理的是本地可随机访问的普通.tgz文件,直接把模式替换为r:gz即可,该模式支持随机寻址,无读取限制:
import tarfile

tar_file = tarfile.open('something.tgz', mode="r:gz")
txt_file = tar_file.extractfile('inner.txt')
lines = txt_file.readlines()    
txt_file.close()
tar_file.close()
  • 如果你确实需要使用流式处理(比如处理大体积压缩包不想全量加载、处理输入流数据),必须严格按照压缩包内文件的存储顺序读取,迭代遍历所有文件匹配到目标后直接读取即可:
import tarfile

tar_file = tarfile.open('something.tgz', mode="r|gz")
lines = []
for tar_info in tar_file:
    if tar_info.name == 'inner.txt':
        with tar_file.extractfile(tar_info) as txt_file:
            lines = txt_file.readlines()
        break
tar_file.close()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 20:45:03