Проблема с загрузкой сжатого (.gz) .csv файла с URL-адреса - PullRequest
0 голосов
/ 12 июля 2020

Я пытаюсь загрузить с помощью Pandas CSV-файл прямо с URL-адреса. Файл csv сжимается как файл .gz:

#Importing libraries
import pandas as pd
import requests
import io

#defining the url
url = "https://data.brasil.io/dataset/covid19/caso_full.csv.gz"

Вот ошибка:

---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-28-58ebbb6aba80> in <module>
      7 url = "https://data.brasil.io/dataset/covid19/caso_full.csv.gz"
      8 s=requests.get(url).content
----> 9 df=pd.read_csv(io.StringIO(s.decode('utf-8')), sep=',', compression='gzip', index_col=0, quotechar='"')
     10 
     11 #df=pd.read_csv("caso_full.csv.gz")

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte


    s=requests.get(url).content
    df=pd.read_csv(io.StringIO(s.decode('utf-8')), sep=',', compression='gzip', index_col=0, quotechar='"')

Если я загружаю файл напрямую, при его открытии ошибки не возникает:

#Importing libraries
import pandas as pd
df=pd.read_csv("caso_full.csv.gz")

Есть какие-нибудь подсказки, почему это происходит?

Спасибо!

1 Ответ

1 голос
/ 12 июля 2020

Проблема в том, что вы декодируете контент, а затем используете io.StringIO.

Решение состоит в том, чтобы не декодировать байты и использовать io.BytesIO.

См. Этот ответ на переполнение стека : { ссылка }

URL возвращает содержимое в формате GNU ZIP. pd.read_csv ожидает путь к файлу или буфер в качестве первого аргумента. Поскольку содержимое является байтовым, необходимо использовать объект io.BytesIO. Pandas затем обрабатывает распаковку данных в файл CSV.

import io
import pandas as pd
import requests

# defining the url
url = "https://data.brasil.io/dataset/covid19/caso_full.csv.gz"
response = requests.get(url)
content = response.content
print(type(content))
df = pd.read_csv(
    io.BytesIO(content), sep=",", compression="gzip", index_col=0, quotechar='"',
)
print(df.head())

ВЫХОД:

<class 'bytes'>
city_ibge_code        date  epidemiological_week  estimated_population_2019  ...  place_type  state  new_confirmed  new_deaths
city                                                                                    ...
São Paulo       3550308.0  2020-02-25                     9                 12252023.0  ...        city     SP              1           0
NaN                  35.0  2020-02-25                     9                 45919049.0  ...       state     SP              1           0
São Paulo       3550308.0  2020-02-26                     9                 12252023.0  ...        city     SP              0           0
NaN                  35.0  2020-02-26                     9                 45919049.0  ...       state     SP              0           0
São Paulo       3550308.0  2020-02-27                     9                 12252023.0  ...        city     SP              0           0

[5 rows x 16 columns]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...