如何将数据科学项目中生成的CSV文件上传存储至Cloudinary云平台
将CSV直接存储到Cloudinary的实现方案
前置准备
- 安装Cloudinary官方Python SDK,执行命令
pip install cloudinary - 初始化Cloudinary配置,传入你的账户对应的云名称、API密钥、API密钥对;如果是Django项目,可将配置参数写入
settings.py统一管理,避免硬编码
核心逻辑调整思路
原代码是先将CSV写入服务器本地磁盘再处理,可按需选择两种实现方案:
- 直接将DataFrame转成内存中的CSV流,无本地临时文件,节省服务器存储
- 保留本地CSV写入逻辑,上传后再清理临时文件
修正后完整代码示例
首先是全局导入与配置部分:
import cloudinary.uploader import io import pandas as pd import json from rest_framework.response import Response from rest_framework.views import APIView # 初始化Cloudinary配置,替换为你的账户参数 cloudinary.config( cloud_name = "你的云名称", api_key = "你的API密钥", api_secret = "你的API密钥对" )
接口类的修改部分如下(原有爬取、数据清洗逻辑保持不变,仅调整存储相关逻辑):
class NepseApi(APIView): authentication_classes = [] permission_classes = [] def get(self, request, format=None): level2=[] rng=get_range(request, 8) table_Datas=get_url(request) level1= pd.Series(table_Datas).drop_duplicates().tolist() for k in level1: if len(k) > 35: level2.append(k) else: pass d=[] for l in range(1, len(level2)): c= level2[l].split('\n') d.append(c) df= pd.DataFrame(d[1:], columns=d[0]) date= pd.Timestamp.today().strftime('%Y-%m-%d') df['date']= date # 修正原代码顺序:先重命名列,保证CSV与返回JSON的结构统一 df.rename(columns={'Traded Companies': 'company_name','No. Of Transaction': 'no_of_transaction', 'Max Price':'max_price','Min Price':'min_price','Closing Price':'closing_price','Traded Shares':'traded_shares','Previous Closing':'previous_closing','Difference Rs.':'difference_rs'}, inplace=True) # 内存流生成CSV(无本地临时文件) csv_buffer = io.StringIO() df.to_csv(csv_buffer, index=True) csv_buffer.seek(0) # 重置缓冲区指针到开头,确保上传时能读取完整内容 # 上传到Cloudinary并定义存储路径 upload_result = cloudinary.uploader.upload( csv_buffer, # 定义Cloudinary端的存储路径与文件名 public_id=f"nepse_daily_market_data/{date}_trading_records", resource_type="raw", # CSV为非媒体类原始文件,必须指定该参数,否则上传会失败 overwrite=True # 同一天重复请求时覆盖旧文件,可根据需求关闭 ) # 原有返回逻辑保持不变 jsn = json.loads(df.to_json(orient='records')) return Response(jsn)
关键说明
- 存储路径构建:通过
public_id参数自定义Cloudinary端的存储层级与文件名,示例中nepse_daily_market_data/是自定义的一级目录,{date}_trading_records是文件名,平台会自动为raw类型文件补充.csv后缀 - 若选择保留本地CSV的方案:只需将原
df.to_csv(date +'.csv', index=True)的本地写入逻辑保留,直接将本地文件路径f"{date}.csv"作为上传方法的第一个参数即可,上传完成后可调用os.remove()清理临时文件 - 已修正原代码的顺序问题:原代码先生成CSV再重命名列,会导致保存的CSV使用原始列名,与接口返回的重命名后JSON结构不一致
内容的提问来源于stack exchange,提问作者user14194056
相关产品推荐
相关产品推荐

