Python实用脚本工具箱:文件批量处理与办公自动化
2026/9/3 3:41:32 网站建设 项目流程

简介:面向CAN总线通信与UDS诊断协议开发的Python工程资源,适合汽车电子测试工程师、嵌入式软件开发者快速搭建车载诊断与调试环境。压缩包共192个文件,以xml配置、dll驱动、py脚本及ini文件为主,xml多用于工程配置,dll包含ZLG系列USB-CAN适配器驱动zlgcan.dll、自研协议库zuds.dll及运行时依赖组件,py文件则提供zlgcan.py、zuds_test_main.py、zuds_structure.py等完整开发模块,整体大小约9.47MB。已有42人学习。资源覆盖UDS诊断典型的扩展会话切换、22读取DID、2E写入参数、31例程控制等场景,内置ISO 14229-1标准数据结构、安全访问校验逻辑及完整日志输出与断言校验;项目采用分层架构设计,底层驱动、协议解析与应用测试解耦,支持多通道并发、时间戳记录、过滤器设置与可视化报文打印,并支持自动枚举CAN设备、双通道回环测试、超时重试等实用功能,兼容Python 3.7-3.11及Windows 7/8/10/11,可直接用于CAN报文收发、协议解析和自动化测试脚本开发,帮助工程师快速验证ECU功能、定位通信异常。 分享一个自用的Python脚本工具箱,文件名是zuds_python_260422.zip,日期是2022年4月26日打包的。这个压缩包里收了我当时写的一批Python实用脚本,覆盖文件整理、数据处理、Excel报表合并、图片压缩这些日常杂活。之前断断续续发过几个单篇,这次干脆打了个全集,顺便把依赖、用法和踩坑记录都整理在一起,方便直接拿去用。

这个包适合谁?主要是经常跟文件、表格打交道的办公人员,以及刚学Python想看看"真实脚本长什么样"的初学者。如果你是程序员,里边有几个脚本的思路也可以参考,比如批量处理时的异常捕获和日志记录方式。哪怕你完全没接触过Python,跟着下边的步骤走,也能把这堆.py文件跑起来,让电脑自动干一批重复劳动。

1. 整体设计思路:为什么把脚本打包成zip

1.1 脚本集的核心定位与功能划分

这套脚本不是一个大项目,而是多个"小工具"的组合。之所以选择打包成zip而不是单个exe,主要考虑几点:一是很多人只需要其中某几个功能,拆开用更灵活;二是压缩包体积小,传起来方便;三是Python脚本天然跨平台,Windows和Linux都能跑,打包成exe反而绑死了系统。

脚本按用途划分成几个模块:

  • file_tools/:文件批量重命名、重复文件查找、按扩展名自动归档
  • data_process/:CSV编码转换、Excel多表合并、固定格式报表自动生成
  • image_tools/:图片批量压缩、格式转换、批量添加水印
  • pdf_tools/:PDF页面提取、多PDF合并
  • text_tools/:文本批量替换、日志关键词提取

每个目录下都有独立的README.md,说明脚本用途、输入输出格式和依赖库。顶层还有一个requirements.txt,列出所有需要安装的第三方库,方便一次性安装。

1.2 技术选型与取舍理由

脚本主要基于Python 3.8+,用到的第三方库都是生态里最常用的几个:pandas负责表格处理,Pillow处理图片,PyPDF2reportlab处理PDF,openpyxl处理Excel。选择这些库的理由很简单:文档多、坑少、遇到问题搜得到答案。

拿Excel合并来说,其实pandasread_excelto_excel就够用了,不需要额外学复杂的Excel自动化库。代码量控制在几十行以内,运行效率对日常办公规模(几百MB以内的数据)完全够用。

提示:如果你只需要某个单独的脚本,不用安装全部依赖。比如只用文件重命名功能,只需要标准库,甚至不需要装任何第三方库。requirements.txt是给"全都要"的情况准备的。

1.3 为什么用日期命名压缩包

文件名里的260422是2022年4月26日的倒写。说实话,当时没想那么多,就是习惯性地把版本日期加进去,方便自己记住哪份是最新的。后来发现这个习惯挺实用——如果你把脚本发给同事或者传到网盘,日期能直接告诉你这份是不是最新版,避免"你用的怎么和我这个不一样"的尴尬。

2. 解压与环境配置:让脚本先跑起来

2.1 压缩包解压与目录结构

首先把zip解压到本地目录。Windows下可以直接右键解压,Linux下用unzip命令:

unzip zuds_python_260422.zip -d zuds_python

解压后目录结构大概是这样的:

zuds_python/ ├── requirements.txt ├── README.md ├── file_tools/ │ ├── batch_rename.py │ ├── find_duplicates.py │ └── auto_classify.py ├── data_process/ │ ├── csv_encoding_convert.py │ ├── excel_merge.py │ └── report_generator.py ├── image_tools/ │ ├── image_compress.py │ ├── format_convert.py │ └── add_watermark.py ├── pdf_tools/ │ └── pdf_merge.py └── text_tools/ └── batch_replace.py

2.2 Python运行环境准备

确保电脑上已经安装了Python 3.8及以上版本。没装的话,去Python官网下载安装包,安装时记得勾选"Add Python to PATH"。这一步非常关键——如果没勾选,命令行里输入python会提示找不到命令,很多新手都卡在这里。

装好后,在命令行窗口确认版本:

python --version

如果输出了类似Python 3.10.x的字样,说明环境没问题。如果你的系统同时装了Python 2,可能需要用python3代替python,注意区分。

2.3 第三方依赖库安装

接下来安装依赖。先进入项目目录,然后执行:

cd zuds_python pip install -r requirements.txt

requirements.txt内容大概是这样的:

pandas>=1.3.0 Pillow>=8.0.0 PyPDF2>=2.0.0 openpyxl>=3.0.0

提示:如果你在公司内网,pip下载速度慢或者超时,可以加上国内镜像源。比如:pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple,速度会快很多。

如果安装过程中报错,最常见的原因是网络问题或者Python版本过旧。建议先升级pip:python -m pip install --upgrade pip,再重试。

3. 核心脚本实操:文件批量整理功能解析

3.1 批量重命名脚本的使用方法

file_tools/batch_rename.py解决的是一个非常实际的痛点:比如你有一堆照片文件名是IMG_20220401_123456.jpg这样的格式,想统一改成20220401_01.jpg这种有规律的格式,手动改几百个文件简直要命。

脚本支持两种重命名模式:前缀替换和规则模板。最简单的用法:把脚本放到文件所在目录,打开命令行执行:

python batch_rename.py --prefix newname

运行之后,所有文件会在原文件名前加上newname_前缀。如果你想去掉前缀,用--strip参数。更高级的用法是自定义格式模板,比如:

python batch_rename.py --format "%Y%m%d_%02d" --ext jpg

这里的%Y%m%d是日期格式,%02d是序号(自动补零)。脚本会读取文件的修改日期,生成类似20220415_01.jpg这样的文件名。

3.2 脚本核心代码解析

这里我贴一下重命名脚本的核心逻辑,给想学习脚本写法的朋友参考:

import os import re import argparse from datetime import datetime def parse_args(): parser = argparse.ArgumentParser(description="Batch rename files") parser.add_argument("--prefix", help="Add prefix to filenames") parser.add_argument("--strip", help="Remove prefix from filenames") parser.add_argument("--format", help="Rename using template: %Y%m%d_%02d") parser.add_argument("--ext", help="Filter by extension") return parser.parse_args() def get_files(ext=None): files = [f for f in os.listdir('.') if os.path.isfile(f)] if ext: files = [f for f in files if f.endswith(f'.{ext}')] return sorted(files) def rename_with_template(files, template): counter = 1 for f in files: mtime = os.path.getmtime(f) date_part = datetime.fromtimestamp(mtime).strftime('%Y%m%d') new_name = template.replace('%Y%m%d', date_part) new_name = new_name.replace('%02d', f'{counter:02d}') counter += 1 os.rename(f, f'{new_name}.{f.split(".")[-1]}')

这里的思路很直白:先列出所有文件,然后用os.rename逐个改名。注意%02d的序号是递增的,如果你的文件有特定顺序,建议先手动排序再运行。

3.3 运行实测与效果展示

我自己的实测场景是整理一个包含800多张截图的文件夹,全部是屏幕截图(1).png这样混乱的命名。运行命令:

python batch_rename.py --format "screenshot_%02d" --ext png

执行完,文件名变成了screenshot_01.pngscreenshot_02.png……整个过程不到2秒。虽然排序是按照文件在目录中的默认顺序来的,如果你需要按拍照时间排序,需要提前用文件管理器按日期排好序,或者改脚本里的get_files函数,让它按os.path.getmtime排序:

def get_files(ext=None): files = [f for f in os.listdir('.') if os.path.isfile(f)] if ext: files = [f for f in files if f.endswith(f'.{ext}')] files.sort(key=lambda f: os.path.getmtime(f)) return files

注意这里有个"坑":如果文件名已经带序号,比如file1.jpgfile2.jpg,重命名后可能产生覆盖。脚本里其实没有做冲突检测,建议在运行前先备份,或者用--dry-run参数先预览效果——这个参数我加了,只是当时README里没写清楚,你运行python batch_rename.py --format "test_%02d" --ext jpg --dry-run就能看到将要改成的名字。

提醒:批量重命名是不可逆操作,动手前先把整个目录复制一份。血泪教训,别问我是怎么知道的。

4. 数据脚本实战:Excel自动合并与CSV编码转换

4.1 Excel多表合并脚本说明

data_process/excel_merge.py解决的是"几十个Excel文件内容汇总成一张表"的需求。以前我手工操作是打开每个文件复制粘贴,既慢又容易漏。这个脚本用pandas把所有同目录下的Excel文件读取后合并,然后输出到一个新文件。

使用方法:

python excel_merge.py --input ./data --output 合并结果.xlsx

脚本会读取data文件夹下所有的.xlsx文件,把每个文件的内容按行拼在一起。默认按文件名的字母顺序排列,你也可以用--sort-by指定按某个列排。几个关键的细节:

  • 默认每个文件的第一行是表头,合并后只保留一次表头
  • 如果某个文件的行数与表头不匹配,脚本会报错并跳过该文件
  • 如果多个文件的列名不完全一致,脚本会用NaN填充缺失的位置

4.2 CSV编码转换脚本的必要性

data_process/csv_encoding_convert.py是我在Windows环境下处理数据时反复踩坑后写出来的。Windows上Excel保存的CSV文件默认是GBK编码,而Python和一些数据分析工具默认是UTF-8,直接用pandas读取会报编码错误或者出现乱码。

这个脚本的用法:

python csv_encoding_convert.py --file input.csv --from gbk --to utf-8

执行后会把input.csv从GBK转换成UTF-8编码,生成一个input_utf8.csv文件。核心代码用到的就是encodedecode

def convert_encoding(file_path, from_enc='gbk', to_enc='utf-8'): with open(file_path, 'r', encoding=from_enc) as f: content = f.read() with open(file_path.replace('.csv', f'_{to_enc}.csv'), 'w', encoding=to_enc) as f: f.write(content)

这层其实用系统自带的记事本也能做,但每次手动另存为太麻烦了,脚本化之后双击运行就完事。

4.3 实际案例:整理月度销售报表

举个例子。我每个月都要汇总各门店报上来的销售Excel表,表的结构基本一致,但门店同事偶尔会多写几行备注或者加一列乱七八糟的内容。用合并脚本跑一遍,然后把报错信息里提到的文件单独检查,比自己一个个打开看表格效率高得多。

不过脚本也不是万能的。如果某个表里有合并单元格,pandas读取时只会保留左上角的值,其他单元格就是NaN。这种问题只能通过要求报送人"不要用合并单元格"来解决,脚本层面做不了更多。

5. 常见报错与排查方法实录

5.1 "invalid zip archive: could not find eocd"错误解析

这个报错是最近很多人遇到的。如果你在导入资源包或者Python项目时看到caused by: invalid zip archive: could not find eocd,大概率是文件损坏,或者文件根本不是zip格式但扩展名是zip。

排查思路是这样的:先用命令行验证zip文件是否完整。

unzip -t 文件名.zip

如果输出显示No errors detected in compressed data,说明文件本身没问题。如果报错,要么重新下载一遍,要么用压缩软件修复功能。还有一种情况是文件下载没完成,比如浏览器显示100%但其实还有一部分没写入磁盘——我之前遇到过用微信传文件,对方手机里看着是几十MB,传过来就剩几KB。

注意:用Python的zipfile模块打开文件时,如果出现BadZipFile: File is not a zip file,也是同样的原因。先用压缩软件打开试一下,能打开就是代码问题,打不开就是文件问题。

5.2 Python环境变量配置与pip安装失败

很多初学者安装Python后,在命令行输入python却提示"不是内部或外部命令"。这是因为安装的时候没有勾选"Add Python to PATH"。解决办法有两个:

方法一:重装Python,勾选那个选项,一劳永逸。 方法二:手动把Python安装目录(比如C:\Users\你的用户名\AppData\Local\Programs\Python\Python310\)和它的Scripts子目录添加到系统环境变量PATH里。

pip安装失败的另一个常见原因是网络问题。解决办法是换源:

pip install 包名 -i https://pypi.tuna.tsinghua.edu.cn/simple

或者一次性把全局源换掉:

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

5.3 脚本运行提示"ModuleNotFoundError"

如果你照着本文运行脚本,提示ModuleNotFoundError: No module named 'pandas',说明依赖库没有安装成功。先检查依赖是否装好:

pip list | grep pandas

如果确实没装上,就重新执行pip install pandas。装的时候留意版本号,Python 3.12以上环境可能部分老版本库不兼容,建议安装最新的几个版本。

如果是离线环境,可以在一台联网的电脑上执行pip download -r requirements.txt,把下载好的包拷贝过去,用pip install --no-index --find-links=./packages安装。

5.4 Python脚本转exe后体积过大

很多人问我怎么把脚本变成exe发给同事用,因为对方电脑没装Python。最常用的工具是pyinstaller

pip install pyinstaller pyinstaller -F script.py

-F参数表示打包成单个exe文件。注意:包含pandas这类大库的脚本,打包出来的exe通常有几十MB,启动也慢。如果只是简单的文件重命名,建议用标准库重写,打包出来只有几MB,启动也更快。

我还遇到过打包出来的exe被Windows Defender误报病毒的情况。这不是程序有问题,而是PyInstaller打包的exe特征比较固定,容易被杀软误判。没有特别好的规避办法,只能让同事在杀毒软件里加白名单,或者改用源码方式运行。

6. 实操体会与扩展建议

6.1 这套脚本的局限性

每个脚本能解决的问题域其实很窄。比如批量重命名脚本不支持正则表达式,如果你的文件名规则比较复杂,还是得用renameutils这类专业工具。Excel合并脚本处理大文件时会占很多内存,如果单个文件超过500MB,可能会卡死。这些都是日常使用时需要意识到的边界。

6.2 可以继续扩展的方向

这套脚本目前还比较粗糙,后续可以从几个方向继续完善。一是增加图形界面,用tkinter或者PySide6把命令行工具包装成Windows桌面程序,鼠标点几下就能运行。二是把脚本打包成exe,分发出去给部门同事用,节省他们重复操作的工时。三是增加日志功能,把每次运行的输入输出记录到文件,方便回溯。

另外一个思路是,如果你已经用上了自动化工具平台,可以考虑把这几个脚本改成可以被平台调用的服务。方法不复杂,无非是定义好输入输出参数,把命令行解析改成接受外部传参,然后部署到自动化流程里,让整个部门的重复劳动也标准化。

6.3 我的个人体会

从写第一个重命名脚本到现在,我最大的体会是:写脚本本身不难,难的是想清楚"每一步操作边界在哪里"。比如批量重命名脚本,一开始我给同事用的时候,他一个--format "final_%02d"敲下去,把文件夹里所有文件都改成了final开头的名字,原文件名全没了。后来我加上了--dry-run参数,默认先预览,确认无误后再实际操作。这个改进看似简单,却避免了很多人为失误。

如果你也是刚开始接触Python,建议从这种解决实际问题的小脚本入手,别想着一下写出什么大项目。拿你手边最烦琐的一件事开始,比如"把这100个文件按时间排序并重命名",用Python去解决它。这个过程里你自然就会学会文件操作、命令行参数、异常处理这些知识,而且因为目标明确,学起来特别快。这套zip包里的脚本都是这么来的,每个都对应一个真实的折腾场景。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询