Как мне манипулировать данными, не сохраняя их локально - PullRequest
0 голосов
/ 03 ноября 2019

Моя цель - получить доступ к некоторым данным с веб-сайта и поместить эти данные в память (НЕ загружать локально), чтобы я мог провести дальнейшие манипуляции. Вот мой код Python:

import pandas as pd 
import requests
from requests.auth import HTTPBasicAuth

year = 2019
month_str = 'Jan'
date = 2
month = 1

user = XXXX
password = XXXX

response = requests.get('http_some_url/%i/%s/%02d/%i%02d%02d.gz' % (year,month_str,date,year,month,date), auth = HTTPBasicAuth(user, password))
x = pd.read_csv(response.text, compression='gzip', sep = '|')
print(x.head())

Данные находятся в папке "year" => "month_str" => "date" с именем файла "year + month + date.gz". когда я запускаю этот код, он возвращает

"ValueError: embedded null byte". 

Какой правильный способ сделать это?

update:

print(response)
<Response [200]>

, когда я печатаю ответ, он возвращает 200, что означает, что в нем что-то есть.

update:

response = requests.get('http_some_url/%i/%s/%02d/%i%02d%02d.gz' % (year,month_str,date,year,month,date), auth = HTTPBasicAuth(user, password))
print(response)
x = pd.read_csv(response.content, compression='gzip', sep = '|')
print(x)

После того как я заменил response.text на response.content и распечатал, он возвращает:

AttributeError: 'bytes' object has no attribute 'read'

И вот пример в этом файле gzip:

093013399690000|310001|C|A|59.85|73.15|A||
093030000913000|353701|C|A|59.85|73.15|B||
093100000411000|460501|C|A|59.85|73.15|B||
093130000630000|697401|C|A|59.85|73.15|B||
093200000464000|841501|C|A|59.85|73.15|B||
093230000508000|1013801|C|A|59.85|73.15|B||
093300000550000|1148701|C|A|59.85|73.15|B||
093330000394000|1313701|C|A|59.85|73.15|B||
093400000590000|1485801|C|A|59.85|73.15|B||
093430000495000|1652601|C|A|59.85|73.15|B||
093500000593000|1856201|C|A|59.85|73.15|B||

Ответы [ 2 ]

0 голосов
/ 03 ноября 2019

Для этого вам просто нужны панды:

import pandas as pd

year = 2019
month_str = 'Jan'
date = 2
month = 1

user = XXXX
password = XXXX

gzip_url = f'http://{user}:{password}@some_url/{year}/{month_str}/{date:02d}/{year}{month:02d}{date:02d}.gz'

x = pd.read_csv(gzip_url, compression='gzip', sep = '|')
print(x.head())

И вот подтверждение концепции:

Python 3.7.5 (default, Oct 17 2019, 12:16:48) 
[GCC 9.2.1 20190827 (Red Hat 9.2.1-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas as pd
>>> gzip_file = 'http://127.0.0.1:8000/testfile.gz'
>>> df = pd.read_csv(gzip_file, compression='gzip', sep='|')
>>> df.head()
   093013399690000   310001  C  A  59.85  73.15 A.1  Unnamed: 7  Unnamed: 8
0   93030000913000   353701  C  A  59.85  73.15   B         NaN         NaN
1   93100000411000   460501  C  A  59.85  73.15   B         NaN         NaN
2   93130000630000   697401  C  A  59.85  73.15   B         NaN         NaN
3   93200000464000   841501  C  A  59.85  73.15   B         NaN         NaN
4   93230000508000  1013801  C  A  59.85  73.15   B         NaN         NaN
>>> 

Как мы уже обсуждали в чате, здесь есть альтернатива, использующая requests:

import pandas as pd
import requests
from requests.auth import HTTPBasicAuth
from gzip import decompress
from io import StringIO

year = 2019
month_str = 'Jan'
date = 2
month = 1


user = XXXX
password = XXXX

gzip_url = f'http://some_url/{year}/{month_str}/{date:02d}/{year}{month:02d}{date:02d}.gz'

with requests.get(gzip_url, auth=HTTPBasicAuth(user, password)) as request:
    if request.ok:
        df = pd.read_csv(StringIO(decompress(request.content).decode('utf8')), sep='|')
        print(df.head())
0 голосов
/ 03 ноября 2019

Кажется, что форматирование вашей строки неверно.

f'http_some_url/{year}/{month_str}/{date}/{year}{month}{date}.gz'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...