从标准输入读取二进制数据
在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()
15
使用 -u
命令行选项 可以强制 Python 2 将标准输入、标准输出和标准错误视为二进制无缓冲流。
C:> type mydoc.txt | python.exe -u myscript.py