UnicodeDecodeError:('utf-8'编解码器)在读取csv文件时[重复]

Posted

技术标签:

【中文标题】UnicodeDecodeError:(\'utf-8\'编解码器)在读取csv文件时[重复]【英文标题】:UnicodeDecodeError: ('utf-8' codec) while reading a csv file [duplicate]UnicodeDecodeError:('utf-8'编解码器)在读取csv文件时[重复] 【发布时间】:2016-02-22 12:29:09 【问题描述】:

我正在尝试读取 csv 以制作数据框——在列中进行更改——再次将更改的值更新/反映到相同的 csv(to_csv) 中——再次尝试读取该 csv 以制作另一个数据框。 ..那里我收到一个错误

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe7 in position 7: invalid continuation byte

我的代码是

 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

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

我知道在读取和写入 csv 时我缺少“编码 = 某种编解码器类型”或“解码 = 某种类型”。

但我不知道究竟应该改变什么。所以需要帮助。

【问题讨论】:

【参考方案1】:

已知编码

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

pd.read_csv('filename.txt', encoding='encoding')

这些是可能的编码: 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'])

【讨论】:

要导入 chardet 我必须安装任何软件包吗?因为我在导入此模块时出错。请提供包名。谢谢 是的,pip install chardet chardet.detect() 非常慢。我使用 Python 3.6,pd.read_csv('filename.csv', encoding='Latin-1') 非常适合我。 如果知道编码总是更好的说明它。如果您不知道并且您的文件很大,您可以尝试给 chardet 而不是完整文件f.read (),而是更小的部分,例如f.read(1024**2) 第一个兆字节。 是的,这也解决了我的类似问题。【参考方案2】:

该错误是在您第一次读取数据时发生的,还是在您将数据写出并再次读回后的第二次读取时发生?我的猜测是它实际上发生在 first 读取数据时,因为您的 CSV 的编码不是 UTF-8。

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

查看 the documentation 的 Pandas read_csv() 函数,我看到它有一个 encoding 参数,它应该是您希望 CSV 文件所在的编码的名称。所以尝试将 encoding="cp1252" 添加到您的read_csv() 电话,如下:

df = pd.read_csv(r"D:\ss.csv", encoding="cp1252")

请注意,我在文件名前添加了字符r,因此它将被视为“原始字符串”并且不会对反斜杠进行特殊处理。这样,当您将文件名从ss.csv 更改为new-ss.csv 时,您不会感到意外,其中字符串D:\new-ss.csv 将被读取为D:、换行符、e、@987654334 @等

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

【讨论】:

谢谢,你可以看到我的第一次阅读并没有给我任何错误 to_csv 也是成功的。但是在尝试第二次阅读时出现错误。可能是,当我试图通过to_csv 我应该给出一些编码或解码类型,以便在我的第二次阅读中我可以使用相同的编码类型阅读。请纠正我。 @Satya - to_csv 函数还带有一个 encoding 参数,因此您也可以尝试指定 to_csv(filename, encoding="utf-8")(如果您有选择)在阅读之前使用read_csv(filename, encoding="utf-8")。但由于 UTF-8 已经是默认值,我不知道这是否会有很大的不同。 @Satya - 实际上,我刚才错了。如果您使用的是 Python 3,则 UTF-8 是 to_csv 的默认值。但是,如果您使用的是 Python 2,则它不是默认设置 - 因此将 encoding="utf-8" 参数添加到您的所有 to_csv() 调用中绝对是一个好主意。 @rmunn-i 正在使用 python 3.4.1 并尝试使用 encoding = 'utf-8' 进行第一次读取,然后使用 encoding = 'utf-8' 尝试 to_csv 并在第二次读取 encoding = 'utf- 8',,,,, 在第二次读取时仍然出现相同的错误。如果我应该使用 UTF-8,请纠正我。 @Satya - 你真的,真的确定这是第二次阅读失败了吗?因为它没有失败的理由,如果它真的是第一次读取失败,你会得到同样的错误信息。可能一直以来,您都有一个错误的输入文件并且不知道它。我建议您在第一次 read_csv 调用之后在代码中添加 print("First read was successful") 行,然后确保您确实在输出中看到了这些词。只是说真的,真的确定。【参考方案3】:

一个简单的解决方案是您可以在 Sublime Text 之类的编辑器中打开 csv 文件,然后使用“utf-8”编码保存它。然后我们就可以通过pandas轻松读取文件了。

【讨论】:

绝对是最简单的:) 哦哇尝试了这个,它对我有用。谢谢【参考方案4】:

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

其他解决方案是使用 python 中的编解码器模块对文件进行编码解码。我没用过。

【讨论】:

【参考方案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'])

【讨论】:

我使用上面的代码得到了这个错误“UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 5356: character maps to 【参考方案6】:

我是 python 新手。当我手动将我的 excel 文件的扩展名更改为 .csv 并尝试使用 read_csv 读取它时,遇到了这个确切的问题。但是,如果我打开 excel 文件并保存为 csv 文件,它似乎可以工作。

【讨论】:

以上是关于UnicodeDecodeError:('utf-8'编解码器)在读取csv文件时[重复]的主要内容,如果未能解决你的问题,请参考以下文章

来自文件夹嵌套 Zip 文件的 pandas read_csv 的 UnicodeDecodeError ('utf-8')

错误UnicodeDecodeError:'utf-8'编解码器无法解码位置0的字节0xff:无效的起始字节

"for line in..." 导致 UnicodeDecodeError: 'utf-8' codec can't decode byte

UnicodeDecodeError:“utf8”编解码器无法解码字节 0x9c

python:UnicodeDecodeError:'utf8'编解码器无法解码位置0的字节0xc0:无效的起始字节

UnicodeDecodeError: 'utf-8' codec can't decode byte