Получение правильной кодировки для строк и 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')