如何在Python中将Unicode转换为UTF-8?
我正在编写一个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...
你能告诉我如何在Python 2.6版本中将unicode对象转换为utf8吗?
2 个回答
L
这个后缀表示长整型数字。其实它和普通整型数字是一样的;你根本不需要去转换它们。只有在用repr()
函数输出的时候,才会看到这个L
;如果你直接打印这个值或者把它写入文件,L
这个后缀就不会出现了。Unicode值可以通过
unicode.encode()
方法转换成UTF-8格式:encoded = unicodestr.encode('utf8')
你所关心的是这里的列表表示方式;你记录了所有的行,而Python的容器通过对每个值调用repr()
来表示它们的内容。这种表示方式在调试时非常有用,因为它能清楚地显示出每个值的类型。
接下来你对这些值的处理方式很重要。一般来说,建议在代码中始终使用Unicode,只有在最后一步(比如写入文件、打印或者通过网络发送时)才进行编码。很多方法会为你处理这些事情。例如,打印时会自动转换成你的终端编码。当你添加内容到XML文件时,大多数XML库也会为你处理Unicode。等等。
你的问题是,你试图显示数据,但实际上你显示的是这个对象的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模块?