Task Automation Workflows

Polar Sponsor
爱发电 赞助
.NET 9.0

使用脚本、工作流和定时任务自动化重复性任务,创建高效的文件操作、数据处理、API调用和定时任务自动化...

任务自动化

功能概述

任务自动化是一项面向实际任务的技能,主要用于将重复的工作转换为自动化工作流程;. 保存时间, 减少错误, 缩放操作;

核心要点

  • 批次重命名 : 批次转换 : 重置文件 : 组织文件 :.;
  • Data 进程。
  • 它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。

使用与执行

使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。

结果检查与注意事项

实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。

任务自动化

将重复性工作转化为自动化工作流,节省时间、减少错误、提升运营规模。

自动化类型

1. 文件操作

批量重命名:

import os
import re

def batch_rename(directory, pattern, replacement):
    """重命名匹配正则模式的文件"""
    for filename in os.listdir(directory):
        if re.match(pattern, filename):
            new_name = re.sub(pattern, replacement, filename)
            os.rename(
                os.path.join(directory, filename),
                os.path.join(directory, new_name)
            )
            print(f"已重命名: {filename} -> {new_name}")

批量格式转换:

from PIL import Image
import os

def convert_images(input_dir, output_dir, format='webp'):
    """将所有图像转换为指定格式"""
    os.makedirs(output_dir, exist_ok=True)
    
    for filename in os.listdir(input_dir):
        if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
            img = Image.open(os.path.join(input_dir, filename))
            name = os.path.splitext(filename)[0]
            img.save(os.path.join(output_dir, f"{name}.{format}"), format.upper())
            print(f"已转换: {filename}")

文件归类整理:

import os
import shutil

def organize_by_type(directory):
    """按文件类型将文件移入对应文件夹"""
    extensions = {
        'images': ['.jpg', '.jpeg', '.png', '.gif', '.webp'],
        'documents': ['.pdf', '.doc', '.docx', '.txt', '.md'],
        'videos': ['.mp4', '.mov', '.avi', '.mkv'],
        'audio': ['.mp3', '.wav', '.flac'],
        'code': ['.py', '.js', '.ts', '.go', '.rs'],
    }
    
    for filename in os.listdir(directory):
        filepath = os.path.join(directory, filename)
        if os.path.isfile(filepath):
            ext = os.path.splitext(filename)[1].lower()
            for folder, exts in extensions.items():
                if ext in exts:
                    target = os.path.join(directory, folder)
                    os.makedirs(target, exist_ok=True)
                    shutil.move(filepath, os.path.join(target, filename))
                    print(f"已将 {filename} 移至 {folder}/")
                    break

2. 数据处理

批量数据转换:

import pandas as pd

def process_csv_batch(input_dir, output_file, transform_func):
    """批量处理多个 CSV 文件并合并输出"""
    dfs = []
    
    for filename in os.listdir(input_dir):
        if filename.endswith('.csv'):
            df = pd.read_csv(os.path.join(input_dir, filename))
            df = transform_func(df)
            dfs.append(df)
    
    combined = pd.concat(dfs, ignore_index=True)
    combined.to_csv(output_file, index=False)
    print(f"已将 {len(dfs)} 个文件处理并合并为 {output_file}")

数据流水线:

def create_pipeline(steps):
    """创建可复用的数据流水线"""
    def pipeline(data):
        result = data
        for step in steps:
            result = step(result)
        return result
    return pipeline

# 示例用法:
pipeline = create_pipeline([
    lambda x: x.dropna(),
    lambda x: x.drop_duplicates(),
    lambda x: x[x['value'] > 0],
    lambda x: x.sort_values('date')
])

clean_data = pipeline(raw_data)

3. API 操作

限速 API 客户端:

import time
from functools import wraps

def rate_limit(calls_per_second=2):
    """用于限制 API 调用频率的装饰器"""
    min_interval = 1.0 / calls_per_second
    last_call = [0.0]
    
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            elapsed = time.time() - last_call[0]
            if elapsed < min_interval:
                time.sleep(min_interval - elapsed)
            last_call[0] = time.time()
            return func(*args, **kwargs)
        return wrapper
    return decorator

@rate_limit(2)  # 每秒最多调用 2 次
def api_call(endpoint, data):
    return requests.post(endpoint, json=data)

批量 API 调用:

def batch_api_calls(items, endpoint, batch_size=100):
    """以批次方式执行 API 调用"""
    results = []
    
    for i in range(0, len(items), batch_size):
        batch = items[i:i + batch_size]
        
        # 执行批次请求
        response = requests.post(endpoint, json={'items': batch})
        
        if response.status_code == 200:
            results.extend(response.json())
        else:
            print(f"第 {i//batch_size} 批次失败: {response.status_code}")
        
        time.sleep(1)  # 实施速率限制
    
    return results

指数退避重试:

import time
import random

def retry_with_backoff(func, max_retries=3, base_delay=1):
    """对失败调用采用指数退避策略进行重试"""
    for attempt in range(max_retries):
        try:
            return func()
        except Exception as e:
            if attempt == max_retries - 1:
                raise
            
            delay = base_delay * (2 ** attempt) + random.random()
            print(f"第 {attempt + 1}/{max_retries} 次重试,{delay:.1f} 秒后执行: {e}")
            time.sleep(delay)

4. 定时任务

Cron 作业:

# 每小时执行一次
0 * * * * /path/to/script.sh

# 每天上午 9 点执行
0 9 * * * /path/to/script.sh

# 每周一上午 9 点执行
0 9 * * 1 /path/to/script.sh

# 工作日(周一至周五)每小时执行一次
0 * * * 1-5 /path/to/script.sh

Python 调度器:

import schedule
import time

def job():
    print("正在运行定时任务...")

schedule.every(10).minutes.do(job)
schedule.every().hour.do(job)
schedule.every().day.at("09:00").do(job)
schedule.every().monday.do(job)

while True:
    schedule.run_pending()
    time.sleep(60)

OpenClaw Cron:

openclaw cron add 
  --name "Daily Report" 
  --schedule "0 9 * * *" 
  --task "Generate daily report and send to slack"

工作流模式

顺序流水线

def sequential_workflow(steps):
    """按顺序执行各步骤"""
    results = []
    
    for i, step in enumerate(steps):
        try:
            result = step['action'](**step.get('params', {}))
            results.append({'step': i, 'status': 'success', 'result': result})
        except Exception as e:
            results.append({'step': i, 'status': 'error', 'error': str(e)})
            if step.get('stop_on_error', True):
                break
    
    return results

并行执行

from concurrent.futures import ThreadPoolExecutor, as_completed

def parallel_workflow(tasks, max_workers=5):
    """并行执行任务"""
    results = []
    
    with ThreadPoolExecutor(max_workers=max_workers) as executor:
        futures = {executor.submit(task['action'], **task.get('params', {})): task 
                   for task in tasks}
        
        for future in as_completed(futures):
            task = futures[future]
            try:
                result = future.result()
                results.append({'task': task['name'], 'status': 'success', 'result': result})
            except Exception as e:
                results.append({'task': task['name'], 'status': 'error', 'error': str(e)})
    
    return results

条件工作流

def conditional_workflow(steps):
    """根据条件决定是否执行步骤"""
    context = {}
    
    for step in steps:
        # 检查条件
        if 'condition' in step:
            if not step['condition'](context):
                print(f"跳过 {step['name']}:条件不满足")
                continue
        
        # 执行步骤
        result = step['action'](**step.get('params', {}), context=context)
        context[step['name']] = result
    
    return context

错误处理

优雅降级

def robust_operation(data, fallback=None):
    """尝试主操作,失败时启用备用方案"""
    try:
        return primary_operation(data)
    except SpecificError as e:
        print(f"主操作失败: {e},尝试备用方案")
        return fallback_operation(data) if fallback else None
    except Exception as e:
        print(f"所有方案均失败: {e}")
        return fallback

错误通知

def notify_on_error(func, notify_func):
    """出错时触发通知的装饰器"""
    @wraps(func)
    def wrapper(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        except Exception as e:
            notify_func(f"函数 {func.__name__} 执行出错: {e}")
            raise
    return wrapper

@notify_on_error(send_slack_message)
def important_operation():
    # ...

监控

进度追踪

from tqdm import tqdm

def process_with_progress(items):
    """带进度条处理数据项"""
    results = []
    for item in tqdm(items, desc="Processing"):
        results.append(process(item))
    return results

日志记录

import logging

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    filename='automation.log'
)

logger = logging.getLogger(__name__)

def logged_operation(data):
    logger.info(f"开始执行操作,输入数据共 {len(data)} 条")
    try:
        result = process(data)
        logger.info(f"操作完成,共生成 {len(result)} 条结果")
        return result
    except Exception as e:
        logger.error(f"操作失败: {e}")
        raise

最佳实践

1. 从简单开始

手动 → 脚本 → 定时执行 → 监控告警

避免过度设计。先从手动流程入手,再逐步实现自动化。

2. 保证幂等性

def safe_operation(data):
    """可安全多次执行的操作"""
    # 检查是否已处理
    if already_processed(data):
        return get_cached_result(data)
    
    # 执行处理
    result = process(data)
    
    # 标记为已完成
    mark_processed(data)
    
    return result

3. 添加检查点

def long_running_workflow(data):
    """在关键节点保存执行进度"""
    checkpoint_file = "workflow_checkpoint.json"
    
    # 若检查点存在,则加载
    if os.path.exists(checkpoint_file):
        with open(checkpoint_file) as f:
            state = json.load(f)
            start_from = state['step']
            data = state['data']
    else:
        start_from = 0
    
    # 带检查点执行流程
    for i, step in enumerate(steps[start_from:], start=start_from):
        result = step(data)
        
        # 保存检查点
        with open(checkpoint_file, 'w') as f:
            json.dump({'step': i + 1, 'data': result}, f)
    
    # 清理检查点文件
    os.remove(checkpoint_file)
    return result

4. 充分测试

def test_automation():
    """使用模拟数据测试自动化逻辑"""
    test_data = create_mock_data()
    
    # 预演执行(dry run)
    result = automation(test_data, dry_run=True)
    
    # 验证结果
    assert result['status'] == 'success'
    assert len(result['output']) == expected_count
    
    print("所有测试通过!")

5. 全面文档化

def automated_task(config):
    """
    处理每日销售数据并生成报告。
    
    参数:
        config: 字典,包含以下键:
            - input_dir: 存放 CSV 文件的目录路径
            - output_file: 输出报告的文件路径
            - notify: 完成后发送通知的邮箱地址
    
    返回值:
        字典,包含以下键:
            - status: 'success' 或 'error'
            - records_processed: 已处理记录数
            - output_file: 生成报告的文件路径
    
    示例:
        result = automated_task({
            'input_dir': '/data/sales',
            'output_file': '/reports/daily.csv',
            'notify': 'team@company.com'
        })
    """
    # 实现逻辑...

常见应用场景

每日报告自动化

def daily_report():
    # 1. 获取数据
    data = fetch_from_sources()
    
    # 2. 数据处理
    processed = process_data(data)
    
    # 3. 生成报告
    report = generate_report(processed)
    
    # 4. 分发报告
    send_email(report)
    upload_to_slack(report)
    
    # 5. 存档报告
    archive_report(report)

数据同步

def sync_data():
    # 1. 获取上次同步状态
    last_sync = get_last_sync_time()
    
    # 2. 获取自上次同步以来的变更
    changes = fetch_changes_since(last_sync)
    
    # 3. 应用变更
    for change in changes:
        apply_change(change)
    
    # 4. 更新同步状态
    update_sync_time()

清理自动化

def cleanup():
    # 1. 删除旧文件
    remove_old_files(days=30)
    
    # 2. 清空临时目录
    clear_temp_dirs()
    
    # 3. 归档旧日志
    archive_logs()
    
    # 4. 优化数据库
    optimize_database()

相关专题

更多
Uvicorn 报错与问题解决教程
Uvicorn 报错与问题解决教程

本专题汇总了Uvicorn服务器常见问题与报错解决的教程合集,涵盖启动失败、端口占用、模块导入错误、事件循环冲突及热重载失效等典型故障的排查思路。同时整理了多进程与Worker配置、SSL/HTTPS证书报错、跨域与代理配置等实战解决方案,助你快速定位并解决Uvicorn运行中的各类问题。

2026.11.02

0

14

Uvicorn使用教程
Uvicorn使用教程

本专题汇总了Uvicorn使用教程与启动运行指南,涵盖其作为Python ASGI服务器的定位与特点,以及命令行启动(uvicorn main:app --reload)、参数配置(host/port/workers)、程序内嵌运行与Gunicorn结合部署等核心用法。同时整理了热重载调试、日志配置与生产环境部署优化等技巧,助你快速掌握Uvicorn的运行与配置。

2026.11.02

0

17

Uvicorn安装配置教程
Uvicorn安装配置教程

本专题汇总了Uvicorn的安装配置教程与部署指南,涵盖通过pip安装Uvicorn、启动FastAPI/Starlette应用、开发模式热重载(--reload)及多进程工作模式配置等核心操作。同时整理了结合Gunicorn的生产部署方案、HTTPS与反向代理配置及性能调优技巧,助你快速完成Uvicorn服务的安装与上线部署。

2026.11.02

0

17

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

2026.10.28

0

16

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

2026.10.28

0

15

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

2026.10.28

0

10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

0

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

0

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

0

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习