2013-07-16 2 views
0

Итак, у меня есть список некоторых ирландских слов (гэльских слов), которые я хочу использовать в unicode, чтобы RDFlib смог понять акценты над некоторыми из буквы в слове. Я не знаю, следует ли использовать юникод перед тем, как слова находятся в списке или после. Вот код, который я до сих пор:Как использовать юникод со списком или строкой в ​​Python

образец строки в файле = 00001740 n 3 eintiteas aonán beith 003 ~ 00001930 n 0000

def process_file(self): 
    self.file = open("testing_line_ir.txt", "r") 
    return self.file 

def line_for_loop(self, file): 
    for line in file: 
     self.myline = unicode(line, 'utf-8') 
     for line in self.myline: 
     ............here is where other processes are ran....... 

Это выдающий ошибку:

UnicodeDecodeError: 'utf8' codec can't decode byte 0xe1 in position 26: invalid continuation byte 

и я также попытался это:

def get_words_list(self, word_part, num_words): 
    self.word = word_part[3:3 + num_words:1] 
    self.myword = [unicode(i) for i in self.word] 
    return self.myword 

В этом случае слово «слово» - это список слов ['eintiteas', 'aonán', 'beith'], и я пробовал использовать g myword как закодированный список с той же ошибкой, что и выше.

EDIT: Вот исходный код, откуда происходит ошибка, это происходит на graph.parse линии Переменные, проходящие через как block1 и пространств имен просто строки текста

def compose_printout(self, namespaces, block1, block2, close_rdf): 
    self.printout += namespaces + block1 + block2 + close_rdf 
    self.tabfile = StringIO(self.printout) 
    return self.tabfile 

def serialize(self, graph, tabfile): 
    """ This will serialize with RDFLib """ 
    graph.parse(tabfile, publicID=None, format="xml") 

Некоторые из них слова добавляются в график RDFlib, поэтому любая помощь здесь будет большой!

+0

Вашего входа данные ** не ** кодируются UTF-8. Вам нужно найти правильный кодек, используемый для ваших файлов. –

ответ

-1

Вы могли бы попробовать этот код на заголовке файла

import sys 
reload(sys) 
sys.setdefaultencoding('utf8') 
+1

Это плохая идея по многим причинам. Изменение кодировки по умолчанию, используемой для принудительных строк Python, - это * не * решение. Реальное решение заключается в явном кодировании или декодировании, когда это необходимо. –

+1

Кроме того, OP уже * пытается явно декодировать, но использует неправильный кодек. Как настроить кодировку по умолчанию для UTF-8? –

1

У вас нет данных UTF-8. Из сообщения исключений я бы сказал, что у вас есть Latin-1 закодированных данные вместо:

>>> print '\xe1'.decode('latin1') 
á 

Вы можете использовать codecs.open() function создать объект файла, который возвращает данные файла готовым декодируются:

import codecs 

def process_file(self): 
    self.file = codecs.open("testing_line_ir.txt", "r", 'latin-1') 
    return self.file 

def line_for_loop(self, file): 
    for line in file: 
     # line is *already* unicode 
+0

теперь получаю эту ошибку: 'UnicodeEncodeError: кодек ascii не может кодировать символ u '\ xe1' в позиции 331: порядковый номер не в диапазоне (128)' – Johnnerz

+0

@Johnnerz: Вы смешиваете значения символа юникода и байта где-то. Не делайте этого, неявные принуждения между типами терпят неудачу уродливыми способами. –

+0

Как я могу узнать, где я это делаю? Это совершенно чуждо мне, я только начал питон 2 месяца назад! – Johnnerz