2013-11-29 3 views
1

Я загружаю изображение из Интернета под Linux (debian) без проблем, используя нижеприведенный фрагмент кода. Когда я запускаю тот же самый код в окнах, результирующее изображение искажается. В чем проблема?urllib производит искаженный вывод под окнами?

import urllib, os 
url = "http://www.crummy.com/software/BeautifulSoup/10.1.jpg" 
contents = urllib.urlopen (url).read() 
fn = os.path.join(os.path.expanduser("~"), "winimagetest") 
fh = open(fn, "w");fh.write(contents);fh.close() 

Целевая система - Windows 7, 64 бит, а установка python - 32 бит. (Это не имеет значения, такой же искаженный вывод произойдет, если python - 64 бит).

Я загрузил искажен image:

+0

urllib устарел, я думаю. Вы должны проверить [запросы] (http://r.duckduckgo.com/l/?kh=-1&uddg=http%3A%2F%2Fdocs.python-requests.org%2Fen%2Flatest%2Findex.html). Не то чтобы это привело вас к источнику ошибки здесь, просто предложение. – JDong

+0

Моя первая попытка состояла в том, чтобы убедиться, что вы открываете файл для записи в двоичном формате, который, я считаю, ** не ** по умолчанию для окон. 'open (fn," wb ")' – sberry

+0

Какая тривиальная вещь Открытие бинарного решения проблемы. @sberry, не могли бы вы добавить свой ответ, чтобы я мог отметить это как решение? – erjoalgo

ответ

2

Для Windows, вам необходимо открыть файл в двоичном режиме, так как Windows, различает бинарные и текстовые файлы. Он работает на Linux как есть, потому что Linux не делает такого различия.

Изменение линии

fh = open(fn, "w") 

в

fh = open(fn, "wb") 

Вы также можете рассмотреть возможность сделать следующее:

with open(fn, "wb") as fh: 
    fh.write(contents) 

Как будет обрабатывать закрытие файла для вас в случае, любого типа исключения.

+0

Я изначально написал однострочный python (который не может включать в себя сложные операторы типа 'with'), поэтому я мог бы легко скопировать в windows cmd, но это оказалось слишком непроницаемым в вопросе, поэтому я разделяю каждую строку. Но спасибо за ваш ответ. – erjoalgo

Смежные вопросы