pandas to_csv:ascii 无法编码字符

Posted

技术标签:

【中文标题】pandas to_csv:ascii 无法编码字符【英文标题】:pandas to_csv: ascii can't encode character 【发布时间】:2017-05-04 20:46:03 【问题描述】:

我正在尝试读取数据帧并将其写入管道分隔文件。一些字符是非罗马字母(`、ç、ñ 等)。但是当我尝试将重音符号写为 ASCII 时它会中断。

df = pd.read_csv('filename.txt',sep='|', encoding='utf-8')
<do stuff>
newdf.to_csv('output.txt', sep='|', index=False, encoding='ascii')

-------

  File "<ipython-input-63-ae528ab37b8f>", line 21, in <module>
    newdf.to_csv(filename,sep='|',index=False, encoding='ascii')

  File "C:\Users\aliceell\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\frame.py", line 1344, in to_csv
    formatter.save()

  File "C:\Users\aliceell\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\formats\format.py", line 1551, in save
    self._save()

  File "C:\Users\aliceell\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\formats\format.py", line 1652, in _save
    self._save_chunk(start_i, end_i)

  File "C:\Users\aliceell\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\formats\format.py", line 1678, in _save_chunk
    lib.write_csv_rows(self.data, ix, self.nlevels, self.cols, self.writer)

  File "pandas\lib.pyx", line 1075, in pandas.lib.write_csv_rows (pandas\lib.c:19767)

UnicodeEncodeError: 'ascii' codec can't encode character '\xb4' in position 7: ordinal not in range(128)

如果我将 to_csv 更改为 utf-8 编码,则无法正确读取文件:

newdf.to_csv('output.txt',sep='|',index=False,encoding='utf-8')
pd.read_csv('output.txt', sep='|')

> UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb4 in position 2: invalid start byte

我的目标是创建一个以竖线分隔的文件,保留重音和特殊字符。

另外,有没有一种简单的方法可以确定 read_csv 中断了哪一行?现在我不知道如何让它向我展示坏角色。

【问题讨论】:

Pandas writing dataframe to CSV file的可能重复 您是否正在规范化您的 unicode 字符串以去除重音符号?我以为 ASCII 不能处理那些字母... @juanpa.arrivillaga:我编辑了我的帖子以阐明我在输出中寻找的内容。 @ale19 你不能用 ASCII 编码重音和特殊字符。这是一个简单的表示。这就是 为什么 存在像 UTF-8 这样的编码。只需用 UTF-8 写出来。 【参考方案1】:

试试这个,效果很好

newdf.to_csv('filename.csv', encoding='utf-8')

【讨论】:

【参考方案2】:

查看答案here

这是一个更简单的解决方案:

newdf.to_csv('filename.csv', encoding='utf-8')

【讨论】:

【参考方案3】:

另一种解决方案是使用带有 'ignore' 选项的字符串函数编码/解码,但它会删除非 ascii 字符:

df['text'] = df['text'].apply(lambda x: x.encode('ascii', 'ignore').decode('ascii'))

【讨论】:

【参考方案4】:

您有一些不是 ASCII 的字符,因此无法按照您尝试的方式进行编码。我会按照评论中的建议使用utf-8

要检查导致问题的行,您可以尝试以下操作:

def is_not_ascii(string):
    return string is not None and any([ord(s) >= 128 for s in string])

df[df[col].apply(is_not_ascii)]

您需要指定要测试的列col

【讨论】:

谢谢。当我尝试你的函数(指定列)时,我得到 TypeError: ord() expected a character, but string of length 17 found。我假设这是因为 ord() 检查单个字符,但有问题的列包含字符串。 如果您执行df[df[col].apply(is_ascii) ==False],那么您只会获得发现错误的行/索引。

以上是关于pandas to_csv:ascii 无法编码字符的主要内容,如果未能解决你的问题,请参考以下文章

使用编码字的 MIME 标头中的换行符是不是合法?

在ASCII码字符编码中,啥字符无法显示或打印出来

在ASCII码字符编码中,啥字符无法显示或打印出来

在ASCII码字符编码中,啥字符无法显示或打印出来

Python pandas 带有 to_csv 的大浮点数

ASCII码字符对照表