【发布时间】:2016-02-20 21:53:07
【问题描述】:
在将 \u2013 等字符插入 SQLite 之前,我对它们进行 utf-8 编码。
当我用 SELECT 将它们拉出时,它们又回到了未编码的形式,所以如果我想对它们做任何事情,我需要重新编码它们。在这种情况下,我想将行写入 CSV。在将行写入 CSV 之前,我想首先将超链接添加到值以“http”开头的任何行。一些值将是整数、日期等,所以我执行以下 条件表达式 - 列表理解 组合:
row = ['=HYPERLINK("%s")' % cell if 'http' in str(cell) else cell for cell in row].
str() 操作会产生众所周知的:
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2013' in 位置 15:序数不在范围内 (128) 错误。
然后我需要再次执行.encode('utf-8') 编码,但仅限于列表中以字符串开头的那些元素。以下将不起作用(因为并非所有元素都是字符串):
['=HYPERLINK("%s")' % cell if 'http' in str(cell).encode('utf8') else cell.encode('utf8') for cell in row]
TLDR:如何扩展/修改列表推导以仅对字符串中的元素进行编码?
【问题讨论】:
-
"在将字符插入 SQLite 之前,我对 \u2013 之类的字符进行了 utf-8 编码。"不;这是一件愚蠢的事情,因为 SQLite 很乐意存储 Unicode。如果您必须进行转换,请尽可能靠近输出。
标签: python list unicode conditional list-comprehension