35

是否可以在 Python 2.6 中将标准输入读取为二进制数据?如果是这样,怎么做?

我在Python 3.1 文档中看到这相当简单,但在 2.6 中执行此操作的工具似乎不存在。

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

为了清楚起见,我在 MS-DOS 外壳中使用“类型”将二进制文件的内容通过管道传输到我的 python 代码。据我了解,这应该相当于 Unix 的“cat”命令。但是当我对此进行测试时,我总是比预期的文件大小少一个字节。


我选择 Java/JAR/Jython 路线的原因是因为我的主要外部库之一只能作为 Java JAR 使用。但不幸的是,我是从 Python 开始的。不久前将我的代码转换为 Java 可能更容易,但由于这些东西都应该是兼容的,所以我想我会尝试通过它来证明它可以完成。

如果有人想知道,这也与我几天前问的这个问题有关。

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

因此,我将尝试用一些关于我到目前为止所知道的内容的注释来更新我的原始问题。

4

6 回答 6

28

从文档(见这里):

默认情况下,标准流处于文本模式。要向它们写入或读取二进制数据,请使用底层二进制缓冲区。例如,要将字节写入标准输出,请使用 sys.stdout.buffer.write(b'abc').

但是,正如在接受的答案中一样,使用 a 调用 python-u是另一种强制标准输入、标准输出和标准错误完全无缓冲的选项。有关详细信息,请参阅 python(1) 联机帮助页。

有关文本缓冲的更多信息,请参阅文档iosys.stdin.detach(),并用于从 Python 中禁用缓冲。

于 2011-01-31T10:26:47.067 回答
19

这是 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()
于 2016-08-14T05:05:49.467 回答
14

使用-u命令行开关强制 Python 2 将 stdin、stdout 和 stderr 视为二进制无缓冲流。

C:> type mydoc.txt | python.exe -u myscript.py
于 2010-05-17T19:06:33.267 回答
9

如果你仍然需要这个...这个简单的测试我用来读取包含 0x1A 字符的二进制文件

import os, sys, msvcrt

msvcrt.setmode (sys.stdin.fileno(), os.O_BINARY)
s = sys.stdin.read()
print len (s)

我的测试文件数据是:

0x23, 0x1A, 0x45

如果不将标准输入设置为二进制模式,此测试会在将 0x1A 视为 EOF 时立即打印 1。当然它只适用于 Windows,因为依赖于 msvcrt 模块。

于 2010-11-12T01:31:46.147 回答
2

您可以使用以下命令执行无缓冲读取:

os.read(0, bytes_to_read)

0 是标准输入的文件描述符

于 2019-04-15T17:36:21.783 回答
-3
import sys

data = sys.stdin.read(10) # Read 10 bytes from stdin

如果您需要解释二进制数据,请使用该struct模块。

于 2010-05-17T16:57:12.507 回答