如何在python 3中将二进制数据写入stdout?

Iva*_*din 88 python python-3.x

在python 2.x中,我可以这样做:

import sys, array
a = array.array('B', range(100))
a.tofile(sys.stdout)
Run Code Online (Sandbox Code Playgroud)

然而,现在,我得到了一个TypeError: can't write bytes to text stream.我应该使用一些秘密编码吗?

Ben*_*son 144

更好的方法:

import sys
sys.stdout.buffer.write(b"some binary data")
Run Code Online (Sandbox Code Playgroud)

  • 即使源文件对象提供字节而不是字符串,使用`sys.stdout.buffer`也可以让你使用`shutil.copyfileobj`.+1 (3认同)
  • IDLE中的@DamianYerrick(至少在Windows中)“ pythonw.exe”运行IDLE,这意味着没有stdout。它是用tkinter模拟的。它实际上无法处理字节。在这种情况下,您可以使用`.decode('UTF-8',errors ='replace')`字符串,或者运行`python3 -I <filename>`以获取REPL而不是使用IDLE。 (3认同)
  • @VincentAlex ```sys.stdout.flush()``` (3认同)
  • 如果与“print(file=sys.stderr)”一起使用,则写入“stderr”时会打乱写入顺序。 (2认同)

Yaj*_*ajo 14

这样做的惯用方法(仅适用于 Python 3)是:

with os.fdopen(sys.stdout.fileno(), "wb", closefd=False) as stdout:
    stdout.write(b"my bytes object")
    stdout.flush()
Run Code Online (Sandbox Code Playgroud)

好的部分是它使用普通的文件对象接口,每个人在 Python 中都习惯了。

请注意,我设置closefd=Falsesys.stdout在退出with块时避免关闭。否则,您的程序将无法再打印到标准输出。但是,对于其他类型的文件描述符,您可能希望跳过该部分。

  • `sys.stdout.buffer` 处于二进制模式 (3认同)
  • 你为什么会冲水?让 Python 决定何时刷新 stdout 不是更好吗? (2认同)

Ale*_*lli 13

import os
os.write(1, a.tostring())
Run Code Online (Sandbox Code Playgroud)

或者,os.write(sys.stdout.fileno(), …)如果这比1你更可读.

  • `os.write`的问题是你必须检查返回值,因为它不能保证一切都会被写入. (5认同)