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

Python如何从stdin读取ZipFile对象且无需写入临时文件?

解决Python从标准输入读取Zip文件的问题

问题原因分析

  1. 直接使用sys.stdin失败:sys.stdin默认是文本模式的不可seek流,而zipfile.ZipFile需要支持随机访问(seek操作)的文件对象——因为Zip格式的目录信息存储在文件末尾,需要跳转读取。
  2. 使用io.StringIO失败:StringIO用于处理文本数据,而Zip(包括xlsx)是二进制格式,用文本模式读取会破坏二进制结构,导致被识别为无效Zip文件。

可行解决方案

不需要写入临时文件,只需将标准输入的二进制数据存入支持seek的内存缓冲区即可,代码如下:

import io
import sys
import zipfile

# 读取标准输入的二进制数据,存入可seek的BytesIO内存缓冲区
zip_buffer = io.BytesIO(sys.stdin.buffer.read())

# 基于BytesIO创建有效的ZipFile对象
with zipfile.ZipFile(zip_buffer, 'r') as zip_file:
    # 示例操作:打印压缩包内的所有文件路径
    print(zip_file.namelist())
    
    # 如需读取具体文件,比如xlsx的工作表内容
    # with zip_file.open('xl/worksheets/sheet1.xml') as sheet_file:
    #     content = sheet_file.read()
    #     print(content.decode('utf-8'))

关键说明

  • sys.stdin.buffer:获取标准输入的二进制流,避免文本编码转换损坏二进制数据。
  • io.BytesIO:在内存中创建二进制缓冲区,支持seek操作,完全满足ZipFile对文件对象的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 20:49:59