python csv、jpg、mp4等文件上传至s3,提交数据集

该代码定义了一个名为ConnectData的类,用于处理S3数据集的操作。类中包含获取数据集和连接器信息的方法,以及上传和下载csv、mp4、jpg文件的功能。同时,它支持创建新的数据集提交到服务。实例化类后,通过调用成员函数进行具体操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、创建类

import boto3
import uuid
import pandas as pd
import json
import requests

'''
根据dataset_id -> 查询数据集信息
根据connect_id -> 查询连接器信息

根据数据集的信息前缀+s3基本信息 -> s3的数据集地址及连接
s3_clint 可以进行临时数据集的读写

临时结果与最终入库结果需要区分开---有新的入库结果的dataset_id
'''


class ConnectData:
    def __init__(self, models_url, input_dataset, tempdata_connector, project, flow, output_dataset =None):
        self.models_url = models_url
        self.input_dataset = input_dataset
        self.output_dataset = output_dataset
        self.tempdata_connector = tempdata_connector
        self.project = project
        self.flow = flow

    # 提交数据集
    def post_data(self, data_type,prefix,category):
        HEADERS = {
            'Content-Type': 'application/vnd.api+json',
            'Authorization': 'hahfifpia...'
        }
        body = {
        "data":{
            "type":data_type,
            "attributes":{
                "name":"test_" + str(uuid.uuid1()),
                "project":self.project,
                "connector":self.tempdata_connector,
                "tags":[],
                "prefix":prefix,
                "category":category, 
                "created": "1970-01-01T00:00:00.000Z",
                "origindataset": self.input_dataset
            }
        }
    }
        response = requests.post(f'{self.models_url}/{data_type}', headers=HEADERS, data=json.dumps(body))
        res = json.loads(response.content)
        data_id = res['data']['id']
        return data_id


    def s3_client(self):
        res = self.get_connector()
        s3_url = res["host"]
        s3_access_secret = res["secretkey"]
        s3_access_key = res["accesskey"]
        bucketname = res["bucketname"]
        s3_client = boto3.client(service_name='s3', endpoint_url=s3_url, aws_access_key_id=s3_access_key, aws_secret_access_key=s3_access_secret)
        return s3_client, bucketname


    # 根据连接器id获取对应的连接器基本信息,主要是s3的参数为主
    def get_connector(self):
        response = requests.get(url=f"{self.models_url}/connectors/{self.tempdata_connector}")
        if response.status_code == 200:
            res = json.loads(response.content)
            tempdata_connector_param = res["data"]["attributes"]["params"]
            return tempdata_connector_param
        else:
            raise Exception('status_code:' + str(response.status_code) + " connect error")


    # 根据数据集id获取对应的基本信息
    def get_dataset(self, dataset=None):
        if not dataset:
            dataset = self.input_dataset
        response = requests.get(url=f"{self.models_url}/datasets/{dataset}")
        if response.status_code == 200:
            res = json.loads(response.content)
            prefix = res["data"]["attributes"]["prefix"]
            return prefix
        else:
            raise Exception('status_code:' + str(response.status_code) + " dataset error")

2、实例化并调用

connect = ConnectData(
        models_url, input_dataset, tempdata_connector, project, flow, output_dataset)
    s3_client, bucketname = connect.s3_client()

3、根据数据集id获取信息

res = connect.get_dataset()

4、csv上传、读取

1、读取csv
ego_path = path
    with smart_open.open(ego_path, 'rb', transport_params={'client': s3_client}) as reader:
        df= pd.read_csv(reader)

2、上传csv
with smart_open.open(output_path, 'wb', transport_params={'client': s3_client}) as writer:
                    df.to_csv(writer, index=False)

5、mp4、jpg上传

mp4上传方式稍有不同,需要加最后一个参数,图片不用加最后的参数,output_file_path是指你本地视频的位置

if os.path.exists(output_file_path):
    s3_client.upload_file(
            output_file_path, bucketname, 上传位置+ '/'+'od.mp4',ExtraArgs={'ContentType': "video/mp4"})

6、提交数据集

调用上面的类方法

connect.post_data("datasets", prefix, '类型')
好的,我现在需要处理用户的问题,关于如何使用Python API上传数据集的示例。用户提供的代码示例使用了yuanbao_ai库的Dataset.upload方法,但根据提供的搜索结果,可能没有直接对应的网页。因此,我需要根据现有的搜索结果来推断可能的实现方式,并引用相关的网页。 首先,查看用户的问题,他们希望得到一个典型的数据上传示例,假设平台支持Python API。用户给出的代码示例中,使用了Dataset.upload方法,但搜索结果中没有提到yuanbao_ai库,所以可能需要参考其他网页中的文件上传方法。 接下来,我需要查看所有相关的搜索结果,找到与文件上传相关的部分。例如,网页[2]提到了Orchestra Python API的upload_attachment方法,网页[6]、[7]、[8]都涉及使用Python上传文件到服务器的方法,特别是使用requests库。网页[5]提到了FastAPI处理文件上传的示例,而网页[4]则介绍了使用Flask构建API的方法。 用户的问题可能更倾向于使用requests库来实现文件上传,因为这是最常见的方法。网页[6]和[8]详细介绍了使用requests.post方法上传文件,其中网页[8]还提到了分块上传和异常处理,这可能对用户有帮助。此外,网页[2]中的upload_attachment方法虽然属于特定API,但展示了上传文件的一般步骤,可以作为参考。 需要确认的是,用户提供的代码示例中的Dataset.upload方法可能封装了requests库的调用,因此可以建议用户参考使用requests库的标准方法,并引用相关网页。例如,网页[6]中的示例代码展示了如何使用requests.post上传文件,而网页[8]提供了更高级的技巧,如分块上传和重试机制。 因此,回答中应该包含使用requests库上传文件的基本示例,并引用网页[6]和[8]作为来源。同时,可以提到其他方法如使用paramiko(网页[6])或FastAPI(网页[5]),但主要推荐requests库,因为它更通用且网页支持更全面。 最后,确保在答案中正确标注引用来源,使用[num]格式,并检查是否有遗漏的关键点,如文件路径处理、异常处理等,这些在网页[6]、[7]、[8]中都有涉及。 以下是基于Python API实现数据上传的典型示例及技术要点说明,结合多篇网页的最佳实践整理: # 使用标准requests库实现文件上传(推荐方式) import requests def upload_dataset(file_path, description): url = "https://api.example.com/datasets/upload" # 替换实际API端点 files = {'file': ('football_matches.csv', open(file_path, 'rb'), 'text/csv')} data = {'description': description} try: response = requests.post( url, files=files, data=data, headers={'Authorization': 'Bearer YOUR_ACCESS_TOKEN'} # 根据实际需求添加认证信息 ) response.raise_for_status() # 自动抛出HTTP错误 return response.json() # 解析JSON响应 except requests.exceptions.RequestException as e: print(f"上传失败: {str(e)}") return None # 调用示例 upload_dataset("football_matches.csv", "2015-2021赛季赛事数据,包含赔率、胜负平结果等20个特征") 关键实现要点解析: 1. 文件上传核心方法 • 使用requests.post方法,通过files参数传递文件对象,data参数传递附加字段 • 文件对象需以二进制模式打开('rb'),避免编码问题 • 建议显式指定MIME类型(如text/csv),提升兼容性 2. 异常处理机制 • 通过raise_for_status()自动捕获HTTP错误状态码(如4xx/5xx) • 使用try-except块捕获网络异常,建议添加重试逻辑(参考指数退避算法) 3. 进阶优化方案 • 大文件分块上传:使用requests_toolbelt.MultipartEncoder实现流式传输,避免内存溢出 • 多文件混合上传:通过元组列表构建复合表单数据(如[('images', ('file1.jpg', f1), 'image/jpeg'), ...]) • 服务端验证绕过:通过自定义请求头协商特殊传输模式(需与服务端约定) 4. 安全注意事项 • 文件名需进行URL编码处理,防止特殊字符导致的问题 • 敏感操作建议启用HTTPS,避免明文传输认证信息 • 定期检查API速率限制,避免触发服务端防护机制 扩展方案参考: • 使用paramiko库通过SSH/SFTP协议上传文件(适合私有化部署环境) • 基于FastAPI框架构建文件上传接口服务(需定义UploadFile类型参数) • 使用Flask实现RESTful API服务接收文件(参考路由装饰器与请求解析) 建议根据实际平台API网页调整参数格式,重点关注认证方式(OAuth2/Bearer Token等)、文件字段命名规范及响应数据结构。对于生产环境,推荐采用网页中的企业级实践方案,包含分块传输、智能重试和日志监控等模块。
03-24
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值