当我尝试使用时:
df[df.columns.difference(['pos', 'neu', 'neg', 'new_description'])].to_csv('sentiment_data.csv')
我收到错误:
UnicodeEncodeError: 'utf-8' codec can't encode character '\ud83d' in position 388: surrogates not allowed
我不明白此错误的含义以及如何修复此错误并将我的数据导出到 csv/excel。我已经提到了这个 问题,但我不太了解,也没有回答如何用熊猫做这件事。
位置388是什么意思?字符’\ud83d’是什么?
当我尝试导出到 excel 时出现不同的错误位置:
df[df.columns.difference(['pos', 'neu', 'neg', 'new_description'])].to_excel('sentiment_data_new.xlsx')
导出到 excel 时出错:
UnicodeEncodeError: 'utf-8' codec can't encode character '\ud83d' in position 261: surrogates not allowed
为什么相同编码时位置不同?
其他重复的问题没有回答如何使用 pandas DataFrame 来避免这个错误。
原文由 Mohit Motwani 发布,翻译遵循 CC BY-SA 4.0 许可协议
Unicode 中的表情符号位于基本多语言窗格之外,这意味着它们的代码点不适合 16 位。代理对是一种使这些字形在 UTF-16 中直接表示为一对 16 位代码点的方法。
您可以像这样强制将代理项对解析为 BMP 之外的相应代码点:
这将为您提供代码点
\U0001f604
。请注意如何使用超过 4 个十六进制数字来表达。但是这个解决方案可能只能让你到此为止。
许多软件(包括
pygame
和旧版本的 IDLE、PowerShell 和 Windows 命令提示符)只支持 BMP,因为它并不真正使用 UTF-16,而是它的前身 UCS-2,它本质上是 UTF-16,但不支持 BMP 之外的代码点。最初发布此答案时,在 IDLE 3.7 及之前版本中,
print ('\U0001f604')
只会引发UnicodeEncodeError: 'UCS-2' codec can't encode character '\U0001f604' in position 0: Non-BMP character not supported in Tk
。Python 3.8 最终修复了这个问题,并且这些修复被反向移植到 Python 3.7 的后续版本,所以现在在 IDLE 中,您可以提供 17 位代码点:
或将 UTF-16 代理对转码为相同的代码点:
两者都会打印
😄
。您仍然不能做的是按原样打印 UTF-16 代理对:如果您尝试
print ("\ud83d\ude04")
您将得到相同的\u
转义。