【问题标题】:Pandas read_csv filepath with special characters codec can't decode带有特殊字符编解码器的 Pandas read_csv 文件路径无法解码
【发布时间】:2020-11-25 16:21:39
【问题描述】:

我正在使用 Python 3.5.3 版和 Pandas 0.20.1 版

我使用 read_csv 读取 csv 文件。我根据post 使用文件指针(我更喜欢使用_enablelegacywindowsfsencoding() 的解决方案)。以下代码有效:

import pandas as pd

with open("C:/Desktop/folder/myfile.csv") as fp:
    df=pd.read_csv(fp, sep=";", encoding ="latin")

这确实有效。但是,当文件名中有像ä这样的特殊字符时:

import pandas as pd

with open("C:/Desktop/folderÄ/myfile.csv") as fp:
    df=pd.read_csv(fp, sep=";", encoding ="latin")

Python 显示错误消息:(unicode error) 'utf-8' codec can't decode byte oxc4 in position 0: unexpected end of data。

我还尝试在文件路径之前添加一个“r”,但是我得到了相同的错误消息,除了现在我得到一个整数位置,这正是我的特殊字符在文件路径中的位置。

所以原因是文件路径名中的特殊字符。

(不是可以通过使用 encoding="utf-8" 或任何其他类似 ISO-5589-1 来解决的解码错误。绝对可以肯定,我尝试使用以下编码并总是得到相同的错误消息: utf-8, ISO-5589-1, cp1252)

【问题讨论】:

    标签: python pandas csv utf-8 filepath


    【解决方案1】:

    该错误表明您的源文件(不是数据文件)未以 UTF-8 编码。在 Python 3 中,您的源文件必须以 UTF-8 编码保存,或者您必须使用特殊注释声明保存源文件的编码,例如#coding=Windows-1252 在文件顶部。 \xc4Ä 的 Windows-1252 编码,是西欧和美国 Windows 的默认编码,所以这是一个很好的猜测。理想情况下,以 UTF-8 重新保存您的源代码。

    例如,如果源是Windows-1252编码,数据文件是GB2312编码(中文):

    #coding=Windows-1252                         # encoding of source file
    import pandas as pd
    with open('DÄTÄ.csv',encoding='gb2312') as f:  # encoding of data file
        data = pd.read_csv(f)
    

    请注意,源文件默认为 UTF-8 编码,但open 默认为locale.getpreferredencoding(FALSE) 返回的编码。由于这因操作系统和配置而异,因此最好在打开文件时始终指定编码。

    【讨论】:

    • 文件被导出为 UTF-8。我打开文件并使用文本编辑器将其重新保存为 UTF-8。正如我所说,当我尝试使用没有“Ä”的文件路径时,它确实有效。我再次尝试在文件路径名中使用“Ä”。我收到相同的错误消息。我试过你的代码(除了我没有使用 gb2312,我用 utf-8、utf8-sig 和 latin 试过。此外,首先我用你的 f 和数据文件,其次我用我的 fp 试过)。所以我用完全相同的文件测试它。第一个测试是我使用了一个没有“Ä”的文件路径名,它可以工作。然后我尝试在文件路径名和错误消息中使用“Ä”。
    【解决方案2】:

    例如尝试使用 unicode 文件路径 u'path/to/files'

    import pandas as pd
    
    with open(u'C:/Desktop/folderÄ/myfile.csv') as fp:
        df=pd.read_csv(fp, sep=";", encoding ="latin")
    

    【讨论】:

    • OP 正在使用 Python 3。字符串已经是 Unicode。
    猜你喜欢
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 2013-09-09
    • 2013-09-09
    • 2019-12-09
    • 1970-01-01
    相关资源
    最近更新 更多