Найти - Пользователи
Полная версия: Проблема с кодировкой
Начало » Python для новичков » Проблема с кодировкой
1
Gradient
Здравствуйте все! У меня питон 3.0.1.

Задача такая: есть файл. Из него надо прочитать символы как utf-8.

Написал такое:
def LoadFile():
f = io.open('myfile', 'r', 16384, 'utf8')
res = f.read()
f.close()
return res
Этот код “падает” на f.close()
c “UnicodeEncodeError: ‘charmap’ codec can't encode character ‘\u3826’ in position 568: character maps to <undefined>”
При том, что содержимое писалось точно в utf-8.

Как это забороть и получить-таки строку? Как вообще лучше парсить файл, в котором может быть несколько кодировок? По байтам? Можно пример для третьего питона: как извлечь b'345' из b'123456'?
Андрей Светлов
Что-то напутал. Примерчик рабочий, а вот myfile наверное все же не в utf8. И почему ‘charmap’ codec? Глянь f.encoding, должен быть ‘utf8’.

>>> b'123456'
b'456'

Но наверное на самом деле нужно что-то другое.

Как файл может быть одновременно в разных кодировках? Как определить, где какая?
Как-то все сумбурно…
Gradient
Ну да, это критерий новичка, когда он где-то увидел код, запихнул к себе, а у него не компилируется и он не знает, что с этим делать. Я пока в такой стадии с питоном. Поэтому сумбурно :-)

Я набросал пример, который иллюстрирует ситуацию более подробно:
import io
import urllib.request

def Page2File(URL, FileName):
f = io.open(FileName, 'wb')
f.write(urllib.request.urlopen(urllib.request.Request(URL)).read())
f.close()

def File2Bytes(FileName):
f = io.open('_tmp.tmp', 'rb')
try:
res = f.read()
f.close()
finally:
res = res
return res

# === Main ===============================================================
Page2File('http://otvety.google.ru/otvety/', '_tmp.tmp')
page = File2Bytes('_tmp.tmp')
page = page.decode('utf8')
print(page)
У меня лично валится на decode. В принципе, можно прямо из bytes выдирать utf-строки и декодировать только их (я пока не пробовал, но ошибок быть не должно).
Но, может, у меня сам подход неправильный? Поправьте, кто может.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB