簡體   English   中英

如何將 tar.gz 文件直接從 URL 讀取到 Pandas 中?

[英]How can I read a tar.gz file directly from a URL into Pandas?

我希望閱讀的數據集以 tar.gz 文件的形式存在於 GitHub 上,每隔幾個小時更新一次。 雖然我總是可以下載這個文件,解壓縮它,然后從 CSV 中讀取,但如果我能及時從這個 URL中直接讀取到 Pandas 數據幀中,那就更好了。

經過一番谷歌搜索,我能夠下載壓縮文件,然后將其作為數據框讀取。

import requests
import tarfile
import pandas as pd

# Download file from GitHub
url = "https://github.com/beoutbreakprepared/nCoV2019/blob/master/latest_data/latestdata.tar.gz?raw=true"
target_path = "latestdata.tar.gz"

response = requests.get(url, stream=True)
if response.status_code == 200:
    with open(target_path, "wb") as f:
        f.write(response.raw.read())

# Read from downloaded file
with tarfile.open(target_path, "r:*") as tar:
    csv_path = tar.getnames()[0]
    df = pd.read_csv(tar.extractfile(csv_path), header=0, sep=",")

但是,我想知道是否有一種方法可以直接將文件內容讀入數據框中,而無需先將其保存在本地。 如果我想稍后構建 web 應用程序並且沒有本地計算機,這可能很有用。 任何幫助,將不勝感激! 謝謝!

您可以使用BytesIO ( In-Memory Stream ) 將數據保存在 memory 中,而不是將文件保存到本地計算機。

此外,根據tarfile.open 文檔,如果指定了fileobj ,則將其用作以二進制模式打開的文件 object 的替代名稱。

>>> import tarfile
>>> from io import BytesIO
>>>
>>> import requests
>>> import pandas as pd


>>> url = "https://github.com/beoutbreakprepared/nCoV2019/blob/master/latest_data/latestdata.tar.gz?raw=true"
>>> response = requests.get(url, stream=True)
>>> with tarfile.open(fileobj=BytesIO(response.raw.read()), mode="r:gz") as tar_file:
...     for member in tar_file.getmembers():
...         f = tar_file.extractfile(member)
...         df = pd.read_csv(f)
...         print(df)

如果您使用ParData ,這可以非常干凈地完成:

from tempfile import TemporaryDirectory

import pardata

schema = {
    'download_url': 'https://github.com/beoutbreakprepared/nCoV2019/blob/master/latest_data/latestdata.tar.gz?raw=true',
    'subdatasets': {
        'all': {
            'path': 'latestdata.csv',
            'format': {
                'id': 'table/csv'
            }
        }
    }
}

with TemporaryDirectory() as d:
    dataset = pardata.dataset.Dataset(schema=schema, data_dir=d)
    dataset.download(verify_checksum=False)
    my_csv = dataset.load()  # my_csv is a pandas.DataFrame object that stores the CSV file

print(my_csv)

免責聲明:我是 ParData 的主要共同維護者。

暫無
暫無

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

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