【问题标题】:file.write() and sys.stdout.write() are giving me two different outputs - Pythonfile.write() 和 sys.stdout.write() 给了我两个不同的输出 - Python
【发布时间】:2011-01-25 04:37:37
【问题描述】:

以下代码获取 JPEG 图像并将其转换为字符串。然后将该字符串保存到image 变量中。然后,使用文件 IO 将字符串写入a.jpg,然后通过我将标准输出管道传输到文件写入b.jpg。

import thumb
import sys

x = thumb.Thumbnail('test.jpg')
x.generate(56, 56)

image = str(x)

with open('a.jpg', 'wb') as f:
    # saving to a.jpg
    f.write(image)

# saving to b.jpg
sys.stdout.write(image)

用法:

python blah.py > b.jpg

这会生成两个图像文件(a.jpg 和 b.jpg)。这些图像应该是相同的......但它们不是。

a.jpg
b.jpg

通过查看记事本中的每个图像,我可以看到,换行符不知何故被添加到 b.jpg 中。导致图像损坏。

为什么 a.jpg 与 b.jpg 不同?

【问题讨论】:

  • sys.stdout.mode 是'w',我想。参见,例如,stackoverflow.com/questions/2374427/…
  • 当您通过标准输出重定向时,您的 shell 可能正在解释您的输出。你在linux上吗?使用 bash?
  • @DSM:您应该将其发布为答案。
  • unix 倾向于使用标准输出在程序之间进行通信对于二进制数据来说是一个坏主意。请不要这样做。在不重定向到文件的情况下运行您的软件会弄乱终端等。请不要这样做。请!
  • @Lennart:它实际上是在写入我的网络浏览器。这是一个 CGI 脚本。我以 stdout 为例,因为它有同样的问题,而且描述起来更简单:}

标签: python file-io stdout


【解决方案1】:

您将数据以二进制形式写入a.jpg,而b.jpg 以文本模式写入。在二进制模式下,其他特殊字符(例如换行符或 EOF 标记)不被视为特殊字符,而在文本模式下则被视为特殊字符。

在 Python 3 中,您可以切换模式:

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


未经测试(Python 2):

import sys, os

binout = os.fdopen(sys.stdout.fileno(), 'wb')
binout.write(b'Binary#Data...')

【讨论】:

  • 在 pep8 下的导入位于不同的行
猜你喜欢
  • 2011-10-19
  • 2018-08-09
  • 2018-04-02
  • 2021-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-17
  • 2017-03-15
相关资源
最近更新 更多