Python 熊猫到_csv:ascii can';t编码字符

Python 熊猫到_csv:ascii can';t编码字符,python,pandas,unicode,utf-8,Python,Pandas,Unicode,Utf 8,我正在尝试将数据帧读写到以管道分隔的文件中。有些字符是非罗马字母(`、ç、ñ等)。但当我试着把重音写成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-ae528

我正在尝试将数据帧读写到以管道分隔的文件中。有些字符是非罗马字母(`、ç、ñ等)。但当我试着把重音写成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)
我的目标是创建一个以管道分隔的文件,该文件保留重音和特殊字符


还有,有没有一种简单的方法来确定哪一行read_csv正在中断?现在我不知道如何让它显示坏字符。

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

检查答案

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

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

另一种解决方案是使用带有“忽略”选项的字符串函数编码/解码,但它将删除非ascii字符:

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

试试这个,它能工作


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

您是否规范化unicode字符串以删除重音符号?我认为ASCII不能处理这些字母。…。@juanpa.arrivillaga:我编辑我的帖子是为了澄清我在输出中寻找的内容。@ale19你不能用ASCII编码重音符号和特殊字符。这是一个赤裸裸的表现。这就是UTF-8这样的编码存在的原因。用UTF-8写出来就行了。谢谢。当我尝试您的函数(指定列)时,我得到了TypeError:ord()应该是一个字符,但找到了长度为17的字符串。我假设这是因为ord()检查单个字符,但相关列包含字符串。如果您执行
df[df[col].apply(is_ascii)=False]
,则只会得到发现错误的行/索引。
newdf.to_csv('filename.csv', encoding='utf-8')