![](/img/trans.png)
[英]How do I manipulate a binary plist retrieved using urllib2.urlopen into a readable xml plist without saving the file locally using Python?
[英]How do I manipulate data without save it locally
我的目標是從網站獲取一些數據並將這些數據放入 memory (不在本地下載),以便我可以做一些進一步的操作。 這是我的 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".
正確的方法是什么?
更新:
print(response)
<Response [200]>
當我打印響應時,它返回 200,這意味着它有響應。
更新:
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||
看來你的字符串格式是錯誤的。
f'http_some_url/{year}/{month_str}/{date}/{year}{month}{date}.gz'
您只需要 pandas 即可:
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())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.