file.write()和sys.stdout.write()的输出不同 - Python

2 投票
1 回答
1893 浏览
提问于 2025-04-16 10:34

下面的代码会把一张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)。这两张图片应该是完全一样的……但实际上并不是。

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...')

撰写回答