gpt4 book ai didi

python - 如何修复字符映射到未定义的 unicode 错误

转载 作者:行者123 更新时间:2023-11-29 05:54:19 26 4
gpt4 key购买 nike

我正在尝试从数据库中制作一些数据的 CSV,以便将其移动到数据仓库中的云端。然而,当我运行它时,它总是在 36,599 行后退出并给我

UnicodeEncodeError: 'charmap' codec can't encode character '\x92' in position 62: character maps to <undefined>

我发现导致问题的字符串是“Rejected-Case No. doesn't match”,我认为这是撇号的问题。我不知道为什么会导致此问题,并且无法找到解决方法。有谁知道如何解决这个问题?我使用的代码是:

db = pymysql.connect(host='host', port=3306, user="user", passwd="secret", 
db="db", autocommit=True)
cur = db.cursor()
#cur.execute("call inv1_view_prod.`Email_agg`")

cur.execute("""select fields from table""")


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)

最佳答案

由于您没有显示导致错误的代码,我只是猜测。

唯一的事实是这个字符串 'Rejected-Case No. doesn't match' 包含一个 "'" 这是 unicode 字符 U+2019,对单引号。在windows cp1252代码页中,这个字符确实有代码0x92

看起来您某处有一个以 cp1252 字符集编码的字节字符串,但尚未正确解码为 un​​icode 字符串。

应该做什么:

有解决办法。不幸的是,它们将取决于您使用的 Python 版本(2 或 3),并且在不知道任何代码的情况下我只能给出一般性建议:

  • 识别输入字符集(数据库提供给 Python 脚本的字符集)
  • 确定输出字符集(您要在 CSV 模块中写入的内容)
  • 使用显式转换能够传递正确的字符集
  • 可选择在编码/解码调用中使用 error=replace 以避免 UnicodeError 异常。

如果您使用 Python3,我会假设您在从数据库中解码 unicode 时遇到问题。右单引号具有 unicode 代码 U+2019,但在提供给 Python 的字符串中编码为 '\x92',这是 cp1252 字节编码。一个快速而肮脏的修复是强制编码/解码传递以获得正确的 unicode 字符串。您的代码可能会变成:

db = pymysql.connect(host='host', port=3306, user="user", passwd="secret", 
db="db", autocommit=True)
cur = db.cursor()
#cur.execute("call inv1_view_prod.`Email_agg`")

cur.execute("""select fields from table""")

charset = 'cp1252' # or 'utf8' depending on what you want in the csv file
with open('O:\file\path\to\File_name.csv','w', encoding=charset,
errors='replace', newline='') as fileout:
writer = csv.writer(fileout)
for row in cur.fetchall():
writer.writerow([field.encode('latin1').decode('cp1252', errors='replace')
for field in row])

encode('latin1').decode('cp1252') 只是一个技巧,用于修复 Python3 字符串,其中字符具有字节编码代码。它之所以有效,是因为 latin1 编码对于 256 以下的所有代码都是空操作。

errors=replace 选项,要求 Python 从不引发 UnicodeError 异常,而是用 '?' 替换字节字符串或用官方 unicode REPLACEMENT CHARACTER U+FFFD '�' 用于 unicode 字符串。


使用 pymysql.connectcharset 选项可能会更干净。不幸的是,我从未在 Python 中使用过 MySQL 数据库......

关于python - 如何修复字符映射到未定义的 unicode 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51137970/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com