2014-06-24 2 views
-1

Я запрограммировал скрипт в Python 3, который генерирует CSV-файл, и он отлично работает с файлом .py с консоли или с IDE Pycharm. Кодировка выходного файла верна. Мои региональные настройки являются:неправильный код кодирования csv, сгенерированный скриптом py2exe

>>> locale.getpreferredencoding() 
'cp1252' 

Тогда я упаковал в исполняемый файл с py2exe в Win 7. Он работает, но выходной файл CSV имеет неправильную кодировку, это закодированные с UTF-8, и символы как á é í ó ú ñ не отображается правильно в Excel.

Код

with open('temp_gesfincas.csv', newline='') as infh, \ 
     open('output_gesfincas.csv', 'w', encoding='cp1252', newline='') as outfh: 
    reader = csv.reader(infh, delimiter=';') 
    writer = csv.DictWriter(outfh, fields, dialect='spanish') 
    writer.writeheader() 
    row = {} 
    for linea in reader: 
     print(linea) 
     key = linea[0] 
     try:  
      value = linea[1] 
     except IndexError: 
      value = '' 
      continue 
     if key in row: 
      writer.writerow(row) 
      row = {} 
     row[key] = value 
    if row: 
     writer.writerow(row) 
+0

Вы проверили файл с помощью Notepad ++? Может быть, причиной, по которой вы не можете найти эти символы, является ошибка Excel? Раньше я сталкивался с этой ситуацией. Проверьте байты в файле с помощью шестнадцатеричного плагина Notepad ++. – Alpay

+0

Можете ли вы показать нам фактический код, пожалуйста? Как вы открываете файл? 'open()' использует * системную кодировку по умолчанию *, если вы не укажете другой кодек. Можете ли вы также показать фактический результат, созданный в файле (желательно, открыв его как двоичный файл, а затем показывая нам 'repr()' нарушающих строк). –

+0

'' spanish ''не является допустимым аргументом для' dialect'. –

ответ

0

Решенный!

Прежде всего, я установил кодировку сценария на # -*- coding: cp1252 -*-. Сгенерированные символы изменились, но были неправильными.

Так как я прочитал это https://groups.google.com/forum/#!topic/pythonhispano/gV3kvSJY75k я изменил специальный комментарий строку:

# -*- coding: cp1252 -*- 

По этой другой линии:

# -*- coding: 850 -*- 

Почему? Ответ на себя:

Хотя Windows использует кодировку CP1252, как видно с:

>>> locale.getpreferredencoding() 
'cp1252' 

Консоль окон cmd использует cp850, как вы можете увидеть:

C:\Users\Trimax\Dev\Tests>chcp 
Active code page: 850 

Ну, в настройках .py, который должен использоваться для компиляции, вы можете установить консоль или параметр окна с именем файла вашего сценария, в зависимости от того, что вы (консольная программа или программа GUI). Если в файле setup.py указано значение «console», то используется кодировка 850, поэтому вы должны установить кодировку сценария в # -*- coding: 850 -*-

0

Я не уверен, кодировки py2exe опоры, но для правильной поддержки Юникода пакет кодировок должен быть включен в .exe.

Для этого необходимо включить опцию --packages encodings.

+0

По умолчанию py2exe включает в себя все пакеты кодирования, на самом деле есть библиотека /encodings/cp1251.pyc в библиотеке, упакованной с помощью .exe, и всех других файлов кодировок .pyc.Я подозреваю, что это относится к проблеме доступа к языковым настройкам. – Trimax

+0

Да, я вижу, что это больше не нужно. Я нашел этот пост, который может быть интересным http://www.py2exe.org/index.cgi/EvenMoreEncodings? – cchristelis

+0

Также смотрите http://www.py2exe.org/index.cgi/EncodingsAgain – cchristelis

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