UnicodeDecodeError:('utf-8'codec)在读取csv文件时

Sat*_*tya 21 python utf-8 pandas python-unicode

我正在尝试的是读取一个csv来创建一个数据帧---在列中进行更改---再次更新/反映更改的值到相同的csv(to_csv) - 再次尝试读取该csv以生成另一个数据帧...我收到一个错误

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe7 in position 7: invalid continuation byte
Run Code Online (Sandbox Code Playgroud)

我的代码是

 import pandas as pd
 df = pd.read_csv("D:\ss.csv")
 df.columns  #o/p is Index(['CUSTOMER_MAILID', 'False', 'True'], dtype='object')
 df['True'] = df['True'] + 2     #making changes to one column of type float
 df.to_csv("D:\ss.csv")       #updating that .csv    
 df1 = pd.read_csv("D:\ss.csv")   #again trying to read that csv

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe7 in position 7: invalid continuation byte
Run Code Online (Sandbox Code Playgroud)

所以请建议我如何避免错误并能够再次将该csv读取到数据帧.

我知道某处我在读取和写入csv时缺少"encode = some codec type"或"decode = some type".

但我不知道到底应该改变什么.所以需要帮助.

Max*_*Noe 42

已知编码

如果您知道要读入的文件的编码,则可以使用

pd.read_csv('filename.txt', encoding='encoding')
Run Code Online (Sandbox Code Playgroud)

这些是可能的编码:https: //docs.python.org/3/library/codecs.html#standard-encodings

未知编码

如果您不知道编码,可以尝试使用chardet,但这不能保证工作.这更像是一种猜测工作.

import chardet
import pandas as pd

with open('filename.csv', 'rb') as f:
    result = chardet.detect(f.read())  # or readline if the file is large


pd.read_csv('filename.csv', encoding=result['encoding'])
Run Code Online (Sandbox Code Playgroud)

  • chardet.detect()非常慢.我使用Python 3.6,而`pd.read_csv('filename.csv',encoding ='Latin-1')`对我来说非常适合. (4认同)
  • 是的,“pip install chardet”。 (3认同)

Kri*_*naa 11

一个简单的解决方案是你可以在像Sublime Text这样的编辑器中打开csv文件,并用'utf-8'编码保存它.然后我们可以通过pandas轻松读取文件.


rmu*_*unn 9

您是否在第一次读取数据时发生了这种错误,或者在您将其写出并再次读回之后的第二次读取时发生了这种错误?我的猜测是它实际上是在第一次读取数据时发生的,因为你的CSV的编码不是UTF-8.

尝试在Notepad ++,Excel或LibreOffice中打开该CSV文件.您的数据源中是否包含ç(带cedilla的C)字符?如果是这样,那么你看到的0xE7字节可能是在Latin-1或Windows-1252中编码的ç(在Python中称为"cp1252").

查看Pandas 函数的文档read_csv(),我看到它有一个encoding参数,该参数应该是您希望CSV文件所在的编码名称.所以请尝试添加encoding="cp1252"到您的read_csv()调用,如下所示:

df = pd.read_csv(r"D:\ss.csv", encoding="cp1252")
Run Code Online (Sandbox Code Playgroud)

请注意,我r在文件名前添加了字符,因此它将被视为"原始字符串",并且不会特别处理反斜杠.这样,当您更改文件名,你没有得到一个惊喜ss.csvnew-ss.csv,那里的字符串D:\new-ss.csv会被理解为D,:,换行符,e,w,等.

无论如何,在第一次read_csv()调用时尝试使用该编码参数,看看它是否有效.(这只是猜测,因为我不知道您的实际数据.如果数据文件不是私有且不是太大,请尝试发布数据文件,以便我们可以看到它的内容 - 这会让我们做得更好而不仅仅是猜测.)


Man*_*hit 5

是的,您会收到此错误。我已经解决了这个问题,方法是在记事本++中打开 csv 文件并通过编码菜单更改编码 -> 转换为 UTF-8。然后保存文件。然后再次在其上运行 python 程序。

其他解决方案是在 python 中使用 codecs 模块对文件进行编码-解码。我没用过那个。


Abh*_*hek 5

通过导入然后检测文件类型使用的上述方法工作导入chardet

import pandas as pd
import chardet
with open('filename.csv', 'rb') as f:
    result = chardet.detect(f.read())  # or readline if the file is large


pd.read_csv('filename.csv', encoding=result['encoding'])
Run Code Online (Sandbox Code Playgroud)