【Python】阿里云 DataWorks + ODPS + 钉钉联动实战:配合[特殊字符]全搞定

【Python】阿里云 DataWorks + ODPS + 钉钉联动实战:配合🦞全搞定

  • 一、背景引言
  • 二、整体流程与核心模块
  • [三、🦞龙虾 + Python代码实现全流程](#三、🦞龙虾 + Python代码实现全流程)
    • [1. 本地文件处理](#1. 本地文件处理)
    • [2. 终端响应:云连接 ODPS upload 文件](#2. 终端响应:云连接 ODPS upload 文件)
    • [3. 云端处理:执行代码SQL or Pyhton](#3. 云端处理:执行代码SQL or Pyhton)
    • [4. 结果通知](#4. 结果通知)
      • [4.1 系统导出](#4.1 系统导出)
      • [4.2. 通知到位:打工人的觉悟](#4.2. 通知到位:打工人的觉悟)
    • [5. 全流程all in](#5. 全流程all in)
  • 五、总结

一、背景引言

今天聊一个很实用的场景:当电脑不在身边,如何用🦞小龙虾配合完成 本地+云端的数据任务流。

背景说明:

今天和朋友A聚餐,他临时收到领导信息,急要根据最新的一份市场信息出最新报告(报告有固定模板),但是电脑不在身边,领导要的急,要么放弃聚餐回公司 -- 太远太累,要么...

小伙伴们是否也遇到同样的情况? 遇到休息时间打扰的领导,怎么办?万一有急事呢又不好耽误...

别急🦞小龙虾来帮你!


二、整体流程与核心模块

咱们来梳理分析下,核心问题和模块链路如下:

根据链路,涉及的核心工具和服务:

模块 工具/服务 说明
文件处理 pandas 读取文件、如Excel/CSV,文件清洗转换等
数据upload/计算 pyodps-ALiYun SDK 连接 ODPS,文件upload、ETL、download等
终端通知 requests + sign算法 机器人推送 + 指定@通知
文件操作 globos 系统os 文件排查 传输等

三、🦞龙虾 + Python代码实现全流程

1. 本地文件处理

我们以常见的excel为例,注意:最好先转先转 CSV,因为 ODPS 的 Tunnel 上传接口对 CSV 支持最好,避免遇到编码和格式问题。

pandas 读 Excel 再导出 UTF-8 with BOM,确保中文不乱码:

python 复制代码
import pandas as pd
import glob
import os

def excel_to_csv(input_dir, output_dir):
    """
    利用🦞把手机文件传给指定目录,读取目录下指定Excel文件(这里加遍历,解决多个文件的情况),格式转化UTF-8 BOM
    """
    # 匹配 xlsx 和 xls 两种格式,解决office和wps的各种问题
    excel_files = glob.glob(os.path.join(input_dir, '*.xlsx')) + \
                  glob.glob(os.path.join(input_dir, '*.xls'))
    
    if not excel_files:
        print(f"❌ 四叔,未找到目标文件: {input_dir}")
        return []
    
    csv_files = []
    for excel_file in excel_files:
        try:
            df = pd.read_excel(excel_file)
            # 转 CSV,utf-8-sig = UTF-8 with BOM,防止 Windows 打开乱码
            csv_path = os.path.join(output_dir,
                os.path.splitext(os.path.basename(excel_file))[0] + '.csv')
            df.to_csv(csv_path, index=False, encoding='utf-8-sig')
            csv_files.append(csv_path)
            print(f"✅ 四叔,转换完成: {os.path.basename(excel_file)} -> {os.path.basename(csv_path)}")
        except Exception as e:
            print(f"❌ 四叔,转换失败: {str(e)}")
    
    return csv_files

💡 小技巧:Excel 文件可能有合并单元格、多 sheet 等情况,pandas 默认只读第一个 sheet。如果有多 sheet 需求,可以遍历 pd.ExcelFile.sheet_names 逐个处理。大家可以注意下,细心不会错。


2. 终端响应:云连接 ODPS upload 文件

连接阿里云 ODPS 需要三样东西:AccessKey ID、AccessKey Secretproject name ,这部分在【Python】Python解决阿里云DataWorks导出数据1万条限制的问题 中已经详细讲过,不再赘述。

python 复制代码
from odps import ODPS

ACCESS_ID = 'AccessKeyId'
ACCESS_KEY = 'AccessKeySecret'
PROJECT_NAME = 'project name'
ENDPOINT = 'http://service.cn-shanghai.maxcompute.aliyun.com/api'

# 建立连接
odps = ODPS(ACCESS_ID, ACCESS_KEY, PROJECT_NAME, endpoint=ENDPOINT)

上传文件之前,先对文件进行处理,再逐个文件写入 ODPS 表,并加上字段映射。这里用的是 ODPS表字段 → Excel列名 的反向映射,保证上传的数据字段名和目标表对齐:

python 复制代码
# 字段映射:Excel列名 -> ODPS表字段名  这里也可以自定义一个find_column 关键词遍历对比

FIELD_MAPPING = {
    '字段1': 'xxx',
    '字段2': 'xxx',
    '字段3': 'xxx',
    '...':'...'
}

def upload_to_odps(odps, csv_files, table_name, field_mapping):
    """
    先 TRUNCATE 表确保信息干净,上传 CSV 数据到 ODPS
    具体的大家根据情况定义即可
    """
    try:
        # 清空目标表,防止历史数据残留
        print(f"📤 清空表ing {table_name}...")
        odps.execute_sql(f"TRUNCATE TABLE {table_name}")
        print(f"✅ 四叔,表已清空")
        
        # 逐个 CSV 上传
        for csv_file in csv_files:
            df = pd.read_csv(csv_file, encoding='utf-8-sig')
            
            # 反转映射
            reverse_mapping = {v: k for k, v in field_mapping.items()}
            df_renamed = df.rename(columns=reverse_mapping)
            
            # 只保留目标表定义的字段,防止多余列报错
            columns_to_keep = [col for col in field_mapping.keys()
                              if col in df_renamed.columns]
            df_final = df_renamed[columns_to_keep]
            
            print(f"📤 正在上传: {os.path.basename(csv_file)}")
            odps.write_table(table_name, df_final)
            print(f"✅ 上传成功")
        
        return True
        
    except Exception as e:
        print(f"❌ 四叔,ODPS 操作失败: {str(e)}")
        return False

⚠️ 注意:ODPS 上传对字段类型和顺序敏感,字段映射一定要提前确认好,不然容易报 Column xxx not found 或类型不匹配的错误。


3. 云端处理:执行代码SQL or Pyhton

upload目标文件后,在 ODPS 里可以执行代码了。代码逻辑根据业务需求来定,并获取执行状态。

python 复制代码
SQL_SCRIPT = """
XXXXXXX  这里放你的代码 以SQL为例 
;
"""

def execute_sql_script(odps, sql_script):
    """
    执行 SQL 脚本,完成后获取状态,避免时间等待 
    """
    try:
        instance = odps.execute_sql(sql_script)
        instance.wait_for_success()  # 阻塞等待 SQL 完成
        print(f"✅ 四叔,SQL 执行成功")
        return True
    except Exception as e:
        print(f"❌ 四叔,SQL 执行失败: {str(e)}")
        return False

🎯 划重点:wait_for_success() 建议加,作为判断代码是否执行的标准,避免队列wait or faile


4. 结果通知

4.1 系统导出

代码执行完后,根据结果导出。因为遇到过特殊情况,这里顺带做了一个字段清洗,处理掉 HTML 标签等非法字符,避免 Excel 打开报格式错误。这部分可以看【Python】Python解决阿里云DataWorks导出数据1万条限制的问题

4.2. 通知到位:打工人的觉悟

作为打工人,完成任务更何况是加班完成的,必须通知到群啊!

以钉钉为例:最后一步,推送钉钉群机器人通知。钉钉自定义机器人支持签名验证 机制,需要把当前时间戳 + 密钥做 HMAC-SHA256 签名,具体内容之前在Python Mac 钉钉机器人推送 中也给大家讲过啦。

🔒 安全性提醒:这里还是提醒下,AccessKey 和钉钉 Webhook 地址属于敏感信息,不要硬编码在代码里 。建议放到环境变量或 .env 文件中,代码里用 os.getenv() 读取,防止泄露。


5. 全流程all in

把上面所欲步骤串联起来,就是一个完整的**【Python】阿里云 DataWorks + ODPS + 钉钉联动实战 + 🦞 全流程**。

最终只需要一条指令给到🦞,它就能帮你完成以上所有工作。(附案例截图)

🎯 小tips:由于钉钉没法个人直接通过api传输文件,所以最后@完你老板后, 需要借助🦞将文件传到终端。

python 复制代码
def main():
    # 链接云odps
    odps = ODPS(ACCESS_ID, ACCESS_KEY, PROJECT_NAME, endpoint=ENDPOINT)
    
    # ① 文件处理
    csv_files = excel_to_csv(INPUT_DIR, OUTPUT_DIR)
    
    # ②③ upload文件
    upload_to_odps(odps, csv_files, UPLOAD_TABLE_NAME, FIELD_MAPPING)
    
    # ④ 执行代码任务
    execute_sql_script(odps, SQL_SCRIPT)
    
    # ⑤ 导出结果
    export_from_odps(odps, EXPORT_TABLE_NAME, EXPORT_OUTPUT_DIR, EXPORT_FILENAME)
    
    # ⑥ 系统通知
    send_dingtalk_notification(DINGTALK_WEBHOOK, DINGTALK_SECRET, DINGTALK_AT_MOBILE)
    
    print("✅ 四叔,全部流程执行完成!")

if __name__ == '__main__':
    main()

五、总结

今天咱们把整个链路拆开讲了,朋友A看完操作,直夸666,不带电脑也不怕领导下班打扰了!

当然,AI自动化的前提是:

  1. 积累才是王道。平时多积累,多学习,才能在关键时候派上用,临时抱佛脚,AI也不是万能的。
  2. 挖掘场景。多发现业务和生活的场景需求,训练成skills,能达到事半功倍的效果。以后的AI一定是skills的时代。
相关推荐
2401_865439633 小时前
HTML函数在低温环境下启动慢吗_温度对硬件启动影响【方法】
jvm·数据库·python
m0_3776182310 小时前
Golang怎么连接MySQL数据库_Golang MySQL连接教程【总结】
jvm·数据库·python
LN花开富贵11 小时前
【ROS】鱼香ROS2学习笔记一
linux·笔记·python·学习·嵌入式·ros·agv
宇擎智脑科技11 小时前
开源 AI Agent 架构设计对比:Python 单体 vs TypeScript 插件化
人工智能·openclaw·hermes agent
weixin_5860614611 小时前
C#怎么通过反射获取类属性_C#如何动态读取元数据【进阶】
jvm·数据库·python
Jurio.11 小时前
本机开发 + 多机执行的极简远端运行工具
linux·git·python·github·远程工作
skywalk816311 小时前
pytest测试的时候这是什么意思?Migrating <class ‘kotti.resources.File‘>
前端·python
overmind11 小时前
oeasy Python 121[专业选修]列表_多维列表运算_列表相加_列表相乘
java·windows·python
m0_6784854511 小时前
CSS如何控制表格单元格边框合并_通过border-collapse实现
jvm·数据库·python