【发布时间】:2018-12-11 22:32:41
【问题描述】:
我正在尝试从 MySQL RDB 创建数据的 CSV,以将其移至 Amazon Redshift。但是,其中一个字段包含描述,其中一些描述包含 ''' 字符或右单引号。在我运行代码之前,它会给我
UnicodeEncodeError: 'charmap' codec can't encode character '\x92' in position 62: character maps to <undefined>
然后我尝试使用 REPLACE 来尝试去掉正确的单引号。
db = pymysql.connect(host='host', port=3306, user="user", passwd="password", db="db", autocommit=True)
cur = db.cursor()
#cur.execute("call inv1_view_prod.`Email_agg`")
cur.execute("""select field_1,
field_2,
field_3,
field_4,
replace(field_4_desc,"’","") field_4_desc,
field_5,
field_6,
field_7
from table_name """)
emails = cur.fetchall()
with open('O:\file\path\to\file_name.csv','w') as fileout:
writer = csv.writer(fileout)
writer.writerows(emails)
time.sleep(1)
但是,这给了我错误:
UnicodeEncodeError: 'latin-1' codec can't encode character '\u2019' in position 132: ordinal not in range(256)
我注意到 132 是 SQL 语句中右单引号的位置,所以我相信代码本身可能有问题。我尝试在 REPLACE 语句中使用常规的直撇号而不是右单引号,但是这并没有替换字符并且仍然返回原始错误。有谁知道为什么它不接受单引号以及如何解决它?
【问题讨论】:
-
你为什么引用
cur.execute ("""。那可能只是读取cur.execute("cur.execute 字符串中的其他双引号也是不允许的(它会将它们视为字符串的结尾)。 -
数据库表是否有文本编码 Latin-1 但不知何故包含非拉丁-1 字符?
-
旁注:这段代码无论如何都会中断;
'O:\file\path\to\file_name.csv'实际上是(用尖括号命名的特殊字符以使其清楚)O:<form feed>ile\path<tab>o<form feed>ile_name.csv。这就是为什么您总是对 Windows 路径使用原始字符串,例如r'O:\file\path\to\file_name.csv'(注意r前面的公开报价)。你可能会在你的真实路径上逃脱它(如果没有目录或文件名以响应str文字转义的字符开头),但这纯粹是运气;始终使用原始字符串,这样您就不必依赖运气了。