做RPA采集,除了抓数据,还有一块绕不开的工作——处理文件。图片批量下载、文件改名归档、多个Excel合并、数据分类整理……这些活虽然不复杂,但手动做起来极其枯燥,而且容易出错。
我以前帮人做一个商品采集项目,每天要下载几千张图片,还要按商品编号重命名、分到不同文件夹。刚开始手工操作了三天就受不了了,后来用影刀的文件处理指令写了几个小流程,每天的工作量从2小时压缩到了10分钟。
这篇文章不讲采集,就讲7个我在实际项目中每天都在用的文件批量操作,全部有可以直接参考的代码和参数配置。
文件处理的三类常用指令
影刀RPA里文件操作相关的指令集中在**"文件与文件夹"**分类下,常用的分三类:
| 类别 | 核心指令 | 主要用途 |
|---|---|---|
| 文件操作 | 复制文件、移动文件、删除文件、重命名文件 | 整理单个文件 |
| 文件夹操作 | 创建文件夹、删除文件夹、获取文件夹内文件列表 | 目录管理 |
| 批量处理 | 循环列表 + 上述指令组合 | 批量改名/移动/分类 |
核心逻辑:先"获取文件夹内文件列表",再"循环"处理每个文件。 这个模式可以覆盖90%的批量文件处理需求。
操作一:批量重命名文件
场景: 下载的图片文件名是IMG_8374.jpg、IMG_8375.jpg,需要改成商品编号命名,如SP001_主图.jpg、SP001_详情1.jpg。

# 指令序列:
# 1. 获取文件夹内文件列表 → 存入「文件列表」
# 2. 循环列表(文件列表) + 内部用「重命名文件」
# ===== 重命名文件指令参数 =====

# 指令:重命名文件
# 原文件路径:C:\images\IMG_8374.jpg
# 新文件名:SP001_主图.jpg
# 说明:只改文件名,不改文件内容
批量重命名的完整流程:
# 假设你有一个「商品编号列表」和「下载的文件列表」
# 它们是一一对应的
获取文件夹内文件列表("C:\downloads\原始图片") → 存入「原始文件列表」
# 假设返回:["IMG_001.jpg", "IMG_002.jpg", "IMG_003.jpg"]
新文件名列表 = ["SP001_主图.jpg", "SP001_详情1.jpg", "SP001_详情2.jpg"]
循环次数 = 列表长度(原始文件列表)
循环 循环次数 次:
当前原始文件 = 原始文件列表[当前循环索引]
当前新文件名 = 新文件名列表[当前循环索引]
重命名文件(
原文件路径="C:\downloads\原始图片\" + 当前原始文件,
新文件名=当前新文件名
)
输出日志("已重命名:" + 当前原始文件 + " → " + 当前新文件名)
容易踩坑:
- 重命名时不要改文件扩展名(除非你明确知道要改格式),改了文件可能打不开
- 如果有同名文件,重命名会报错或覆盖(取决于系统设置),建议先检查目标文件名是否已存在
- 文件路径中的
\在影刀里要写成\\,或者在路径外面加引号
操作二:按规则自动分类到不同文件夹
场景: 采集下来的商品图片需要按"类目"分到不同文件夹:女装/、男装/、配饰/。
# 1. 创建目标文件夹(如果不存在)
创建文件夹("C:\images\分类\女装")
创建文件夹("C:\images\分类\男装")
创建文件夹("C:\images\分类\配饰")
# 2. 获取所有待分类文件
获取文件夹内文件列表("C:\images\待分类") → 存入「待处理文件列表」
# 3. 循环每个文件,根据文件名或规则分类
循环列表(待处理文件列表):
当前文件 = 当前循环项
# 假设文件名包含类目关键词
如果 包含文本(当前文件, "女装"):
目标文件夹 = "C:\images\分类\女装"
否则如果 包含文本(当前文件, "男装"):
目标文件夹 = "C:\images\分类\男装"
否则:
目标文件夹 = "C:\images\分类\其他"

# 移动文件到目标文件夹
移动文件(
原路径="C:\images\待分类\" + 当前文件,
目标路径=目标文件夹 + "\" + 当前文件
)
输出日志("已移动:" + 当前文件 + " → " + 目标文件夹)
用"正则表达式"做更精确的分类:
如果分类规则比较复杂(比如按价格区间、日期范围),可以在"执行Python代码"里用正则匹配,返回分类结果给影刀指令。
# 执行Python代码:根据文件名判断类目
# 输入:filename(文本)
# 输出:category(文本)
import re
def get_category(filename):
if re.search(r'女装|连衣裙|裙子', filename):
return '女装'
elif re.search(r'男装|衬衫|裤子', filename):
return '男装'
elif re.search(r'项链|耳环|手链', filename):
return '配饰'
else:
return '其他'
category = get_category(filename)
操作三:批量合并多个Excel文件
场景: 每天采集多个店铺的数据,每个店铺一个Excel文件,需要合并成一个总表。
# ===== 方案:用Python Pandas批量合并 =====
# 执行Python代码:合并文件夹内所有Excel文件
# 输入:folder_path(文本)
# 输出:merged_data(二维列表)
import pandas as pd
import os
def merge_excel_files(folder_path):
all_files = os.listdir(folder_path)
excel_files = [f for f in all_files if f.endswith(('.xlsx', '.xls'))]
if not excel_files:
return []
merged_df = pd.DataFrame()
for file in excel_files:
file_path = os.path.join(folder_path, file)
try:
df = pd.read_excel(file_path)
# 加一列"来源文件",方便追溯数据来源
df['来源文件'] = file
merged_df = pd.concat([merged_df, df], ignore_index=True)
except Exception as e:
print(f"读取文件 {file} 失败:{e}")
# 去重(按"商品标题"去重)
if '商品标题' in merged_df.columns:
merged_df = merged_df.drop_duplicates(subset=['商品标题'], keep='first')
# 转为二维列表(包含表头)
result = [merged_df.columns.tolist()] + merged_df.values.tolist()
return result
merged_data = merge_excel_files("C:\\data\\每日采集\\2026-07-06")
在影刀里怎么接:
- 把Python代码贴在"执行Python代码"指令里
- 输入变量
folder_path绑影刀里的文件夹路径变量 - 输出变量
merged_data绑定一个新变量 - 用"写入表格数据"把
merged_data写入总表
容易踩坑:
- 所有待合并的Excel表头必须一致,否则合并后列会乱
- 如果Excel里有公式,
pd.read_excel读取的是计算后的值,不是公式本身 - 超大文件(单文件超过50MB)合并可能会慢,建议分批处理
操作四:批量下载网页图片
场景: 采集商品数据时,需要把商品主图下载到本地。
# ===== 核心指令:下载文件 =====
# 指令:下载文件
# 参数:
# URL:https://img.pdd.com/xxx.jpg
# 保存路径:C:\images\商品_001.jpg
# 超时时间:30秒
# ===== 在采集循环中下载图片 =====
循环列表(商品数据列表):
当前商品 = 当前循环项
图片URL = 当前商品["图片链接"]
商品编号 = 当前商品["编号"]
# 下载图片
下载文件(
URL=图片URL,
保存路径="C:\\images\\" + 商品编号 + ".jpg",
超时=30秒
)
输出日志("已下载:" + 商品编号 + ".jpg")
等待(0.5秒) # 避免下载过快被封
下载图片容易踩的三个坑:
坑1:图片URL是相对路径
有些平台返回的图片URL是/img/xxx.jpg,需要拼完整URL:
完整URL = "https:" + 相对路径 # 或 "https://img.pdd.com" + 相对路径
坑2:图片下载失败(403/404) 可能是防盗链机制。解决办法:在下载指令里加**"Referer"请求头**,模拟从目标页面访问图片。
# 下载文件指令的"请求头"参数里添加:
Referer: https://www.pinduoduo.com
坑3:文件名有特殊字符
图片URL里可能带?、&、%等特殊字符,直接用作文件名会报错。用Python清洗一下:
import re
def safe_filename(url):
# 提取URL中最后一个/后面的部分
filename = url.split('/')[-1]
# 去掉?后面的参数
filename = filename.split('?')[0]
# 只保留字母、数字、点、下划线、中划线
filename = re.sub(r'[^a-zA-Z0-9._-]', '', filename)
return filename
操作五:批量删除空文件或旧文件
场景: 流程运行久了,日志文件夹、临时图片文件夹里堆积了大量文件,需要定期清理。
# 1. 获取文件夹内所有文件
获取文件夹内文件列表("C:\logs") → 存入「所有文件」
# 2. 循环检查每个文件
循环列表(所有文件):
当前文件路径 = "C:\logs\" + 当前循环项
# 获取文件大小(影刀指令:获取文件信息)
文件大小KB = 获取文件大小(当前文件路径) # 单位KB
# 删除空文件(小于1KB视为空)
如果 文件大小KB < 1:
删除文件(当前文件路径)
输出日志("已删除空文件:" + 当前文件路径)
# 或者按时间删除:获取文件修改时间
修改时间 = 获取文件修改时间(当前文件路径)
如果 当前时间 - 修改时间 > 30天:
删除文件(当前文件路径)
输出日志("已删除旧文件:" + 当前文件路径)
操作六:按日期归档文件
场景: 每天采集的图片和数据,需要按YYYY-MM-DD的格式归档到不同文件夹。
# 生成当天的归档文件夹路径
当前日期 = 当前日期格式化("YYYY-MM-DD")
归档根目录 = "C:\archive\"
当天归档目录 = 归档根目录 + 当前日期 + "\"
# 创建当天目录(如果不存在)
如果 文件夹不存在(当天归档目录):
创建文件夹(当天归档目录)
# 移动文件到归档目录
获取文件夹内文件列表("C:\temp\待归档") → 存入「待归档文件列表」
循环列表(待归档文件列表):
当前文件 = 当前循环项
移动文件(
原路径="C:\temp\待归档\" + 当前文件,
目标路径=当天归档目录 + 当前文件
)
输出日志("已归档 " + 列表长度(待归档文件列表) + " 个文件到 " + 当天归档目录)
进阶:按月份建文件夹
当前月份 = 当前日期格式化("YYYY-MM")
归档目录 = "C:\archive\" + 当前月份 + "\"
# 所有当月文件放进同一个文件夹,跨月自动新建
操作七:文件批量压缩(配合发送邮件)
场景: 采集完几百张图片后,需要打包成ZIP发给同事。
影刀没有直接的"压缩文件夹"指令,但可以用"执行Python代码"调用Python的zipfile库:
# 执行Python代码:将文件夹压缩为ZIP
# 输入:source_folder(文本),目标zip路径(文本)
# 输出:无
import zipfile
import os
def zip_folder(source_folder, zip_path):
with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zipf:
for root, dirs, files in os.walk(source_folder):
for file in files:
file_path = os.path.join(root, file)
arcname = os.path.relpath(file_path, start=source_folder)
zipf.write(file_path, arcname)
zip_folder("C:\\images\\今日采集", "C:\\output\\今日采集图片.zip")
压缩完成后,可以用影刀的"发送邮件"指令把ZIP文件作为附件发出。
文件处理常见问题速查表
| 现象 | 排查方向 | 修复方法 |
|---|---|---|
| 找不到文件 | 路径写错了 | 检查路径是否存在,\\是否正确 |
| 文件正在使用无法操作 | Excel或图片被其他程序打开 | 关闭正在打开该文件的程序 |
| 重命名报错"已存在" | 目标文件名已存在 | 先判断文件是否存在,存在则先删除或改名 |
| 图片下载失败 | 防盗链或URL失效 | 检查Referer请求头,或URL是否完整 |
| Excel合并后数据错位 | 表头不一致 | 检查所有文件的列名是否完全一致 |
| 批量操作卡住 | 文件数量太大 | 分批处理,每批50个 |
| 文件名乱码 | 编码问题 | 用Python处理文件名时指定encoding='utf-8' |
一条核心建议
把文件处理操作也做成"子流程模板",和采集逻辑分开。
F01_批量重命名模板F02_按规则分类模板F03_Excel合并模板F04_图片下载模板
这些模板和采集流程无关,任何项目需要文件处理时直接调用。采集流程只管"抓数据",文件处理流程只管"整理数据",各司其职,互不干扰。
我现在的做法是:采集流程输出原始文件到一个"待处理"文件夹,然后单独跑一个"文件整理流程"(定时任务),自动完成重命名、分类、合并、归档这一整套操作。这样采集流程崩了,文件整理流程不浪费时间重复执行;文件整理逻辑改了,也不需要改采集流程。
推荐资源
- Python
os模块文档(文件路径操作) - Python
shutil模块文档(文件复制/移动) - 影刀官方文档:"文件与文件夹"指令集说明
#影刀RPA #RPA自动化 #文件处理 #Excel合并 #图片下载
作者:林焱
本文为《影刀RPA学习手册》系列文章之一,内容源于实操经验的整理与分享。
