保存数据时
data.to_csv(outp_file, encoding='utf-8')
我有时会遇到这样的错误
UnicodeEncodeError:' utf-8'编解码器无法对字符进行编码 233-234:代理人不被允许
在python3中,你可以简单地替换这样的字符
>> "abc\udc34xyz".encode('utf-8', 'replace').decode('utf-8')
'abc?xyz'
但是这里有一个包含N行和M列的数据帧。我可以用代理删除行,但跳过整个数据帧并不合适。
问题是我不知道它们在哪些行和哪些列中。
我正在寻找可以按照以下方式应用的解决方案
try:
data.to_csv(outp_file, encoding='utf-8')
except UnicodeEncodeError:
# process data and save it without surrogates...
任何帮助?
答案 0 :(得分:0)
目前还不清楚您的unicode输入是什么样的,也不清楚为什么它们偶尔会有非UTF16代码点需要像DC34这样的低代理。如果您的数据大多符合USASCII,那么iconv
可能会提供一种有用的方法来消除不方便的代码点:
$ cat foo1.csv | iconv -c -f utf16 -t latin1 | iconv -f latin1 -t utf8 > foo2.csv
让您的应用程序读取结果输出.csv。
如果您查看iconv --help
,您会注意到-c
表示丢弃,此外还有其他一些可能有用的丢弃选项。
答案 1 :(得分:0)
您可以自己打开文件来解决此问题:
with open(outp_file, 'w', encoding='utf8', errors='replace') as f:
data.to_csv(f)
或者如果outp_file是类似文件的对象,您可以手动编写:
outp_file.write(data.to_csv().encode('utf-8', 'replace').decode('utf-8'))
答案 2 :(得分:0)
for col in train.columns:
if train[col].dtype==object:
train[col]=train[col].apply(lambda x: np.nan if x==np.nan else str(x).encode('utf-8', 'replace').decode('utf-8'))
尝试一下。对我有用
答案 3 :(得分:0)
尝试一下
for c in data:
data[c] = [x.encode('utf-16', 'surrogatepass').decode('utf-16') for x in data[c]]