从标准输入读取二进制数据

43 投票
7 回答
42458 浏览
提问于 2025-04-15 22:48

在Python 2.6中,有办法以二进制数据的形式读取标准输入(stdin)吗?如果可以,应该怎么做呢?

我在Python 3.1的文档中看到,这个操作相对简单,但在2.6版本中似乎没有这样的功能。

如果3.1中描述的方法不可用,有没有办法关闭标准输入,然后以二进制模式重新打开它呢?

为了更清楚,我是在MS-DOS的命令行中使用'type'命令,把一个二进制文件的内容传给我的Python代码。根据我的理解,这应该和Unix中的'cat'命令是一样的。但是当我测试的时候,得到的字节数总是比预期的文件大小少一个字节。


我选择使用Java/JAR/Jython的原因是因为我主要用的一个外部库只以Java JAR的形式提供。不过不幸的是,我一开始是用Python来做的。早些时候把我的代码转换成Java可能会更简单,但因为这些东西本来应该是兼容的,所以我想试试看,证明这也是可以做到的。

如果有人在想,这个问题也和我几天前问的这个问题有关。

其中一些内容在这个问题中得到了回答。

所以我会尝试更新我的原始问题,加入一些我到目前为止所发现的内容。

7 个回答

24

下面是一个最终版本的代码,适用于Linux和Windows系统,可以在Python 2和3中使用,能够从标准输入读取数据而不会出现损坏:

import sys

PY3K = sys.version_info >= (3, 0)

if PY3K:
    source = sys.stdin.buffer
else:
    # Python 2 on Windows opens sys.stdin in text mode, and
    # binary data that read from it becomes corrupted on \r\n
    if sys.platform == "win32":
        # set sys.stdin to binary mode
        import os, msvcrt
        msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)
    source = sys.stdin

b = source.read()
30

根据文档(可以在这里查看):

标准输入输出流默认是以文本模式工作。如果你想读写二进制数据,就需要使用底层的二进制缓冲区。举个例子,如果你想把字节写入标准输出,可以用 sys.stdout.buffer.write(b'abc')

不过,正如被接受的回答所提到的,使用 -u 参数来启动 Python 也是一个选择,这样可以强制标准输入、标准输出和标准错误输出完全不使用缓冲。具体细节可以查看 python(1) 的手册。

想了解更多关于文本缓冲的信息,可以查看关于 io 的文档,并可以通过 sys.stdin.detach() 在 Python 中禁用缓冲。

15

使用 -u 命令行选项 可以强制 Python 2 将标准输入、标准输出和标准错误视为二进制无缓冲流。

C:> type mydoc.txt | python.exe -u myscript.py

撰写回答