sqlite数据库支持unicode和longdate

时间:2014-07-15 20:01:55

标签: python python-2.7 sqlite

我正在使用我的python脚本从sqlite3数据库中提取数据。

当我尝试这段代码时:

#Pull the data from the database
c = con.cursor()
channelList = list()
channel_db = xbmc.translatePath(os.path.join('special://userdata/addon_data/script.tvguide', 'source.db'))

if os.path.exists(channel_db):
   c.execute('SELECT channel, title, start_date, stop_date FROM programs WHERE channel')
   for row in c:
       channel = row[0], row[1],row[2], row[3]
       channelList.append(channel)
       print channel
   c.close()

我将获取包含unicode u和长日期L的数据列表,如下所示:

20:52:01 T:5212  NOTICE: (u'101 ABC FAMILY ', u'Reba -  Location, Location, Location', 20140522133000L, 20140522140000L)
20:52:01 T:5212  NOTICE: (u'101 ABC FAMILY ', u'Reba -  Your Place or Mine', 20140522140000L, 20140522143000L)
20:52:01 T:5212  NOTICE: (u'101 ABC FAMILY ', u"Reba -  She's Leaving Home, Bye, Bye", 20140522143000L, 20140522150000L)
20:52:01 T:5212  NOTICE: (u'101 ABC FAMILY ', u'Boy Meets World -  No Such Thing as a Sure Thing', 20140522150000L, 20140522153000L)

我想打印没有uL字符串的数据。

请您告诉我如何在没有uL字符串的情况下打印数据?

1 个答案:

答案 0 :(得分:0)

问题是您正在打印tuple,其中的元素将使用__repr__而不是__str__打印。要以更自然的方式打印每个,请尝试:

print row[0], row[1], row[2], row[3]

示例说明:

>>> print u'Hello'
Hello
>>> print (u'Hello', u'World')
(u'Hello', u'World')
>>> print u'Hello', u'World'
Hello World

<强>加工

如果您有兴趣转换数据以使字符串不再是unicode,并且日期为int而不是long s,则可以执行以下操作:

>>> channel = row[0].encode('ascii'), row[1].encode('ascii'), int(row[2]), int(row[3])
>>> print channel
('101 ABC FAMILY ', 'Reba -  Location, Location, Location', 20140522133000, 20140522140000)

请注意,如果字符串包含非ascii字符,encoding to ascii将失败,方法是引发UnicodeDecodeError。将long投射到int永远不会引发异常,但如果数字太大而无法存储在long中,结果将只是另一个intMore about Python's long

文字工厂:

另一种选择是使用名为text_factory的sqlite3功能。在c.execute

之前执行此操作
con.text_factory = lambda x: x.encode('ascii')

检索任何文本列时会自动调用此方法。请注意,在这种情况下,如果文本无法正确解码,UnicodeDecodeError将被c.execute提升。