从GET请求响应提取Zip内CSV并上传Google Sheets遇类型错误求助
问题解决:TypeError: a bytes-like object is required, not 'str'
错误原因
你代码里的report_url是字符串格式的下载链接,直接传给io.BytesIO()会报错——因为BytesIO需要的是zip文件的字节数据,不是URL地址本身。必须先通过这个链接发起请求,拿到实际的zip文件内容,再进行后续解压操作。
修复后的完整代码
import requests # 新增:请求下载链接获取文件内容 response = wm.send_request(method, download_url, params=None, body=None, json=None, request_headers=None) print(response) report_url=response["downloadURL"] print(report_url) from google.colab import auth auth.authenticate_user() from gspread_dataframe import get_as_dataframe, set_with_dataframe import gspread import pandas as pd # 新增:更安全处理CSV文件 import zipfile import io from google.auth import default creds, _ = default() gc = gspread.authorize(creds) # 关键修改:先请求report_url获取zip文件字节内容 zip_response = requests.get(report_url) # 用字节内容初始化BytesIO,再打开zip文件 z = zipfile.ZipFile(io.BytesIO(zip_response.content)) csv_filename = None for filename in z.namelist(): if filename.endswith(".csv"): csv_filename = filename break if csv_filename is None: raise Exception("CSV file not found in zip archive") # 用pandas读取CSV,避免手动拆分的错误(比如单元格含逗号) with z.open(csv_filename) as f: df = pd.read_csv(f) sheet = gc.open("Report").worksheet("Item_Performance") # 用gspread_dataframe方法写入数据,高效可靠 set_with_dataframe(sheet, df) print("Report uploaded to Google Sheets")
关键修改点
- 新增
requests库:向report_url发起GET请求,获取zip文件的字节数据(zip_response.content) - 替换
io.BytesIO(report_url)为io.BytesIO(zip_response.content):用实际文件字节数据初始化BytesIO - 用
pandas读取CSV:替代手动按行拆分的方式,避免CSV单元格含逗号时的拆分错误,同时写入Google Sheets更高效
内容的提问来源于stack exchange,提问作者sandibaeva52
相关产品推荐
相关产品推荐

