【问题标题】:How can I read a tar.gz file directly from a URL into Pandas?如何将 tar.gz 文件直接从 URL 读取到 Pandas 中?
【发布时间】:2020-07-02 05:19:33
【问题描述】:

我希望读取的数据集作为 tar.gz 文件存在于 GitHub 上,并且每隔几个小时更新一次。虽然我总是可以下载这个文件,解压它,然后从 CSV 读取,但如果我能及时从this 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 应用程序并且没有本地计算机,这可能很有用。任何帮助,将不胜感激!谢谢!

【问题讨论】:

    标签: python pandas file python-requests data-wrangling


    【解决方案1】:

    您可以使用BytesIO(In-Memory Stream) 将数据保存在内存中,而不是将文件保存到本地机器。

    同样根据tarfile.open documentation,如果指定了fileobj,则它被用作以二进制模式打开的文件对象的替代名称。

    >>> 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)
    

    【讨论】:

    • 甜蜜!您的解决方案非常适合我,感谢您的解释!学到了很多!
    【解决方案2】:

    如果你使用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 的主要共同维护者。

    【讨论】:

      猜你喜欢
      • 2018-05-06
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-28
      • 2013-02-27
      • 2023-01-03
      • 1970-01-01
      相关资源
      最近更新 更多