Pandas: OSError ao ler o arquivo com acentos no caminho do arquivo

Criado em 9 jan. 2017  ·  27Comentários  ·  Fonte: pandas-dev/pandas

Amostra de código, um exemplo copiável e colável, se possível

test.txt e test_é.txt são o mesmo arquivo, apenas o nome muda:

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

Descrição do Problema

O Pandas retorna OSError ao tentar ler um arquivo com acentos no caminho do arquivo.

O problema é novo (desde que atualizei para Python 3.6 e Pandas 0.19.2)

Resultado de pd.show_versions()

VERSÕES INSTALADAS

commit: Nenhum
python: 3.6.0.final.0
python-bits: 64
SO: Windows
Versão do SO: 7
máquina: AMD64
processador: Intel64 Family 6 Model 94 Stepping 3, GenuineIntel
byteorder: pouco
LC_ALL: Nenhum
LANG: fr
LOCALE: Nenhum. Nenhum

pandas: 0.19.2
nariz: nenhum
pip: 9.0.1
ferramentas de configuração: 32.3.1
Cython: 0.25.2
numpy: 1.11.3
scipy: 0.18.1
modelos de estatísticas: nenhum
xarray: Nenhum
IPython: 5.1.0
esfinge: 1.5.1
patsy: nenhum
dateutil: 2.6.0
pytz: 2016.10
blosc: nenhum
gargalo: 1.2.0
tabelas: Nenhum
numexpr: 2.6.1
matplotlib: 1.5.3
openpyxl: Nenhum
xlrd: Nenhum
xlwt: Nenhum
xlsxwriter: Nenhum
lxml: Nenhum
bs4: Nenhum
html5lib: 0,999999999
httpplib2: Nenhum
apiclient: Nenhum
sqlalchemy: 1.1.4
pymysql: Nenhum
psycopg2: Nenhum
jinja2: 2.9.3
boto: Nenhum
pandas_datareader: Nenhum

Bug IO CSV Unicode Windows

Comentários muito úteis

Se alguém vier aqui como eu porque encontrou o mesmo problema, aqui está uma solução até que o pandas seja corrigido para funcionar com pep 529 (basicamente qualquer caractere não ASCII em seu caminho ou nome de arquivo resultará em erros):

Insira as duas linhas a seguir no início de seu código para voltar à maneira antiga de lidar com caminhos em janelas:

import sys
sys._enablelegacywindowsfsencoding()

Todos 27 comentários

Apenas meus centavos vale a pena. Testei rapidamente no Mac OSX e Ubuntu sem
problemas. Ver abaixo.

Isso poderia ser um problema de ambiente / plataforma? Notei que LOCALE é
definido como None.None . Infelizmente não tenho uma máquina Windows para tentar isso
exemplo em. Admito que isso não explicaria por que você viu isso depois do
atualize para python3.6 e pandas 0.19.2.

Nota: Acabei de configurar um virtualenv com python3.6 e instalei o 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

Saída de pd.show_versions ()


VERSÕES INSTALADAS

commit: Nenhum
python: 3.6.0.final.0
python-bits: 64
SO: Linux
Versão do SO: 4.4.0-57-genérico
máquina: x86_64
processador: x86_64
byteorder: pouco
LC_ALL: Nenhum
LANG: en_GB.UTF-8
LOCALE: en_GB.UTF-8

pandas: 0.19.2
nariz: nenhum
pip: 9.0.1
ferramentas de configuração: 32.3.1
Cython: Nenhum
numpy: 1.11.3
scipy: nenhum
modelos de estatísticas: nenhum
xarray: Nenhum
IPython: Nenhum
esfinge: nenhuma
patsy: nenhum
dateutil: 2.6.0
pytz: 2016.10
blosc: nenhum
gargalo: Nenhum
tabelas: Nenhum
numexpr: nenhum
matplotlib: Nenhum
openpyxl: Nenhum
xlrd: Nenhum
xlwt: Nenhum
xlsxwriter: Nenhum
lxml: Nenhum
bs4: Nenhum
html5lib: Nenhum
httpplib2: Nenhum
apiclient: Nenhum
sqlalchemy: Nenhum
pymysql: Nenhum
psycopg2: Nenhum
jinja2: Nenhum
boto: Nenhum
pandas_datareader: Nenhum

Eu acredito que 3.6 muda a codificação do sistema de arquivos no windows para utf8 (de ascii). Além disso, ainda não temos o testing enable no Windows para 3.6 (já que alguns dos pacotes necessários estão agora disponíveis).

@JGoutin

então, acabei de adicionar suporte de compilação no appveyor (windows) para 3.6, portanto, se você forçar seus testes para ver se funciona, seria ótimo.

Também enfrentei o mesmo problema quando o programa parou em pd.read_csv (file_path). A situação é semelhante a minha depois que atualizei meu python para 3.6 (não tenho certeza se a última vez que o python que instalei é exatamente qual versão, talvez 3.5 ......).

@jreback qual é o próximo passo para corrigir isso?
Você mencionou um PR que foi 'surpreendido' - o que significa?

Embora eu não use o Windows, poderia tentar ajudar (acabei de obter uma VM para depurar um trecho do meu código que aparentemente não funciona no Windows)

BTW, uma solução alternativa: passe um identificador de arquivo em vez de um nome
pd.read_csv(open('test_é.txt', 'r'))
(existem várias soluções alternativas para problemas relacionados, mas eu não vi esta)

@tpietruszka veja os comentários no PR: https://github.com/pandas-dev/pandas/pull/15092 (foi removido de um fork privado, estava praticamente lá).

você basicamente precisa codificar os caminhos de maneira diferente no py3.6 (em comparação com outros pythons) no wnidows. basicamente precisa implementar: https://docs.python.org/3/whatsnew/3.6.html#pep -529-change-windows-filesystem-encoding-to-utf-8

meu código antigo (não pode ser executado):

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

novo código (sucesso):

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

Acho que esse bug é um problema de nome de arquivo.
Eu mudo o nome do arquivo de chinês para inglês, ele pode ser executado agora.

Se alguém vier aqui como eu porque encontrou o mesmo problema, aqui está uma solução até que o pandas seja corrigido para funcionar com pep 529 (basicamente qualquer caractere não ASCII em seu caminho ou nome de arquivo resultará em erros):

Insira as duas linhas a seguir no início de seu código para voltar à maneira antiga de lidar com caminhos em janelas:

import sys
sys._enablelegacywindowsfsencoding()

Eu uso a solução acima e funciona. Muito obrigado @fotisj !
No entanto, ainda estou confuso sobre porque DataFrame.to_csv () não ocorre o mesmo problema. Em outras palavras, para o caminho do arquivo Unicode, a escrita está ok, enquanto a leitura não.

path = os.path.join ('E: \ 语料', 'sina.csv')
pd.read_csv (abrir (caminho, 'r', codificação = 'utf8'))

É um sucesso.

Alguém com um sistema afetado pode verificar se está mudando esta linha

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

para

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

corrige isso?

Não, não tem.
Resultados em: OSError: Nome do caminho do arquivo esperado ou objeto semelhante a arquivo, obtidotipo
(no 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, desculpe. O fsdecode funciona lá?


De: Fotis Jannidis [email protected]
Enviado: sábado, 3 de fevereiro de 2018 às 8:00:13
Para: pandas-dev / pandas
Cc: Tom Augspurger; Comente
Assunto: Re: [pandas-dev / pandas] OSError ao ler o arquivo com acentos no caminho do arquivo (# 15086)

Não, não tem.
Resultados em: OSError: Nome do caminho do arquivo esperado ou objeto semelhante a arquivo, obtidotipo

-
Você está recebendo isto porque comentou.
Responda diretamente a este e-mail, visualize-o no GitHub https://github.com/pandas-dev/pandas/issues/15086#issuecomment-362809602 ou ignore o tópico https://github.com/notifications/unsubscribe-auth/ ABQHIplv8thHxpjsP3knUCpET0Fjy0kLks5tRGZsgaJpZM4LeTSB .

Não. Usar fsdecode produz o mesmo erro que tínhamos originalmente ( error_msg.txt )

Ok, obrigado por tentar.


De: Fotis Jannidis [email protected]
Enviado: sábado, 3 de fevereiro de 2018 8:57:07
Para: pandas-dev / pandas
Cc: Tom Augspurger; Comente
Assunto: Re: [pandas-dev / pandas] OSError ao ler o arquivo com acentos no caminho do arquivo (# 15086)

Não. Usar fsdecode produz o mesmo erro que originalmente tínhamos (error_msg.txt https://github.com/pandas-dev/pandas/files/1691837/error_msg.txt )

-
Você está recebendo isto porque comentou.
Responda a este e-mail diretamente, visualize-o no GitHub https://github.com/pandas-dev/pandas/issues/15086#issuecomment-362818153 ou ignore o tópico https://github.com/notifications/unsubscribe-auth/ ABQHIpeYsj9Bv3OsoHAsOufXzU3AYSBSks5tRHPCgaJpZM4LeTSB .

Conversei com Steve Dower hoje, e ele suspeita que esta pode ser a linha problemática: https://github.com/pandas-dev/pandas/blob/e8f206d8192b409bc39da1ba1b2c5bcd8b65cc9f/pandas/_libs/src/parser/io.c#L30

IIUC, a API do sistema de arquivos do Windows espera que esses bytes estejam no MBCS, mas estamos usando utf-8.

Uma solução alternativa no nível do usuário é codificar explicitamente o nome do arquivo como mbcs antes de passar a cadeia de bytes para o pandas. https://www.python.org/dev/peps/pep-0529/#explicitly -using-mbcs

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

alguém é capaz de testar essa solução alternativa?

só preciso de uma pequena mudança no código do analisador para corrigir isso (havia um PR fazendo isso), mas foi excluído

@TomAugspurger que não funciona. read_csv espera um str e não um bytes . Falha com

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

Obrigado por verificar.

Na sexta-feira, 20 de abril de 2018 às 15h43, João D. Ferreira [email protected]
escrevi:

@TomAugspurger https://github.com/TomAugspurger que não funciona.
read_csv espera um valor str e não bytes. Falha com

OSError: Nome do caminho do arquivo esperado ou objeto semelhante a arquivo, obtidotipo

-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/pandas-dev/pandas/issues/15086#issuecomment-383217062 ,
ou silenciar o tópico
https://github.com/notifications/unsubscribe-auth/ABQHIiOHyt3sT7B0pHJuY5lB-cJtT5JHks5tqkiEgaJpZM4LeTSB
.

Estou apenas executando o ping - tenho o mesmo problema, estou usando uma solução alternativa, mas seria ótimo se isso não fosse necessário.

isso precisa de um patch da comunidade

Estou encontrando esse problema. Eu quero tentar contribuir com um patchc. Alguma sugestão sobre como começar a consertar isso?

Acho que nenhum dos mantenedores tem acesso a um sistema que pode reproduzir isso.

Talvez alguns dos outros nesta edição possam ajudar a encontrar uma solução.

Olá, tenho este problema nos pandas 1.0.3 agora e a solução alternativa sys._enablelegacywindowsfsencoding() parou de funcionar. Tenho ą e ź no caminho do arquivo.
Também recebo este erro nos pandas 0.25.3 mas 0.23.4 parece estar funcionando bem ao usar a solução alternativa (não verifiquei as outras versões). Terei todo o gosto em fornecer quaisquer informações adicionais.

Remova o arquivo do mesmo nome de pasta, se o seu arquivo estiver armazenado no mesmo nome de pasta do arquivo.
Apenas remova o arquivo dessa pasta.
não armazene o arquivo no mesmo nome de pasta.
então funciona

@pranjulknit Se bem entendi, você sugere mover o arquivo para uma pasta sem esses caracteres problemáticos no caminho. Isto nem sempre é possível. Se você sugerir que os nomes das pastas e dos arquivos sejam diferentes - esse não é o problema descrito aqui, nunca tive problemas com isso.

Na verdade, eu tenho esse problema ao ler o arquivo csv do notebook jupyter.

Esta página foi útil?
0 / 5 - 0 avaliações