#python #unicode #utf-8 #xbmc
#python #юникод #utf-8 #xbmc
Вопрос:
Я работаю над своим скриптом 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?
Комментарии:
1. Вы имеете в виду «байтовые строки, закодированные в UTF-8». Строки Unicode — это обычные строки, на самом деле.
Ответ №1:
-
L
Постфиксы обозначают длинные целые числа. На самом деле это то же самое, что и (короткие) целые числа; на самом деле нет необходимости их конвертировать. Это только ихrepr()
выходные данные, которые включаютL
; напечатать значение напрямую или записать его в файл, аL
постфикс не включен. -
Значения Unicode могут быть закодированы в UTF-8 с
unicode.encode()
помощью метода:encoded = unicodestr.encode('utf8')
Ваша проблема связана с представлением списка здесь; вы зарегистрировали все строки, а контейнеры Python представляют их содержимое, вызывая repr()
каждое значение. Эти представления отлично подходят для отладки, поскольку их типы становятся очевидными.
Это зависит от того, что вы делаете с этими значениями дальше. Обычно рекомендуется использовать Unicode во всем коде и кодировать только в последний момент (при записи в файл, печати или отправке по сети). Многие методы справляются с этим за вас. Например, печать будет автоматически кодироваться в кодек вашего терминала. При добавлении в XML-файл большинство XML-библиотек обрабатывают Unicode за вас. И т.д.
Комментарии:
1. большое вам спасибо за это, так как я могу использовать
encoded = unicodestr.encode('utf8')
для работы с моим кодом?2. @user3667173: Да, вы можете кодировать значения Unicode в байты UTF-8 таким образом. Просто убедитесь, что у вас нет лучших вариантов , например, не кодировать вручную.
Ответ №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?
Комментарии:
1. большое вам спасибо, я вижу, что это работает прямо сейчас. Когда я пытаюсь использовать
print row[0], row[1], row[2], row[3].format(row=row)
, я получаю сообщение об ошибке: AttributeError: у объекта ‘long’ нет атрибута ‘format’. Есть идеи?2. Вы должны использовать
u"'{row[0]}', '{row[1]}', '{row[2]}', '{row[3]}', '{row[4]}'".format(row=row)
3. Логика такова: вы используете строковый шаблон для форматирования своих данных, поэтому вы должны использовать строковый объект и вызывать
format
для него метод.