file.write()和sys.stdout.write()的输出不同 - Python
下面的代码会把一张JPEG格式的图片转换成一个字符串,然后把这个字符串保存在一个叫做image
的变量里。接着,这个字符串会通过文件操作写入到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)。这两张图片应该是完全一样的……但实际上并不是。
我通过在记事本中查看每张图片发现,b.jpg中不知怎么的多了换行符,这导致了图片损坏。
为什么a.jpg和b.jpg会不一样呢?
1 个回答
2
你把数据以二进制的方式写入了 a.jpg
,而 b.jpg
是以文本模式写入的。在二进制模式下,像换行符或文件结束标记这样的特殊字符不会被特别处理,而在文本模式下,它们会被当作特殊字符来对待。
在 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...')