我有一个SQLite3
db。我使用 SQLite浏览器和Python来处理这个数据库。我有一个列description
,它是tabe上的一个文本列。我使用 Sqlite3浏览器更改了一行中的文本。从那时起,我在python脚本中遇到错误。
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 36: ordinal not in range(128)
我已经尝试捕获此异常并打印行,我意识到,除了文本,还有对象缓冲区(这只是一个单元格),行中的其他单元格正常:
<read-write buffer ptr 0x047684B0, size 4307 at 0x04768490>
这是唯一具有此对象的单元格,我没有修改的单元格是unicode。
如何解决这个问题?有没有办法将缓冲区转换为数据库中的字符串?
编辑:python代码
with engine.connect() as connection:
for row in connection.execute('SELECT * FROM final_table'):
try:
if any(x in ' '.join(unicode(y) for y in row[:2]+row[3:4]+row[5:13]+row[14:]) for x in ('mm445','xxs', '998s54a')):
print row[:2]+row[3:4]+row[5:13]+row[14:]
for x in row:
print type(x)
except:
print 'exc'
print row[:2]+row[3:4]+row[5:13]+row[14:]
答案 0 :(得分:1)
您可以使用unicode()
将字节字符串从某些编码转换为Unicode,但除非您指定编码,否则Python会假定它是ASCII。
SQLite不使用ASCII而是使用UTF-8,所以你必须告诉Python它:
...join(unicode(y, 'UTF-8') for y in ...)