Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Estou tentando ler um arquivo CSV

import pandas as pd

url_dados= "https://dados.educacao.sp.gov.br/sites/default/files/VW_MENSAL_ALUNOS_ESTRANGEIROS_POR_NACIONALIDADE_31032021.csv"

dados = pd.read_csv(url_dados)

ParserError Traceback (most recent call last) in () 3 url_dados= "https://dados.educacao.sp.gov.br/sites/default/files/VW_MENSAL_ALUNOS_ESTRANGEIROS_POR_NACIONALIDADE_31032021.csv" 4 ----> 5 dados= pd.read_csv(url_dados) 6 dados

3 frames /usr/local/lib/python3.7/dist-packages/pandas/io/parsers.py in read(self, nrows) 2155 def read(self, nrows=None): 2156 try: -> 2157 data = self.reader.read(nrows) 2158 except StopIteration: 2159 if self.first_chunk:

pandas/libs/parsers.pyx in pandas.libs.parsers.TextReader.read()

pandas/libs/parsers.pyx in pandas.libs.parsers.TextReader.readlow_memory()

pandas/libs/parsers.pyx in pandas.libs.parsers.TextReader.readrows()

pandas/libs/parsers.pyx in pandas.libs.parsers.TextReader.tokenizerows()

pandas/libs/parsers.pyx in pandas.libs.parsers.raise_parser_error()

ParserError: Error tokenizing data. C error: Expected 1 fields in line 320, saw 2

2 respostas
solução!

Oi Larissa,

Pandas é uma ferramenta poderosa, por vezes vingativa... nem sempre os erros são claro e ai geralmente cabe uma análise exploratória dos dados, no seu caso em específico foi fácil de achar, mas nem sempre é.

Olhando para o erro em si, geralmente se lê de baixo para cima, então sabemos que na linha 320 era esperado um campo (field), e na verdade foram recebidos 2. O que isso quer dizer? O seu arquivo é um arquivo CSV (comma separeted value), e como você não passou para o pandas qual era o separador ele assume por default que é ','. Porém, se você abrir o arquivo (e ai foi preciso baixar e abrir no bloco de notas) você repara que seu arquivo é na verdade separado por ';'.

O que o pandas fez? Como você não passou o separador, ele assumiu que era virgula, logo na primeira linha ele imaginou que todos os campos eram uma unica coluna. E como a primeira linha estava nesse formato, o pandas também assumiu que sua tabela só tinha uma coluna. Até que na linha 320 você tem a informção "Virgens Americanas, Ilhas" que possui uma ",", e ai o pandas que já estava certo que sua tabela tinha apenas uma coluna, achou a virgula e tentou dividir apenas aquela linha em 2, gerando o erro (era esperado um campo, porém eu vi 2 na linha 320).

Como resolver? Simples, passando informações extra na sua função:

import pandas as pd

url_dados= "https://dados.educacao.sp.gov.br/sites/default/files/VW_MENSAL_ALUNOS_ESTRANGEIROS_POR_NACIONALIDADE_31032021.csv"

dados = pd.read_csv(url_dados, sep=';') #agora o pandas vai assumir que o separador de colunas é ';' e que sua tabela na verdade tem 9 colunas.

Abs!

Super obg!!