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我是 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