2017-09-10 2 views
2

Je développe une application avec Python et une interface graphique QT. Je dois importer un fichier dans un DataFrame. J'utilise un QFileDialog.getOpenFileName pour obtenir le chemin et le nom de fichier pour l'ouvrir avec la méthode pandas.read_csv. Tout fonctionne bien jusqu'à ce que je reçois un chemin avec des caractères spéciaux comme "ó". Le pandas.read_csv ne fonctionne pas et plante l'application.pandas.read_csv ne peut pas importer de fichier avec une marque d'accentuation dans le chemin

J'essaie de reproduire l'erreur dans la console et les résultats suivants:

In[2]: import pandas as pd 
Backend Qt5Agg is interactive backend. Turning interactive mode on. 

In[3]: path1 = 'F:/Software_Proyects/Python/Proyectos/test_read_csv/FlowData.txt' 
In[4]: df1 = pd.read_csv(path1, delim_whitespace=True, dtype=object) 

In[5]: path2 = 'F:/Software_Proyects/Python/Proyectos/test_read_csv_with_ó/FlowData.txt' 
In[6]: df2 = pd.read_csv(path2, delim_whitespace=True, dtype=object) 
Traceback (most recent call last): 
    File "C:\Program Files (x86)\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py", line 2881, in run_code 
    exec(code_obj, self.user_global_ns, self.user_ns) 
    File "<ipython-input-6-feba8e024d43>", line 1, in <module> 
    df2 = pd.read_csv(path2, delim_whitespace=True, dtype=object) 
    File "C:\Program Files (x86)\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 646, in parser_f 
    return _read(filepath_or_buffer, kwds) 
    File "C:\Program Files (x86)\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 389, in _read 
    parser = TextFileReader(filepath_or_buffer, **kwds) 
    File "C:\Program Files (x86)\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 730, in __init__ 
    self._make_engine(self.engine) 
    File "C:\Program Files (x86)\Anaconda3\lib\site-packages\pandas\io\parsers.py", line 923, in _make_engine 
    self._engine = CParserWrapper(self.f, **self.options) 
    File "C:\Program Files (x86)\Anaconda3\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 

la sortie show_versions() est:

In[7]: pd.show_versions() 

INSTALLED VERSIONS 
------------------ 
commit: None 
python: 3.6.0.final.0 
python-bits: 32 
OS: Windows 
OS-release: 10 
machine: AMD64 
processor: Intel64 Family 6 Model 78 Stepping 3, GenuineIntel 
byteorder: little 
LC_ALL: None 
LANG: None 
LOCALE: None.None 

pandas: 0.19.2 
nose: 1.3.7 
pip: 9.0.1 
setuptools: 27.2.0 
Cython: 0.25.2 
numpy: 1.11.3 
scipy: 0.18.1 
statsmodels: 0.6.1 
xarray: None 
IPython: 5.1.0 
sphinx: 1.5.1 
patsy: 0.4.1 
dateutil: 2.6.0 
pytz: 2016.10 
blosc: None 
bottleneck: 1.2.0 
tables: 3.2.2 
numexpr: 2.6.1 
matplotlib: 2.0.0 
openpyxl: 2.4.1 
xlrd: 1.0.0 
xlwt: 1.2.0 
xlsxwriter: 0.9.6 
lxml: 3.7.2 
bs4: 4.5.3 
html5lib: None 
httplib2: None 
apiclient: None 
sqlalchemy: 1.1.5 
pymysql: None 
psycopg2: None 
jinja2: 2.9.4 
boto: 2.45.0 
pandas_datareader: None 

Comme je l'ai lu dans ce post Encoding with pandas.read_csv when file name has accents le problème a été corrigé dans pandas 0.14.0.

Une recommandation pour résoudre ce problème?

+0

peut-être essayer 'pd.read_csv (chemin1, delim_whitespace = True, DTYPE = objet, encoding = » utf-8 ') 'ou un autre de cette liste: https://docs.python.org/3/library/codecs.html#standard-encodings – Protostome

+0

vous pourriez vouloir vérifier [ce problème] (https: // github .com/pandas-dev/pandas/issues/15086) – MaxU

+1

@Protostome, merci pour votre réponse, je l'ai essayé mais ça ne marche pas. Je pense que l'option d'encodage de read_csv est pour le contenu du fichier et non pour le chemin vers le fichier. Le fichier est importé sans problème, le problème vient quand le chemin du fichier a des caractères spéciaux – jmejias

Répondre

0

vous pouvez essayer ces lignes de code dans votre ordinateur portable/ipython avant de lire avec un encodage utf-8:

import sys 
reload(sys) 
sys.setdefaultencoding('utf-8') 

puis lors de la lecture de votre fichier utiliser les lignes comme Suggest dans le commentaire

pd.read_csv(path1, delim_whitespace=True, dtype=object,encoding='utf-8') 
+0

Bonjour @Espoir. J'ai essayé ces commandes mais cela ne fonctionne pas, regardant pourquoi j'ai trouvé que ces commandes sont pour Python 2. En Python 3 l'encodage par défaut est 'utf-8' et la méthode setdefaultencoding() a été supprimée du module sys. Pour utiliser reload (sys) sur Python> = 3.4, je suis l'exemple suivant: https: //stackoverflow.com/questions/961162/reloading-module-giving-nameerror-name-reload-is-not-defined – jmejias

1

En recherchant en profondeur, ce comportement vient dans une combinaison de Python 3.6 et pandas.read_csv seulement dans les systèmes Windows.

Python 3.6 modifie le codage du système de fichiers Windows de "mbcs" à "UTF-8". Voir Python PEP 529. Utilisez sys.getfilesystemencoding() pour obtenir le système de fichiers en cours de codage

Je reçois des solutions autour de cette:

1.- Utilisez ce code pour changer toute l'application aux travaux avec l'avant Python < = 3,5 encodage (« MBCS »)

import sys 
sys._enablelegacywindowsfsencoding() 

2.- passer un pointeur de fichier au pandas.read_csv

with open(path2, 'r') as fp: 
    df2 = pd.read_csv(fp, delim_whitespace=True, dtype=object)