【问题标题】: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 时我缺少“编码 = 某种编解码器类型”或“解码 = 某种类型”。

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

【问题讨论】:

    标签: python pandas utf-8 python-unicode


    【解决方案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 文件,它似乎可以工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-05
        • 1970-01-01
        • 2017-09-27
        • 1970-01-01
        相关资源
        最近更新 更多