2013-04-04 3 views
1

Я использую Python Tools для Visual Studio и читаю некоторые файлы, написанные на итальянском языке. Пробовал iso-8859-1, iso-8859-2, utf-8, utf-8-sig. Notepad ++ открывает файл как UTF-8 без спецификации.Какую кодировку использовать для чтения итальянского текста в Python?

content = fp.read() 
words = content.decode("utf-8-sig").lower().split() 
for w in words: 
    p='' 
    cur.execute('SELECT word FROM multiwordnet.italian_lemma l, multiwordnet.italian_synset s where l.id = s.id and l.lemma="%s"' % w) 

Строка, которая приводит к аварии является C'è. (Getting читать "c\'\xe3\xa8")

Использование chardet не помогает

Traceback (most recent call last): 
File "C:\Users\Tathagata\Documents\Visual Studio 2012\Projects\PythonApplicati 
on4\PythonApplication4\PythonApplication4.py", line 344, in <module> 
createSynsetDict() 
File "C:\Users\Tathagata\Documents\Visual Studio 2012\Projects\PythonApplicati 
on4\PythonApplication4\PythonApplication4.py", line 294, in createSynsetDict 
cur.execute('SELECT word FROM multiwordnet.italian_lemma l, multiwordnet.it 
alian_synset s where l.id = s.id and l.lemma="%s"' % w) 
File "C:\Python27\lib\site-packages\pymysql\cursors.py", line 117, in execute 
self.errorhandler(self, exc, value) 
File "C:\Python27\lib\site-packages\pymysql\connections.py", line 187, in defa 
ulterrorhandler 
raise Error(errorclass, errorvalue) 
Error: (<type 'exceptions.UnicodeEncodeError'>, UnicodeEncodeError('ascii', u's\ 
x00\x00\x00\x03SELECT word FROM multiwordnet.italian_lemma l, multiwordnet.ital 
ian_synset s where l.id = s.id and l.lemma="c\'\xe3\xa8"', 116, 118, 'ordinal no 
t in range(128)')) 
+0

[Как остановить боль?] (HTTP: // nedbatchelder .com/text/unipain.html) –

+0

Какая привязка DB-API вы используете? (То есть, какой драйвер базы данных?) –

+1

... на самом деле, более того, что такое значение 'paramstyle' global в ваш модуль библиотеки базы данных? (Если вы не знаете, просто определите модуль, и мы сможем его найти). –

ответ

1

Предположив, что стиль вашей базы данных по связываемых переменных format ...

content = fp.read() 
words = content.decode("utf-8-sig").lower().split() 
for w in words: 
    p='' 
    cur.execute('SELECT word FROM ' + 
       'multiwordnet.italian_lemma l, ' + 
       'multiwordnet.italian_synset s ' + 
       'where l.id = s.id and l.lemma=%s', w) 

Обратите внимание, что мы не используем % оператор между строкой SQL и передаваемой переменной, и мы не помещаем внутренние кавычки вокруг %s; скорее, %s является заполнителем для определения того, где в SQL слово должно быть заменено, и мы передаем значение, которое будет заменено этим заполнителем в качестве отдельного аргумента. Следуя этой практике, вы не только не должны беспокоиться о проблемах с кодировкой (если ваш аргумент передается как строка Unicode Python, привязка базы данных отвечает за его оттуда), но также предотвращает уязвимости SQL injection.

Другие библиотеки баз данных для Python могут использовать разные стили заполнителя; прочитайте документацию или проверьте уровень paramstyle на уровне модуля для вашего. (Для qmark ваш заполнитель должен быть ?, ибо numeric это должно быть число двоеточие-приставкой (:1 для первого параметра, :2 для второго и т.д.)

+0

Большое спасибо за ответ. Я использую PyMySQL [https://github.com/petehunt/PyMySQL/] whic h имеет 'paramstyle = format', поэтому код продолжал работать до тех пор, пока не достигнет какого-либо слова со смешными символами. Если я использую '?', Поскольку вы предложили, чтобы он вызывал KeyError [http://pastebin.com/V7T6xbkY] даже для слов, которые можно было прочитать с помощью '% s'. – Tathagata

+1

@Tathagata Да - с 'format', вы должны использовать'% s' вместо '?', Но по-прежнему использовать запятую вместо '' 'оператора. Я обновляю ответ соответствующим образом. –

+0

@Tathagata ... кстати, в будущем, пожалуйста, избегайте ссылок pastebin.com; он полон ярких анимированных объявлений для тех, кто не использует Adblock. –

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