file.write () и sys.stdout.write () дают мне два разных вывода - Python - PullRequest
2 голосов
/ 25 января 2011

Код ниже берет изображение JPEG и преобразует его в строку. Затем эта строка сохраняется в переменной image. Затем строка записывается в a.jpg с использованием File IO, а затем записывается в 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 голосов
/ 25 января 2011

Вы записываете свои данные в 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...')
...