簡體   English   中英

從 URL 中讀取壓縮的 Stata 文件到 Pandas

[英]Read a zipped Stata file from URL into pandas

是否可以從 URL 讀取僅包含.dta文件的 .zip 文件?

例如, https : rscfp2016.dta包含一個文件: rscfp2016.dta ,但pandas.read_stata不適用於它:

import pandas as pd
pd.read_stata('https://www.federalreserve.gov/econres/files/scfp2016s.zip')

ValueError: 給定 Stata 文件的版本不是 104、105、108、111 (Stata 7SE)、113 (Stata 8/9)、114 (Stata 10/11)、115 (Stata 12)、117 (Stata 13) 或118 (Stata 14)

如果 zip 僅包含 csv,則read_csv支持讀取壓縮文件,通過compression參數默認推斷壓縮。 read_stata缺少此選項。

我可以通過下載和解壓縮文件,然后閱讀它來做到這一點,但這很麻煩。

!wget https://www.federalreserve.gov/econres/files/scfp2016s.zip
!unzip scfp2016s.zip
df = pd.read_stata('rscfp2016.dta')

有什么更好的辦法嗎?

read_stata接受類似文件的對象,因此您可以這樣做:

import pandas as pd
from io import BytesIO
from zipfile import ZipFile
from urllib.request import urlopen

url = 'https://www.federalreserve.gov/econres/files/scfp2016s.zip'
with urlopen(url) as request:
    data = BytesIO(request.read())

with ZipFile(data) as archive:
    with archive.open(archive.namelist()[0]) as stata:
        df = pd.read_stata(stata)

您可以嘗試使用請求:

import io
import zipfile
import requests

response = requests.get('https://www.federalreserve.gov/econres/files/scfp2016s.zip')                                                                                                                                             
a = zipfile.ZipFile(io.BytesIO(response.content))
b = a.read(a.namelist()[0]) 
pd.read_stata(io.BytesIO(b)) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM