2016-10-31 3 views
1

Сегодня я нашел сценарий, который помог моему сделать большую работу для изменения моего Gtk2 скрипты GTK3: https://git.gnome.org//browse/pygobject/tree/pygi-convert.shМожно читать только CSV файл с импортом GTK - Python - DictReader

Но также скрипт, который никогда не использовал Gtk остановился за работой. Только потому, что «import gtk» больше не был в скрипте.

Я попробовал теперь несколько вещей, чтобы заставить его работать без «импорта gtk», но не смог запустить его.

Почему gtk меняет мою кодировку?

Это CSV-файл загружен с EBay германии закодирован в изо-8859-15 '/ 'Latin'.

Я не понимаю, почему этот код работает только с импортом GTK:

#!/usr/bin/env python 
# -*- coding: utf8 -*- 
import gtk 
import csv 
import codecs 
csv_reader = csv.DictReader(codecs.open(CSV_FILE, "r", encoding='iso-8859-15'), delimiter=';') 
for row in csv_reader: 
    pass 

Без "импорта GTK":

Traceback (most recent call last): 
    File "import_csv_ebaysales.py", line 9, in <module> 
    for row in csv_reader: 
    File "/usr/lib/python2.7/csv.py", line 107, in next 
    self.fieldnames 
    File "/usr/lib/python2.7/csv.py", line 90, in fieldnames 
    self._fieldnames = self.reader.next() 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 45: ordinal not in range(128) 

Я использую Ubuntu 14,04

Основная проблема - это то, что я хочу использовать использовать DictReader и когда я использую без «импорта GTK» Я должен использовать ключи таким образом:

print row["Name des Käufers".decode("utf8").encode("latin")] 

Если я «импорт GTK» я могу использовать этот способ:

print row["Name des Käufers"] 

ответ

0

Там, кажется должен быть latin-1 закодированных символов в вашем файле. Изменение encoding='iso-8859-15' до encoding='latin-1' должно решить эту проблему.

+0

Я попытался это уже, если я изменить это я получаю: UnicodeDecodeError: «utf8» кодек не может декодировать байт 0xe4 в позиции 45: недопустимый продолжение байт – oxidworks

+0

К сожалению, это действительно не 'utf8 '. Вместо этого попробуйте 'latin-1'. – lucasnadalutti

+0

Затем я снова получаю: UnicodeEncodeError: кодек ascii не может кодировать символ u '\ xe4' в позиции 45: порядковый номер не в диапазоне (128). - Но я могу открыть без кодировки или использовать только open, если codecs.open. – oxidworks

1

Единственный способ получить его - преобразовать файл csv сначала в utf8.

#!/usr/bin/env python 
# -*- coding: utf8 -*- 

CSV_FILE = "EBAY_CSV/ebaycsvfile.csv" 
CSV_FILE_UTF8 = "/tmp/utf8_ebay_csvfile.csv" 

import csv 
import codecs 
with open(CSV_FILE) as infile: 
    with codecs.open(CSV_FILE_UTF8, "wb", encoding="utf8") as outfile: 
     inlines = [inline.decode("latin") for inline in infile.readlines()] 
     outfile.writelines(inlines) 

csv_reader = csv.DictReader(open(CSV_FILE_UTF8), delimiter=';') 
for row in csv_reader: 
    print row["Name des Käufers"] 
Смежные вопросы