Получение правильной кодировки для строк и csv-файлов в Python
Я использую mechanize в Python, чтобы захватить некоторые данные с веб-сайта и отправить ему новые данные.
дело в том, что сайт на французском языке, поэтому я получаю вопросительные знаки в форме ромба (�) вместо различных символов, таких как ééààùùîî и других.
Я попытался посмотреть на Google и StackOverflow и нашел различные ответы, которые не исправили мою проблему. Я видел ответы, рекомендующие попробовать одну из следующих строк:
myString = éÀî
myString.encode('latin-1')
myString.encode('iso-8859-1')
unicode(myString, 'iso-8859-1')
но ни один из них, кажется, работать.
два случая, когда мне это нужно, когда я читаю csv-файл с акцентами и с жестко закодированными строками, содержащими акценты. Например, вот как выглядит строка в csv-файле (на самом деле'; ' является разделителем):
Adam Guérin;myemail@mail.com;555-5555;2011-02-05
" é "выглядит нормально, но когда я пытаюсь заполнить текстовое поле на веб-сайте с помощью mechanize и отправить его," é "теперь выглядит как" � " на фактическом веб-сайте.
Edit:
Это мой код для чтение данных в csv-файле:
subscriberReader = csv.reader(open(path, 'rb'), delimiter=';')
subscribers = []
for row in subscriberReader:
subscribers.append(Subscriber(row[0], row[1], row[2]))
затем я отправляю его на сайт с помощью mechanize:
self.br.select_form('aspnetForm')
self.br.form['fldEmail'] = subscriber.email
self.br.form['fldName'] = subscriber.name
self.br.form['fldPhoneNum'] = subscriber.phoneNum
self.br.submit()
Я пробовал различные способы кодирования символов, но я думаю, что я не делаю это правильно. Я буду рад попробовать все, что предлагается в ответах / комментариях.
что касается веб-сайта, он не указывает, какую кодировку он использует в заголовке.
1 ответов
во-первых, вы упомянули, что хотите поместить литералы в свой код. Для этого вам нужно указать Python, что кодировка файла скрипта. Вы делаете это с объявлением комментария в начале файла (я предполагаю, что вы используете latin-1
).
# -*- coding: latin-1 -*-
myString = u'éÀî'
во-вторых, вы должны иметь возможность работать со строкой. Это не специфично для механизации, но несколько основ должны быть полезны: во-первых, myString
в конечном итоге является объектом unicode (из-за того, как литерал был объявлено, с u''
). Итак, чтобы использовать его как кодировку Latin-1, вам нужно будет вызвать .encode()
, например:
with open('test.txt', 'w') as f:
f.write(myString.encode('latin-1'))
и, наконец, при чтении в строке, которая закодирована (скажем, с удаленного веб-сайта), вы можете использовать .decode()
декодировать его в объект unicode и работать с ним оттуда.
with open('test.txt', 'r') as f:
myString = f.read().decode('latin-1')