我试图解决从stdin开始读取一个压缩文件的问题,但我总是遇到问题.我想要的是能够运行cat test.xlsx | python3 test.py并创建一个有效的zipfile.ZipFile对象,如果可能的话,不需要首先编写一个临时文件.

我最初的做法是这样的,但ZipFile%的人抱怨文件找不到,


import sys
import zipfile

zipfile.ZipFile(sys.stdin)

所以我更改了它,但现在它抱怨这不是有效的压缩文件:

import io
import sys
import zipfile

zipfile.ZipFile(io.StringIO(sys.stdin.read()))

可以在不将压缩文件写入临时文件的情况下解决此问题吗?

推荐答案

ZIP文件是二进制数据,而不是UTF-8编码文本.如果不立即命中UnicodeDecodeError: 'utf-8' codec can't decode byte ...错误,您将无法将文件读入具有sys.stdin.read()str.

相反,您可以访问底层的二进制buffer对象,以将标准输入读取为原始bytes.将其与BytesIO配对,以获得内存中可查找的file-like对象:

zipfile.ZipFile(io.BytesIO(sys.stdin.buffer.read()))

或者,如果您提供了一个可查找的标准输入(例如,by redirecting stdin instead of streaming from a pipe),则可以直接对sys.stdin.buffer进行操作:

zipfile.ZipFile(sys.stdin.buffer)

配上一些类似的东西

python3 test.py <test.xlsx

如果您愿意,可以根据是否可以通过查询IO对象的seekable方法来查找标准输入,在两者之间进行 Select :

if sys.stdin.buffer.seekable():
    zip_file = zipfile.ZipFile(sys.stdin.buffer)
else:
    buffer = io.BytesIO(sys.stdin.buffer.read())
    zip_file = zipfile.ZipFile(buffer)

print(zip_file.filelist)

Python相关问答推荐

查找下一个值=实际值加上使用极点的50%

通过交换 node 对链接列表进行 Select 排序

Python中的负前瞻性regex遇到麻烦

Pythind 11无法弄清楚如何访问tuple元素

C#使用程序从Python中执行Exec文件

切片包括面具的第一个实例在内的眼镜的最佳方法是什么?

我想一列Panadas的Rashrame,这是一个URL,我保存为CSV,可以直接点击

使用Python从URL下载Excel文件

为什么numpy. vectorize调用vectorized函数的次数比vector中的元素要多?

在Python中使用if else或使用regex将二进制数据如111转换为001""

网格基于1.Y轴与2.x轴显示在matplotlib中

在输入行运行时停止代码

为什么我的sundaram筛这么低效

如何删除重复的文字翻拍?

Python Mercury离线安装

使用python playwright从 Select 子菜单中 Select 值

python的文件. truncate()意外地没有截断'

Python如何导入类的实例

为什么后跟inplace方法的`.rename(Columns={';b';:';b';},Copy=False)`没有更新原始数据帧?

如何在Quarto中的标题页之前创建序言页