无法从API响应提取压缩CSV并上传至Google Sheets的解决方法
问题分析与解决方案
错误AttributeError: 'str' object has no attribute 'content'的原因很明确:report_url是从接口返回的字符串格式的下载链接,不是HTTP响应对象,自然没有.content属性。你需要先通过这个链接下载ZIP文件的二进制数据,再进行后续处理。
下面是修正后的完整代码,附带关键步骤说明:
修正后的代码
from google.colab import auth from gspread_dataframe import set_with_dataframe import gspread import zipfile import io import requests import pandas as pd from google.auth import default # 认证Google Sheets auth.authenticate_user() creds, _ = default() gc = gspread.authorize(creds) # 从Walmart接口获取下载链接 response = wm.send_request(method, download_url, params=None, body=None, json=None, request_headers=None) report_url = response["downloadURL"] # 关键修正:通过requests下载ZIP文件的二进制内容 zip_response = requests.get(report_url) # 确保请求成功,下载失败时直接抛出错误 zip_response.raise_for_status() # 读取ZIP文件并提取内部CSV with zipfile.ZipFile(io.BytesIO(zip_response.content)) as file_zip: # 取ZIP内第一个CSV文件(假设压缩包内仅包含目标CSV) csv_filename = file_zip.namelist()[0] with file_zip.open(csv_filename) as file_csv: # 用pandas读取CSV为DataFrame,简化后续上传操作 df = pd.read_csv(file_csv) # 上传到Google Sheets sheet = gc.open("Report").worksheet("Item_Performance") sheet.clear() # 使用set_with_dataframe高效上传,自动适配表头与数据格式 set_with_dataframe(sheet, df) print("Report uploaded to Google Sheets")
关键修改点
- 新增
requests库用于下载文件,pandas库用于便捷处理CSV数据(如果Colab未预装,先运行!pip install requests pandas) - 用
requests.get(report_url)获取ZIP文件的二进制响应,通过zip_response.content拿到可处理的二进制数据 - 改用
pandas.read_csv读取CSV并转为DataFrame,配合set_with_dataframe上传,比原生csv.reader更稳定,还能自动处理表头、数据类型等细节 - 增加
zip_response.raise_for_status(),下载失败时直接抛出错误,便于快速排查问题
内容的提问来源于stack exchange,提问作者sandibaeva52
相关产品推荐
相关产品推荐

