file.write()和sys.stdout.write()给了我两个不同的输出--Python

时间:2011-01-25 04:37:37

标签: python file-io stdout

下面的代码采用JPEG图像并将其转换为字符串。然后将该字符串保存到image变量中。然后,使用文件IO将字符串写入a.jpg,然后通过将stdout传送到文件,将其写入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不同?

1 个答案:

答案 0 :(得分:2)

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

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

  

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


未经测试(Python 2):

import sys, os

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