Pandas: 读取文件路径中带有重音的文件时出现OSError

创建于 2017-01-09  ·  27评论  ·  资料来源: pandas-dev/pandas

代码示例,可能的复制示例

test.txttest_é.txt是同一个文件,只是名称更改:

pd.read_csv('test.txt')
Out[3]: 
   1 1 1
0  1 1 1
1  1 1 1

pd.read_csv('test_é.txt')
Traceback (most recent call last):

  File "<ipython-input-4-fd67679d1d17>", line 1, in <module>
    pd.read_csv('test_é.txt')

  File "d:\app\python36\lib\site-packages\pandas\io\parsers.py", line 646, in parser_f
    return _read(filepath_or_buffer, kwds)

  File "d:\app\python36\lib\site-packages\pandas\io\parsers.py", line 389, in _read
    parser = TextFileReader(filepath_or_buffer, **kwds)

  File "d:\app\python36\lib\site-packages\pandas\io\parsers.py", line 730, in __init__
    self._make_engine(self.engine)

  File "d:\app\python36\lib\site-packages\pandas\io\parsers.py", line 923, in _make_engine
    self._engine = CParserWrapper(self.f, **self.options)

  File "d:\app\python36\lib\site-packages\pandas\io\parsers.py", line 1390, in __init__
    self._reader = _parser.TextReader(src, **kwds)

  File "pandas\parser.pyx", line 373, in pandas.parser.TextReader.__cinit__ (pandas\parser.c:4184)

  File "pandas\parser.pyx", line 669, in pandas.parser.TextReader._setup_parser_source (pandas\parser.c:8471)

OSError: Initializing from file failed

问题描述

尝试读取文件路径中带有重音符号的文件时,熊猫会返回OSError。

问题是新的(自从我升级到Python 3.6和Pandas 0.19.2以来)

pd.show_versions()

安装的版本

提交:无
的Python:3.6.0.final.0
python位:64
操作系统:Windows
操作系统版本:7
机器:AMD64
处理器:Intel64 Family 6 Model 94 Steping 3,正版英特尔
字节序:小
LC_ALL:无
朗:fr
地点:无。无

熊猫:0.19.2
鼻子:无
点:9.0.1
setuptools:32.3.1
Cython:0.25.2
numpy的:1.11.3
scipy:0.18.1
statsmodels:无
xarray:无
IPython:5.1.0
狮身人面像:1.5.1
patsy:无
dateutil的:2.6.0
pytz:2016.10
blosc:无
瓶颈:1.2.0
桌子:无
numexpr:2.6.1
matplotlib:1.5.3
openpyxl:无
xlrd:无
xlwt:无
xlsxwriter:无
lxml:无
bs4:无
html5lib:0.999999999
httplib2:无
apiclient:无
sqlalchemy:1.1.4
pymysql:无
psycopg2:无
jinja2:2.9.3
boto:无
pandas_datareader:无

Bug IO CSV Unicode Windows

最有用的评论

如果有人像我一样来这里,因为他/她遇到了同样的问题,这是一个解决方法,直到将熊猫修复为可与pep 529一起使用(基本上,路径中的任何非ascii字符或文件名都会导致错误):

在代码的开头插入以下两行,以恢复为处理Windows路径的旧方法:

import sys
sys._enablelegacywindowsfsencoding()

所有27条评论

只是我的几分钱值得。 在Mac OSX和Ubuntu上快速试用,没有
问题。 见下文。

这可能是环境/平台问题吗? 我注意到LOCALE
设置为None.None 。 不幸的是我没有Windows机器来尝试
例子。 诚然,这不能解释为什么你看到了这一点
升级到python3.6和pandas 0.19.2。

注意:我只是使用python3.6设置了virtualenv,并使用pip安装了熊猫0.19.2。

>>> import pandas as pd
>>> pd.read_csv('test_é.txt')
   a  b  c
0  1  2  3
1  4  5  6

pd.show_versions()的输出


安装的版本

提交:无
的Python:3.6.0.final.0
python位:64
操作系统:Linux
操作系统版本:4.4.0-57-通用
机器:x86_64
处理器:x86_64
字节序:小
LC_ALL:无
朗:en_GB.UTF-8
本地:en_GB.UTF-8

熊猫:0.19.2
鼻子:无
点:9.0.1
setuptools:32.3.1
Cython:无
numpy的:1.11.3
scipy:无
statsmodels:无
xarray:无
IPython:无
狮身人面像:无
patsy:无
dateutil的:2.6.0
pytz:2016.10
blosc:无
瓶颈:无
桌子:无
numexpr:无
matplotlib:无
openpyxl:无
xlrd:无
xlwt:无
xlsxwriter:无
lxml:无
bs4:无
html5lib:无
httplib2:无
apiclient:无
sqlalchemy:无
pymysql:无
psycopg2:无
jinja2:无
boto:无
pandas_datareader:无

我相信3.6会将Windows上的文件系统编码切换为utf8(来自ascii)。 除此之外,我们还没有在Windows 3.6上启用测试(因为一些必需的软件包刚刚可用)。

@JGoutin

所以我刚刚在3.6的appveyor(windows)上添加了构建支持,所以如果您要提高测试以查看它是否有效,那就太好了。

当程序停止在pd.read_csv(file_path)时,我也面临相同的问题。 在我将python升级到3.6之后,情况与我类似(我不确定我上次安装的python到底是什么版本,也许是3.5 ......)。

@jreback在这里进行修复的下一步是什么?
您提到的PR被“吹走”了-这是什么意思?

虽然我不使用Windows,但是我可以尝试提供帮助(只是让一台VM调试了我的一段显然在Windows上无法运行的代码)

顺便说一句,一种解决方法:传递文件句柄而不是名称
pd.read_csv(open('test_é.txt', 'r'))
(相关问题中有几种解决方法,但我没有看到这一方法)

@tpietruszka看到有关PR的评论: https :

您基本上需要在wnidows上的py3.6(与其他python)上对路径进行不同的编码。 基本上需要实现: https: //docs.python.org/3/whatsnew/3.6.html#pep -529-change-windows-filesystem-encoding-to-utf-8

我的旧代码(无法运行):

import pandas as pd
import os
file_path='./dict/字典.csv'
df_name = pd.read_csv(file_path,sep=',' )

新代码(成功):

import pandas as pd
import os
file_path='./dict/dict.csv'
df_name = pd.read_csv(file_path,sep=',' )

我认为此错误是文件名问题。
我将文件名从中文更改为英文,现在可以运行了。

如果有人像我一样来这里,因为他/她遇到了同样的问题,这是一个解决方法,直到将熊猫修复为可与pep 529一起使用(基本上,路径中的任何非ascii字符或文件名都会导致错误):

在代码的开头插入以下两行,以恢复为处理Windows路径的旧方法:

import sys
sys._enablelegacywindowsfsencoding()

我使用上面的解决方案,它可以工作。 非常感谢@fotisj
但是我仍然对为什么DataFrame.to_csv()不会出现相同的问题感到困惑。 换句话说,对于unicode文件路径,可以写,而不能读。

path = os.path.join('E:\语料','sina.csv')
pd.read_csv(open(path,'r',encoding ='utf8'))

成功了

系统受影响的人可以检查是否更改此行

https://github.com/pandas-dev/pandas/blob/e8620abc12a4c468a75adb8607fd8e0eb1c472e7/pandas/io/common.py#L209

 return _expand_user(os.fsencode(filepath_or_buffer)), None, compression

解决吗?

不,不是的。
结果:OSError:预期的文件路径名或类似文件的对象,得到了类型
(在Windows 10上)

    OSError                                   Traceback (most recent call last)
    <ipython-input-2-e8247998d6d4> in <module>()
      1 
----> 2 df = pd.read_csv(r'D:\mydata\Dropbox\uni\progrs\test öäau\n\teu.csv', sep='\t')

C:\conda\lib\site-packages\pandas\io\parsers.py in parser_f(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, escapechar, comment, encoding, dialect, tupleize_cols, error_bad_lines, warn_bad_lines, skipfooter, skip_footer, doublequote, delim_whitespace, as_recarray, compact_ints, use_unsigned, low_memory, buffer_lines, memory_map, float_precision)
    707                     skip_blank_lines=skip_blank_lines)
    708 
--> 709         return _read(filepath_or_buffer, kwds)
    710 
    711     parser_f.__name__ = name

C:\conda\lib\site-packages\pandas\io\parsers.py in _read(filepath_or_buffer, kwds)
    447 
    448     # Create the parser.
--> 449     parser = TextFileReader(filepath_or_buffer, **kwds)
    450 
    451     if chunksize or iterator:

C:\conda\lib\site-packages\pandas\io\parsers.py in __init__(self, f, engine, **kwds)
    816             self.options['has_index_names'] = kwds['has_index_names']
    817 
--> 818         self._make_engine(self.engine)
    819 
    820     def close(self):

C:\conda\lib\site-packages\pandas\io\parsers.py in _make_engine(self, engine)
   1047     def _make_engine(self, engine='c'):
   1048         if engine == 'c':
-> 1049             self._engine = CParserWrapper(self.f, **self.options)
   1050         else:
   1051             if engine == 'python':

C:\conda\lib\site-packages\pandas\io\parsers.py in __init__(self, src, **kwds)
   1693         kwds['allow_leading_cols'] = self.index_col is not False
   1694 
-> 1695         self._reader = parsers.TextReader(src, **kwds)
   1696 
   1697         # XXX

pandas/_libs/parsers.pyx in pandas._libs.parsers.TextReader.__cinit__()

pandas/_libs/parsers.pyx in pandas._libs.parsers.TextReader._setup_parser_source()

OSError: Expected file path name or file-like object, got <class 'bytes'> type

哦对不起。 fsdecode在那工作吗?


来自:Fotis Jannidis [email protected]
发送:2018年2月3日,星期六,8:00:13 AM
至:pandas-dev / pandas
抄送:汤姆·奥格斯珀格; 评论
主题:Re:[pandas-dev / pandas]读取文件路径中带有重音符号的文件时出现OSError(#15086)

不,不是的。
结果:OSError:预期的文件路径名或类似文件的对象,得到了类型

-
您收到此邮件是因为您发表了评论。
直接回复此电子邮件,在GitHub https://github.com/pandas-dev/pandas/issues/15086#issuecomment-362809602上查看,或忽略线程https://github.com/notifications/unsubscribe-auth/ ABQHIplv8thHxpjsP3knUCpET0Fjy0kLks5tRGZsgaJpZM4LeTSB

不会。使用fsdecode会产生与我们最初相同的错误( error_msg.txt

好,谢谢您的尝试。


来自:Fotis Jannidis [email protected]
发送:2018年2月3日,星期六8:57:07 AM
至:pandas-dev / pandas
抄送:汤姆·奥格斯珀格; 评论
主题:Re:[pandas-dev / pandas]读取文件路径中带有重音符号的文件时出现OSError(#15086)

不会。使用fsdecode会产生我们最初遇到的相同错误(error_msg.txt https://github.com/pandas-dev/pandas/files/1691837/error_msg.txt

-
您收到此邮件是因为您发表了评论。
直接回复此电子邮件,在GitHub https://github.com/pandas-dev/pandas/issues/15086#issuecomment-362818153上查看,或忽略线程https://github.com/notifications/unsubscribe-auth/ ABQHIpeYsj9Bv3OsoHAsOufXzU3AYSBSksks5tRHPCgaJpZM4LeTSB

今天与史蒂夫·道尔(Steve Dower)进行了交谈,他怀疑这可能是有问题的线路: https :

Windows文件系统API IIUC期望这些字节位于MBCS中,但我们使用的是utf-8。

用户级别的解决方法是在将字节字符串传递给pandas之前,将文件名显式编码为mbcs。 https://www.python.org/dev/peps/pep-0529/#explicitly -using-mbcs

pd.read_csv(filename.encode('mbcs'))

有谁能够测试该解决方法?

只需在解析器代码中进行一些小的更改即可解决此问题(有PR这样做),但已删除

@TomAugspurger不起作用。 read_csv的期望值为str而不是bytes 。 它失败了

OSError: Expected file path name or file-like object, got <class 'bytes'> type

感谢您的检查。

在2018年4月20日星期五,下午3:43,JoãoD.Ferreira [email protected]
写道:

@TomAugspurger https://github.com/TomAugspurger无法正常工作。
read_csv需要一个str而不是一个字节值。 它失败了

OSError:预期的文件路径名或类似文件的对象,得到了类型

-
您收到此邮件是因为有人提到您。
直接回复此电子邮件,在GitHub上查看
https://github.com/pandas-dev/pandas/issues/15086#issuecomment-383217062
或使线程静音
https://github.com/notifications/unsubscribe-auth/ABQHIiOHyt3sT7B0pHJuY5lB-cJtT5JHks5tqkiEgaJpZM4LeTSB

只是ping通-我也有同样的问题,我正在使用一种解决方法,但是如果不需要这样做,那就太好了。

这需要一个社区补丁

我遇到这个问题。 我想尝试并贡献一个patchc关于如何开始解决此问题的任何指示?

我认为没有一个维护者可以访问可以重现此问题的系统。

也许其他一些问题可以帮助提出一个解决方案。

嗨,我现在在熊猫1.0.3上遇到sys._enablelegacywindowsfsencoding()解决方法停止了工作。 我的文件路径中有ąź
我在熊猫0.25.3上也遇到此错误,但使用替代方法时, 0.23.4似乎工作正常(我没有检查其他版本)。 我很乐意提供任何其他信息。

如果您的文件与文件存储在相同的文件夹名称中,请从相同的文件夹名称中删除文件。
只需从该文件夹中删除文件即可。
不要将文件存储在相同的文件夹名称中。
然后,它起作用

@pranjulknit如果我了解您的建议,请将该文件移动到路径中没有这些问题字符的文件夹中。 这并不总是可能的。 如果您建议文件夹名称和文件名应该不同-这不是此处描述的问题,那么我从来没有遇到过问题。

实际上,从jupyter笔记本读取csv文件时遇到了这个问题。

此页面是否有帮助?
0 / 5 - 0 等级