python - 从服务器链接下载压缩的 csv 文件并读入 pandas
问题描述
我一直在尝试使用来自服务器主机 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 属性错误。
解决方案
这是一种方法:
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 zip 文件中的特定 csv,请替换myzip.namelist()[0]
为要读取的文件。如果你不知道它的名字,你可以检查zip
文件内容print(ZipFile(io.BytesIO(response.content)))
推荐阅读
- android - 为什么我们在 react-native 的 View 组件中使用 removeClippedSubviews 属性?
- audio - FFMPEG 改变音调频率(音高音频)
- tabulator - 在制表器中为下载的文件添加格式
- excel - Excel VBA 将值从一张表移动到另一张表
- elasticsearch - Elasticsearch.Net.ElasticSearch.Path 已弃用,我应该改用什么?
- bash - 连接特定数量的文件
- c# - 试图用一些简单的代码制作一个文本框,但不知道为什么会出错
- excel - 如何在 Excel VBA 中进行排名和过滤?
- ios - 架构 armv7 的未定义符号 - 链接器命令失败
- python - 在 rdd 中分区数据并保存分区块