Python读取tar文件调用readlines()报StreamError:不允许向后寻址,是什么问题?
问题根因
- 你使用的
tarfile.open参数mode="r|gz"属于流式只读压缩模式,该模式仅支持顺序向前读取数据,不支持任何向后寻址(seek)操作,设计初衷是处理管道、网络流这类无法随机访问的输入源。 - 直接调用
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
相关产品推荐
相关产品推荐

