Pandas: OSError al leer un archivo con acentos en la ruta del archivo

Creado en 9 ene. 2017  ·  27Comentarios  ·  Fuente: pandas-dev/pandas

Ejemplo de código, un ejemplo que se puede copiar, si es posible

test.txt y test_é.txt son el mismo archivo, solo el cambio de nombre:

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

Descripción del problema

Pandas devuelve OSError cuando intenta leer un archivo con acentos en la ruta del archivo.

El problema es nuevo (desde que actualicé a Python 3.6 y Pandas 0.19.2)

Salida de pd.show_versions()

VERSIONES INSTALADAS

cometer: Ninguno
python: 3.6.0.final.0
bits de pitón: 64
SO: Windows
Versión del SO: 7
máquina: AMD64
Procesador: Intel64 Family 6 Model 94 Stepping 3, GenuineIntel
byteorder: pequeño
LC_ALL: Ninguno
IDIOMA: fr
LOCAL: Ninguno Ninguno

pandas: 0.19.2
nariz: ninguna
pip: 9.0.1
herramientas de configuración: 32.3.1
Cython: 0.25.2
numpy: 1.11.3
scipy: 0.18.1
statsmodels: Ninguno
xarray: Ninguno
IPython: 5.1.0
esfinge: 1.5.1
patsy: Ninguno
dateutil: 2.6.0
pytz: 2016.10
blosc: Ninguno
cuello de botella: 1.2.0
tablas: ninguna
numexpr: 2.6.1
matplotlib: 1.5.3
openpyxl: Ninguno
xlrd: Ninguno
xlwt: Ninguno
xlsxwriter: Ninguno
lxml: Ninguno
bs4: Ninguno
html5lib: 0.999999999
httplib2: Ninguno
apiclient: Ninguno
sqlalchemy: 1.1.4
pymysql: Ninguno
psycopg2: Ninguno
jinja2: 2.9.3
boto: Ninguno
pandas_datareader: Ninguno

Bug IO CSV Unicode Windows

Comentario más útil

Si alguien viene aquí como yo porque tiene el mismo problema, aquí hay una solución hasta que los pandas estén arreglados para trabajar con pep 529 (básicamente, cualquier carácter no ascii en su ruta o nombre de archivo dará como resultado errores):

Inserte las siguientes dos líneas al principio de su código para volver a la forma anterior de manejar rutas en Windows:

import sys
sys._enablelegacywindowsfsencoding()

Todos 27 comentarios

Solo mis centavos valen. Lo probé rápidamente en Mac OSX y Ubuntu sin
problemas. Vea abajo.

¿Podría ser esto un problema de entorno / plataforma? Me di cuenta de que LOCALE es
establecido en None.None . Desafortunadamente, no tengo una máquina con Windows para probar esto
ejemplo en. Es cierto que esto no explicaría por qué ha visto esto después de la
actualice a python3.6 y pandas 0.19.2.

Nota: Acabo de configurar un virtualenv con python3.6 e instalé pandas 0.19.2 usando pip.

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

Salida de pd.show_versions ()


VERSIONES INSTALADAS

cometer: Ninguno
python: 3.6.0.final.0
bits de pitón: 64
SO: Linux
Versión del SO: 4.4.0-57-genérico
máquina: x86_64
procesador: x86_64
byteorder: pequeño
LC_ALL: Ninguno
IDIOMA: en_GB.UTF-8
LOCALE: en_GB.UTF-8

pandas: 0.19.2
nariz: ninguna
pip: 9.0.1
herramientas de configuración: 32.3.1
Cython: Ninguno
numpy: 1.11.3
scipy: Ninguno
statsmodels: Ninguno
xarray: Ninguno
IPython: Ninguno
esfinge: ninguna
patsy: Ninguno
dateutil: 2.6.0
pytz: 2016.10
blosc: Ninguno
cuello de botella: Ninguno
tablas: ninguna
numexpr: Ninguno
matplotlib: Ninguno
openpyxl: Ninguno
xlrd: Ninguno
xlwt: Ninguno
xlsxwriter: Ninguno
lxml: Ninguno
bs4: Ninguno
html5lib: Ninguno
httplib2: Ninguno
apiclient: Ninguno
sqlalchemy: Ninguno
pymysql: Ninguno
psycopg2: Ninguno
jinja2: Ninguno
boto: Ninguno
pandas_datareader: Ninguno

Creo que 3.6 cambia la codificación del sistema de archivos en Windows a utf8 (desde ascii). Aparte de eso, todavía no tenemos habilitada la prueba en Windows para 3.6 (ya que algunos de los paquetes requeridos recién ahora están disponibles).

@JGoutin

así que acabo de agregar soporte de compilación en appveyor (Windows) para 3.6, por lo que si empuja sus pruebas para ver si funciona, sería genial.

También enfrenté el mismo problema cuando el programa se detuvo en pd.read_csv (file_path). La situación es similar a la mía después de actualizar mi Python a 3.6 (no estoy seguro de que la última vez que instalé Python sea exactamente en qué versión, tal vez 3.5 ...).

@jreback ¿cuál es el siguiente paso hacia una solución aquí?
Usted ha mencionado un PR que se quedó 'impresionado', ¿qué significa?

Si bien no uso Windows, podría intentar ayudar (acabo de obtener una máquina virtual para depurar una parte de mi código que aparentemente no funciona en Windows)

Por cierto, una solución alternativa: pase un identificador de archivo en lugar de un nombre
pd.read_csv(open('test_é.txt', 'r'))
(hay varias soluciones en problemas relacionados, pero no he visto esta)

@tpietruszka vea los comentarios en el PR: https://github.com/pandas-dev/pandas/pull/15092 (se eliminó de una bifurcación privada, estaba prácticamente allí).

Básicamente, necesita codificar las rutas de manera diferente en py3.6 (frente a otras pitones) en las viudas. básicamente necesita implementar: https://docs.python.org/3/whatsnew/3.6.html#pep -529-change-windows-filesystem-encoding-to-utf-8

mi código anterior (no se puede ejecutar):

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

nuevo código (exitoso):

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

Creo que este error es un problema de nombre de archivo.
Cambio el nombre de archivo de chino a inglés, ya se puede ejecutar.

Si alguien viene aquí como yo porque tiene el mismo problema, aquí hay una solución hasta que los pandas estén arreglados para trabajar con pep 529 (básicamente, cualquier carácter no ascii en su ruta o nombre de archivo dará como resultado errores):

Inserte las siguientes dos líneas al principio de su código para volver a la forma anterior de manejar rutas en Windows:

import sys
sys._enablelegacywindowsfsencoding()

Utilizo la solución anterior y funciona. ¡Muchas gracias @fotisj !
Sin embargo, todavía estoy confundido sobre por qué DataFrame.to_csv () no ocurre el mismo problema. En otras palabras, para la ruta de archivo Unicode, la escritura está bien, mientras que la lectura no.

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

Tiene éxito.

¿Alguien con un sistema afectado puede verificar si cambia esta línea?

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

a

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

lo arregla?

No, no lo hace.
Da como resultado: OSError: nombre de ruta de archivo esperado u objeto similar a archivo, obtenidotipo
(en 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

Oh, lo siento. ¿Funciona fsdecode allí?


De: Fotis Jannidis [email protected]
Enviado: sábado 3 de febrero de 2018 8:00:13 a.m.
Para: pandas-dev / pandas
Cc: Tom Augspurger; Comentario
Asunto: Re: [pandas-dev / pandas] OSError al leer un archivo con acentos en la ruta del archivo (# 15086)

No, no lo hace.
Da como resultado: OSError: nombre de ruta de archivo esperado u objeto similar a archivo, obtenidotipo

-
Estás recibiendo esto porque comentaste.
Responda a este correo electrónico directamente, véalo en GitHub https://github.com/pandas-dev/pandas/issues/15086#issuecomment-362809602 , o silencie el hilo https://github.com/notifications/unsubscribe-auth/ ABQHIplv8thHxpjsP3knUCpET0Fjy0kLks5tRGZsgaJpZM4LeTSB .

No. El uso de fsdecode produce el mismo error que teníamos originalmente ( error_msg.txt )

Ok, gracias por intentarlo.


De: Fotis Jannidis [email protected]
Enviado: Sábado 3 de febrero de 2018 8:57:07 AM
Para: pandas-dev / pandas
Cc: Tom Augspurger; Comentario
Asunto: Re: [pandas-dev / pandas] OSError al leer un archivo con acentos en la ruta del archivo (# 15086)

No. El uso de fsdecode produce el mismo error que teníamos originalmente (error_msg.txt https://github.com/pandas-dev/pandas/files/1691837/error_msg.txt )

-
Estás recibiendo esto porque comentaste.
Responda a este correo electrónico directamente, véalo en GitHub https://github.com/pandas-dev/pandas/issues/15086#issuecomment-362818153 , o silencie el hilo https://github.com/notifications/unsubscribe-auth/ ABQHIpeYsj9Bv3OsoHAsOufXzU3AYSBSks5tRHPCgaJpZM4LeTSB .

Hablé con Steve Dower hoy, y sospecha que esta puede ser la línea problemática: https://github.com/pandas-dev/pandas/blob/e8f206d8192b409bc39da1ba1b2c5bcd8b65cc9f/pandas/_libs/src/parser/io.c#L30

IIUC, la API del sistema de archivos de Windows espera que esos bytes estén en el MBCS, pero estamos usando utf-8.

Una solución alternativa a nivel de usuario es codificar explícitamente su nombre de archivo como mbcs antes de pasar la cadena de bytes a pandas. https://www.python.org/dev/peps/pep-0529/#explicitly -using-mbcs

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

¿Alguien puede probar esa solución?

solo necesito un pequeño cambio en el código del analizador para solucionar esto (había un PR haciendo esto) pero fue eliminado

@TomAugspurger que no funciona. read_csv espera un str y no de bytes . Falla con

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

Gracias por revisar.

El viernes 20 de abril de 2018 a las 3:43 p.m., João D. Ferreira [email protected]
escribió:

@TomAugspurger https://github.com/TomAugspurger que no funciona.
read_csv espera un valor de str y no de bytes. Falla con

OSError: nombre de ruta de archivo esperado u objeto similar a archivo, obtenidotipo

-
Estás recibiendo esto porque te mencionaron.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/pandas-dev/pandas/issues/15086#issuecomment-383217062 ,
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/ABQHIiOHyt3sT7B0pHJuY5lB-cJtT5JHks5tqkiEgaJpZM4LeTSB
.

Solo hago ping a esto: tengo el mismo problema, estoy usando una solución alternativa, pero sería genial si no fuera necesario.

esto necesita un parche comunitario

Me encuentro con este problema. Quiero intentar contribuir con un parche. ¿Algún consejo sobre cómo empezar a arreglar esto?

Creo que ninguno de los mantenedores tiene acceso a un sistema que pueda reproducir esto.

Quizás algunos de los otros en este tema puedan ayudar a encontrar una solución.

Hola, tengo este problema en pandas 1.0.3 ahora y la solución sys._enablelegacywindowsfsencoding() dejó de funcionar. Tengo ą y ź en la ruta del archivo.
Recibo este error también en pandas 0.25.3 pero 0.23.4 parece estar funcionando bien cuando utilizo la solución alternativa (no verifiqué otras versiones). Estaré encantado de proporcionar cualquier información adicional.

Elimine el archivo del mismo nombre de carpeta como, si su archivo se almacenó en el mismo nombre de carpeta que el archivo.
Simplemente elimine el archivo de esa carpeta.
no almacene el archivo en el mismo nombre de carpeta.
entonces, funciona

@pranjulknit Si entiendo, sugieres mover el archivo a una carpeta sin estos caracteres problemáticos en la ruta. Esto no siempre es posible. Si sugiere que los nombres de las carpetas y los nombres de los archivos deben ser diferentes, este no es el problema que se describe aquí, nunca tuve problemas con eso.

En realidad, tengo este problema al leer el archivo csv desde el cuaderno jupyter.

¿Fue útil esta página
0 / 5 - 0 calificaciones