当前位置: 首页 > 知识库问答 >
问题:

pandas to_csv:ascii不能编码字符

魏刚豪
2023-03-14

我正在尝试将数据帧读写到管道分隔的文件中。有些字符是非罗马字母(`、ç、ñ)。但当我把口音写成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)

如果将_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是哪一行断开的?现在我不知道如何让它显示我的坏角色(一个或多个)。

共有1个答案

苏君昊
2023-03-14

您有一些不是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

 类似资料:
  • So do not worry about tomorrow, for tomorrow will bring worries of its own. Today's trouble is enough for today. (MATTHEW 6:34) 字符编码 其实,标题前面应该加两个字——“坑爹”。 在实践中,字符编码的确是一个“坑”。因为这个世界上,不都是英文。如果都是英文,就没有这个问题

  • 问题内容: ’=?KOI8-R?B?W1JFUS0wMDI1NDEtNDc5NzddIO / h7yAi89TSz8rGwdLGz9IiIDs =?= \ r \ n \ t =?KOI8-R?B?Ry43MjkgKDEwKQ ==?=’ 如何将其转换为可读的内容?谢谢 ! 问题答案: email.header.decode_header(‘=?KOI8-R?B?W1JFUS0wMDI1NDEtN

  • 问题内容: 我有一个在GlassFish 3上运行的Java Web应用程序和在MySQL上的JPA(EclipseLink)上运行。我面临的问题是,如果使用该方法将实体保存到数据库中,则字段将丢失完整性;显示而不是某些字符。 服务器,页面和数据库配置为使用。 发布表单数据后,下一页将正确显示数据。此外,它在NetBeans中似乎“调试”当前实体的属性也存储了正确的值。如果可以信任NetBeans

  • 问题内容: 我正在从命令行(Windows 7)运行Java程序。为了简化问题,我仅描述相关部分。 我的输出是垃圾。显然这是一个字符编码问题,Á和á的匈牙利字符未正确显示。我尝试了以下方法: 但是我的输出仍然是垃圾。如何使用Windows 7命令行解决此字符编码问题?谢谢 问题答案: 我通过在命令行中找到正确的编码,然后有你的代码的工作 要么 使用,与编码版本 或 通过指定它的命令行上,只是利用。

  • 问题内容: 如何在对UTF-8的回复中设置默认字符编码? 我已经试过了 还有这个 都不起作用-响应仍与标头一起发送 我想对所有text / html响应都执行此操作,理想情况下是使用代码而不是XML。我正在使用Jetty 9。 问题答案: Jetty文档声称它默认情况下使用UTF-8,但这似乎是一个谎言。如果执行normal ,则内容编码如下确定。 从content-type到content-en

  • 问题内容: 这是我尝试的错误消息。我究竟做错了什么? UnicodeEncodeError:’ascii’编解码器无法在位置37编码字符u’\ xa0’:序数不在范围内(128) UnicodeDecodeError:’ascii’编解码器无法解码位置37的字节0xc2:序数不在范围内(128) 问题答案: 您无法解码,也无法编码。尝试以另一种方式进行操作。