【问题标题】:Download zipped csv file from server link and read into pandas从服务器链接下载压缩的 csv 文件并读入 pandas
【发布时间】:2021-05-12 11:36:40
【问题描述】:

我一直在尝试使用来自服务器主机 URL 的请求库下载压缩的 csv。

当我从同一服务器下载一个不需要压缩的较小文件时,它在 CSV 中读取没有问题,但是使用这个我返回编码错误。

我尝试了多种类型的编码,读取为 pandas csv,读取为 zip 文件并打开(此时我收到文件不是 zip 文件的错误)。

我还尝试使用此处建议的 zipfile 库:Reading csv zipped files in python

并且还尝试在read_csv 中设置编码和压缩。

适用于非压缩服务器文件的代码如下:

response = requests.get(url, auth=HTTPBasicAuth(un, pw), stream=True, verify = False)
dfs = pd.read_csv(response.raw)

但在用于此文件时返回'utf-8' codec can't decode byte 0xfd in position 0: invalid start byte

我也试过了:

request = get(url, auth=HTTPBasicAuth(un, pw), stream=True, verify=False)
zip_file = ZipFile(BytesIO(request.content))
files = zip_file.namelist()
with gzip.open(files[0], 'rb') as csvfile:
    csvreader = csv.reader(csvfile)
    for row in csvreader:
        print(row)

返回一个 seek 属性错误。

【问题讨论】:

    标签: python pandas csv python-requests


    【解决方案1】:

    这是一种方法:

    import pandas as pd
    import requests
    from requests.auth import HTTPBasicAuth
    from zipfile import ZipFile
    import io
    
    # Example dataset
    url = 'https://www.stats.govt.nz/assets/Uploads/Retail-trade-survey/Retail-trade-survey-September-2020-quarter/Download-data/retail-trade-survey-september-2020-quarter-csv.zip'
    
    response = requests.get(url, auth=HTTPBasicAuth(un, pw), stream=True, verify=False)
    with ZipFile(io.BytesIO(response.content)) as myzip:
        with myzip.open(myzip.namelist()[0]) as myfile:
            df = pd.read_csv(myfile)
    
    print(df)
    
    

    如果您想读取多 csv 压缩文件中的特定 csv,请将 myzip.namelist()[0] 替换为您要读取的文件。如果不知道它的名字,可以用print(ZipFile(io.BytesIO(response.content)))查看zip文件内容

    【讨论】:

    • 谢谢!所以我尝试了这个人,但我得到了 BadZipFile: File is not a zip file。 url 扩展名没有说 zip 也没有说 csv,只是表明它是一个 servlet 链接
    • 你能分享链接或至少类似的东西吗?
    • 类似于server.data.com/ReportServer-1/… 的东西显然不是真正的 URL,但基本上是确切的结构 - 因为您看不到文件或文件夹扩展名
    • 点击网址后文件会自动开始下载吗?无论哪种情况,一种方法是抓取页面并查找 .zip 文件,然后将其用作url
    • 确实如此;我试过了,页面上没有任何文件扩展名属性
    猜你喜欢
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多