Pandas: OSError lors de la lecture d'un fichier avec des accents dans le chemin du fichier

Créé le 9 janv. 2017  ·  27Commentaires  ·  Source: pandas-dev/pandas

Exemple de code, un exemple copiable si possible

test.txt et test_é.txt sont le même fichier, seul le nom change:

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

Description du problème

Les pandas renvoient OSError lors de la tentative de lecture d'un fichier avec des accents dans le chemin du fichier.

Le problème est nouveau (depuis que j'ai mis à niveau vers Python 3.6 et Pandas 0.19.2)

Sortie de pd.show_versions()

VERSIONS INSTALLÉES

commit: aucun
python: 3.6.0.final.0
bits python: 64
OS: Windows
Version du système d'exploitation: 7
machine: AMD64
Processeur: Intel64 Family 6 Model 94 Stepping 3, Genuine Intel
byteorder: petit
LC_ALL: Aucun
LANG: fr
LOCALE: Aucun. Aucun

pandas: 0.19.2
nez: Aucun
pip: 9.0.1
setuptools: 32.3.1
Cython: 0,25,2
numpy: 1.11.3
scipy: 0,18,1
statsmodels: Aucun
xarray: Aucun
IPython: 5.1.0
sphinx: 1.5.1
patsy: Aucun
dateutil: 2.6.0
pytz: 2016.10
blosc: Aucun
goulot d'étranglement: 1.2.0
tableaux: Aucun
numexpr: 2.6.1
matplotlib: 1.5.3
openpyxl: Aucun
xlrd: Aucun
xlwt: Aucun
xlsxwriter: Aucun
lxml: Aucun
bs4: Aucun
html5lib: 0.999999999
httplib2: Aucun
apiclient: Aucun
sqlalchemy: 1.1.4
pymysql: Aucun
psycopg2: Aucun
jinja2: 2.9.3
boto: Aucun
pandas_datareader: Aucun

Bug IO CSV Unicode Windows

Commentaire le plus utile

Si quelqu'un vient ici comme moi parce qu'il / elle a rencontré le même problème, voici une solution jusqu'à ce que pandas soit corrigé pour fonctionner avec pep 529 (en gros, tous les caractères non ascii dans votre chemin ou votre nom de fichier entraîneront des erreurs):

Insérez les deux lignes suivantes au début de votre code pour revenir à l'ancienne méthode de gestion des chemins sur Windows:

import sys
sys._enablelegacywindowsfsencoding()

Tous les 27 commentaires

Juste mes centimes. Je l'ai rapidement essayé sur Mac OSX et Ubuntu sans
problèmes. Voir ci-dessous.

Cela pourrait-il être un problème d'environnement / de plate-forme? J'ai remarqué que le LOCALE est
défini sur None.None . Malheureusement, je n'ai pas de machine Windows pour essayer ceci
exemple sur. Certes, cela n'explique pas pourquoi vous avez vu cela après le
mise à niveau vers python3.6 et pandas 0.19.2.

Remarque: je viens de configurer un virtualenv avec python3.6 et d'installer pandas 0.19.2 à l'aide de pip.

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

Sortie de pd.show_versions ()


VERSIONS INSTALLÉES

commit: aucun
python: 3.6.0.final.0
bits python: 64
OS: Linux
Version du système d'exploitation: 4.4.0-57-générique
machine: x86_64
processeur: x86_64
byteorder: petit
LC_ALL: Aucun
LANG: en_GB.UTF-8
LOCALE: en_GB.UTF-8

pandas: 0.19.2
nez: Aucun
pip: 9.0.1
setuptools: 32.3.1
Cython: aucun
numpy: 1.11.3
scipy: Aucun
statsmodels: Aucun
xarray: Aucun
IPython: aucun
sphinx: Aucun
patsy: Aucun
dateutil: 2.6.0
pytz: 2016.10
blosc: Aucun
goulot d'étranglement: aucun
tableaux: Aucun
numexpr: Aucun
matplotlib: Aucun
openpyxl: Aucun
xlrd: Aucun
xlwt: Aucun
xlsxwriter: Aucun
lxml: Aucun
bs4: Aucun
html5lib: Aucun
httplib2: Aucun
apiclient: Aucun
sqlalchemy: Aucun
pymysql: Aucun
psycopg2: Aucun
jinja2: Aucun
boto: Aucun
pandas_datareader: Aucun

Je crois que 3.6 bascule le codage du système de fichiers sur Windows en utf8 (de ascii). En dehors de cela, nous n'avons pas encore d'activation de test sur Windows pour la version 3.6 (car certains des packages requis sont en train de devenir disponibles).

@JGoutin

donc je viens d'ajouter le support de compilation sur appveyor (windows) pour la version 3.6, donc si vous augmentiez vos tests pour voir si cela fonctionne, ce serait génial.

J'ai également rencontré le même problème lorsque le programme s'est arrêté à pd.read_csv (file_path). La situation est similaire à moi après avoir mis à niveau mon python vers la version 3.6 (je ne suis pas sûr que la dernière fois que le python que j'ai installé est exactement de quelle version, peut-être 3.5 ...).

@jreback quelle est la prochaine étape vers une solution ici?
Vous avez mentionné un PR qui a été époustouflé - qu'est-ce que cela signifie?

Bien que je n'utilise pas Windows, je pourrais essayer d'aider (j'ai juste une VM pour déboguer un morceau de mon code qui ne fonctionne apparemment pas sous Windows)

BTW, une solution de contournement: passez un descripteur de fichier au lieu d'un nom
pd.read_csv(open('test_é.txt', 'r'))
(il existe plusieurs solutions de contournement dans les problèmes connexes, mais je n'ai pas vu celui-ci)

@tpietruszka voir les commentaires sur le PR: https://github.com/pandas-dev/pandas/pull/15092 (il a été retiré d'un fork privé, était à peu près là).

vous devez fondamentalement encoder les chemins différemment sur py3.6 (par rapport aux autres pythons) sur wnidows. essentiellement besoin de mettre en œuvre: https://docs.python.org/3/whatsnew/3.6.html#pep -529-change-windows-filesystem-encoding-to-utf-8

mon ancien code (ne peut pas fonctionner):

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

nouveau code (réussi):

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

Je pense que ce bug est un problème de nom de fichier.
Je change le nom de fichier du chinois en anglais, il peut fonctionner maintenant.

Si quelqu'un vient ici comme moi parce qu'il / elle a rencontré le même problème, voici une solution jusqu'à ce que pandas soit corrigé pour fonctionner avec pep 529 (en gros, tous les caractères non ascii dans votre chemin ou votre nom de fichier entraîneront des erreurs):

Insérez les deux lignes suivantes au début de votre code pour revenir à l'ancienne méthode de gestion des chemins sur Windows:

import sys
sys._enablelegacywindowsfsencoding()

J'utilise la solution ci-dessus et cela fonctionne. Merci beaucoup @fotisj !
Cependant, je ne comprends toujours pas pourquoi DataFrame.to_csv () ne pose pas le même problème. En d'autres termes, pour le chemin du fichier Unicode, l'écriture est correcte, tandis que la lecture ne l'est pas.

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

C'est réussi.

Quelqu'un avec un système affecté peut-il vérifier si vous modifiez cette ligne

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

à

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

le corrige?

Non.
Résultats dans: OSError: Nom du chemin de fichier attendu ou objet semblable à un fichier, obtenutype
(sous 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 pardon. Est-ce que fsdecode fonctionne là-bas?


De: Fotis Jannidis [email protected]
Envoyé: samedi 3 février 2018 08:00:13
À: pandas-dev / pandas
Cc: Tom Augspurger; Commentaire
Objet: Re: [pandas-dev / pandas] OSError lors de la lecture d'un fichier avec des accents dans le chemin du fichier (# 15086)

Non.
Résultats dans: OSError: Nom du chemin de fichier attendu ou objet semblable à un fichier, obtenutype

-
Vous recevez ceci parce que vous avez commenté.
Répondez directement à cet e-mail, visualisez-le sur GitHub https://github.com/pandas-dev/pandas/issues/15086#issuecomment-362809602 , ou désactivez le fil https://github.com/notifications/unsubscribe-auth/ ABQHIplv8thHxpjsP3knUCpET0Fjy0kLks5tRGZsgaJpZM4LeTSB .

Non. L'utilisation de fsdecode produit la même erreur que nous avions à l'origine ( error_msg.txt )

Ok merci d'avoir essayé.


De: Fotis Jannidis [email protected]
Envoyé: samedi 3 février 2018 08:57:07
À: pandas-dev / pandas
Cc: Tom Augspurger; Commentaire
Objet: Re: [pandas-dev / pandas] OSError lors de la lecture d'un fichier avec des accents dans le chemin du fichier (# 15086)

Non. L'utilisation de fsdecode produit la même erreur que nous avions à l'origine (error_msg.txt https://github.com/pandas-dev/pandas/files/1691837/error_msg.txt )

-
Vous recevez ceci parce que vous avez commenté.
Répondez directement à cet e-mail, affichez-le sur GitHub https://github.com/pandas-dev/pandas/issues/15086#issuecomment-362818153 , ou désactivez le fil https://github.com/notifications/unsubscribe-auth/ ABQHIpeYsj9Bv3OsoHAsOufXzU3AYSBSks5tRHPCgaJpZM4LeTSB .

Parlé avec Steve Dower aujourd'hui, et il soupçonne que c'est peut-être la ligne problématique: https://github.com/pandas-dev/pandas/blob/e8f206d8192b409bc39da1ba1b2c5bcd8b65cc9f/pandas/_libs/src/parser/io.c#L30

IIUC, l'API du système de fichiers Windows s'attend à ce que ces octets soient dans le MBCS, mais nous utilisons utf-8.

Une solution de contournement au niveau de l'utilisateur consiste à encoder explicitement votre nom de fichier en tant que mbcs avant de transmettre la chaîne d'octets aux pandas. https://www.python.org/dev/peps/pep-0529/#explicitly -using-mbcs

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

est-ce que quelqu'un peut tester cette solution de contournement?

juste besoin d'un petit changement dans le code de l'analyseur pour résoudre ce problème (il y avait un PR faisant cela) mais a été supprimé

@TomAugspurger qui ne fonctionne pas. read_csv attend une str et non une bytes . Il échoue avec

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

Merci d'avoir vérifié.

Le ven 20 avril 2018 à 15:43, João D. Ferreira [email protected]
a écrit:

@TomAugspurger https://github.com/TomAugspurger qui ne fonctionne pas.
read_csv attend un str et non une valeur d'octets. Il échoue avec

OSError: nom de chemin de fichier attendu ou objet de type fichier, obtenutype

-
Vous recevez cela parce que vous avez été mentionné.
Répondez directement à cet e-mail, affichez-le sur GitHub
https://github.com/pandas-dev/pandas/issues/15086#issuecomment-383217062 ,
ou couper le fil
https://github.com/notifications/unsubscribe-auth/ABQHIiOHyt3sT7B0pHJuY5lB-cJtT5JHks5tqkiEgaJpZM4LeTSB
.

Il suffit de cingler ceci - j'ai le même problème, j'utilise une solution de contournement, mais ce serait génial si cela n'était pas nécessaire.

cela nécessite un correctif communautaire

Je rencontre ce problème. Je veux essayer de contribuer à un patchc Des conseils pour commencer à résoudre ce problème?

Je pense qu'aucun des responsables n'a accès à un système capable de reproduire cela.

Peut-être que certains des autres articles de ce numéro peuvent aider à trouver une solution.

Salut, j'ai ce problème sur les pandas 1.0.3 maintenant et la solution sys._enablelegacywindowsfsencoding() contournement ą et ź dans le chemin du fichier.
J'obtiens également cette erreur sur les pandas 0.25.3 mais 0.23.4 semble fonctionner correctement lors de l'utilisation de la solution de contournement (je n'ai pas vérifié les autres versions). Je serai ravi de vous fournir des informations supplémentaires.

Supprimez le fichier du même nom de dossier, par exemple, si votre fichier est stocké dans le même nom de dossier que le fichier.
Supprimez simplement le fichier de ce dossier.
ne stockez pas le fichier sous le même nom de dossier.
alors ça marche

@pranjulknit Si je comprends bien, vous suggérez de déplacer le fichier vers un dossier sans ces caractères problématiques dans le chemin. Ce n'est pas toujours possible. Si vous suggérez que les noms de dossier et les noms de fichier doivent être différents - ce n'est pas le problème qui est décrit ici, je n'ai jamais eu de problèmes avec cela.

En fait, j'ai ce problème lors de la lecture du fichier csv du notebook jupyter.

Cette page vous a été utile?
0 / 5 - 0 notes