как конвертировать из юникода в utf8 в python?

Я работаю над своим скриптом Python для извлечения данных из базы данных sqlite3 для медиа-приложения xbmc.

Я вижу, что в моем коде он будет извлекать данные, используя объект unicode, где у меня будут строки (u', u и L.

Я хочу преобразовать его обратно в обычные строки из объекта unicode в utf8.

Вот код:

programs = None
daysLimit = 14
start = datetime.datetime.now()
end = start + datetime.timedelta(days = daysLimit)
cur.execute('SELECT channel, title, start_date, stop_date FROM programs WHERE channel')
programs = cur.fetchall()

print(programs)
cur.close()

Вот лог xbmc:

03:49:03 T:3628  NOTICE: [(u'101 ABC FAMILY ', u'The Middle -  The Ditch',
20140520170000L, 20140520173000L), (u'101 ABC FAMILY ', u'The Goonies', 
20140520173000L, 20140520200000L), (u'101 ABC FAMILY ', u'Pirates of the Caribbean: On Stranger Tides', 
20140520200000L, 20140520230000L), (u'101 ABC FAMILY ', u'The 700 Club', 
20140520230000L, 20140521000000L), (u'101 ABC FAMILY ', u'The Fresh Prince of Bel-Air -  Day Damn One', 
20140521000000L, 20140521003000L), (u'101 ABC FAMILY ', u'The Fresh Prince of Bel-Air -  Lucky Charm', 
20140521003000L, 20140521010000L), (u'101 ABC FAMILY ', u'The Fresh Prince of Bel-Air -  The Ethnic Tip', 
20140521010000L, 20140521013000L), (u'101 ABC FAMILY ', u'The Fresh Prince of Bel-Air -  The Young and the Restless', 
20140521013000L, 20140521020000L), (u'101 ABC FAMILY ', u'Summer Sexy With T25!', 
20140521020000L, 20140521023000L), (u'101 ABC FAMILY ', u'Paid Programming', 
20140521023000L, 20140521030000L)

Я хочу игнорировать строки (u', u и L, поэтому я хочу, чтобы это выглядело так:

'101 ABC FAMILY ', 'The Middle -  The Ditch', 20140520170000, 20140520173000, 
'101 ABC FAMILY ', 'The Goonies', 20140520173000, 20140520200000, 
'101 ABC FAMILY ', 'Pirates of the Caribbean: On Stranger Tides', 20140520200000, 20140520230000, 
'101 ABC FAMILY ', 'The 700 Club', 20140520230000, 20140521000000, 
'101 ABC FAMILY ', 'The Fresh Prince of Bel-Air -  Day Damn One', 20140521000000, 20140521003000,
and so on...

Не могли бы вы рассказать мне, как я могу преобразовать объект unicode в utf8, используя версию python 2.6?


person Community    schedule 17.06.2014    source источник
comment
Вы имеете в виду «байтовые строки, закодированные в UTF-8». Строки Unicode на самом деле являются обычными строками.   -  person Martijn Pieters    schedule 17.06.2014


Ответы (2)


Ваша проблема в том, что вы пытаетесь отобразить данные, ВМЕСТО, вы показываете представление Python, если этот объект.

Таким образом, он содержит метаданные, такие как u, L и т. д. Если вы хотите отображать данные так, как вы хотите, вы должны написать код для обработки этого.

Например:

for row in cur.fetchall():
    print u"'{row[0]}', '{row[1]}', '{row[2]}', '{row[3]}', '{row[4]}'".format(row=row)

Так это будет выглядеть

'1', '2', '3', '4'
'1', '2', '3', '4'
'1', '2', '3', '4'

Но... как я вижу, вы делаете структуру похожей на CSV-файл (значения, разделенные запятыми), не так ли? Итак, может быть, вам стоит прочитать о модуле csv python?

person dt0xff    schedule 17.06.2014
comment
большое спасибо, я вижу, что это работает прямо сейчас. Когда я пытаюсь использовать print row[0], row[1], row[2], row[3].format(row=row), я получаю сообщение об ошибке: AttributeError: «длинный» объект не имеет атрибута «формат». Есть идеи? - person ; 17.06.2014
comment
Вы должны использовать u"'{row[0]}', '{row[1]}', '{row[2]}', '{row[3]}', '{row[4]}'".format(row=row) - person dt0xff; 17.06.2014
comment
Логика такова: вы используете шаблон string для форматирования ваших данных, поэтому вы должны использовать строковый объект и вызывать для него метод format. - person dt0xff; 17.06.2014

  • Постфиксы L обозначают длинные целые числа. На самом деле это то же самое, что и (короткие) целые числа; действительно нет необходимости конвертировать их. Только их repr() вывод включает L; напечатать значение непосредственно или записать его в файл без постфикса L.

  • Значения Unicode можно закодировать в UTF-8 с помощью метода unicode.encode():

    encoded = unicodestr.encode('utf8')
    

Ваша говядина с представлением списка здесь; вы регистрируете все строки, а контейнеры Python представляют их содержимое, вызывая repr() для каждого значения. Эти представления отлично подходят для отладки, поскольку их типы очевидны.

Это зависит от того, что вы будете делать с этими значениями дальше. Как правило, рекомендуется использовать Unicode во всем коде и кодировать только в последний момент (при записи в файл, печати или отправке по сети). Многие методы обрабатывают это за вас. Например, при печати кодек вашего терминала автоматически кодируется. При добавлении в XML-файл большинство библиотек XML обрабатывают Unicode за вас. И т.п.

person Martijn Pieters    schedule 17.06.2014
comment
большое спасибо за это, так как я могу использовать encoded = unicodestr.encode('utf8') для работы с моим кодом? - person ; 17.06.2014
comment
@ user3667173: Да, вы можете кодировать значения Unicode в байты UTF-8. Просто убедитесь, что у вас нет вариантов получше, например, не кодировать вручную. - person Martijn Pieters; 17.06.2014