Python基础入门:零基础搞定自动化办公的实战路径
1. 这不是“学Python”,而是重建你和计算机对话的方式
“Learn basic python”——这行字我每天在新手群、自学论坛、甚至公司内训报名表里看到不下二十次。但绝大多数人点开教程的前三分钟,心里想的其实是:“我到底要拿它干什么?写个计算器?还是让Excel自动跑报表?”答案往往模糊得像隔着毛玻璃看灯泡。我带过三百多个零基础学员,从退休教师到45岁转行的销售总监,最常听到的困惑不是“print怎么拼”,而是“学完这个,我能解决手头那个重复三小时的报销单整理吗?”——这才是“basic python”的真实起点:它从来不是语法练习册,而是一把能撬动你日常工作效率的螺丝刀,一把能把你从机械劳动里解救出来的杠杆。
核心关键词 python基础 、 零基础入门 、 自动化办公 、 逻辑思维训练 、 可执行技能 ,全部指向一个事实:你不需要成为程序员,但你需要掌握一种“让机器替你干活”的基本能力。它不考你背诵 __name__ == '__main__' 的含义,而是看你能不能用5行代码,把200份PDF合同里的甲方名称批量提取出来,存进Excel;它不测试你对装饰器的理解深度,而是验证你能否写出一个脚本,每天早上9点自动登录内部系统,抓取最新销售数据,生成图表并邮件发给主管。这就是 basic python 的底层逻辑——它是一门“问题驱动型语言”,语法只是工具,解决问题才是目的。适合谁?所有被重复性操作拖住手脚的人:行政要整理会议纪要,财务要核对上千条流水,HR要筛选几百份简历,老师要统计学生成绩……只要你每天有超过15分钟在做“复制-粘贴-填表-核对”这类动作,basic python就是为你量身定制的效率加速器。它不要求你懂算法,但要求你愿意把“我手动做了10遍的事”,拆解成“机器帮我做100遍的步骤”。
我见过太多人卡在第一步:对着《Python编程:从入门到实践》第3章的“变量与数据类型”发呆,因为书里举的例子是“创建一个名为message的字符串,赋值为‘Hello World’”。可现实里,你的“message”可能是销售部刚发来的、命名混乱的17个Excel文件夹,里面混着“2024Q1_销售数据_v2_final.xlsx”和“销售数据_最终版_别删.xlsx”。basic python的价值,恰恰在于教会你如何把这种混乱的现实,翻译成计算机能听懂的清晰指令。所以,别把它当成一门“编程课”,把它当作一堂“如何向机器下命令”的沟通训练课。你学的不是代码,而是结构化表达的能力——把模糊的需求(“把所有含‘退款’的订单标红”)变成精确的步骤(“遍历每一行→检查D列是否包含‘退款’→如果是,将整行背景色设为红色”)。这种能力,比任何语法细节都更基础,也更持久。
2. 内容整体设计与思路拆解:为什么跳过“Hello World”,直奔“我的报销单”
很多人学Python失败,根本原因不是笨,而是路径错了。传统教材的路线是:语法 → 数据结构 → 函数 → 面向对象 → 项目实战。这就像教人开车,先花两周背熟发动机原理图、变速箱齿轮比,再让你摸方向盘。而我们设计的 basic python 学习路径,是反着来的:从你明天就要用上的真实场景切入,倒推需要哪些最小知识模块。整个设计基于一个核心原则: 80%的日常办公自动化,只用到Python 20%的语法特性 。这意味着,我们主动放弃那些炫技但低频的内容(比如复杂的正则表达式、多线程并发),把火力集中在“能立刻见效”的硬核组合上。
为什么第一课不是 print("Hello World") ,而是“用Python自动整理报销单”?因为这是认知锚点。当你亲手运行一段代码,看着原本散乱在12个不同文件夹里的发票图片,被自动重命名(“张三_20240515_餐饮_328.50.jpg”)、分类归档(“/餐饮/”、“/交通/”、“/住宿/”)、生成汇总表(总金额、各类别占比),那种“我刚刚真的指挥了电脑做事”的实感,会瞬间击穿学习惰性。这种正向反馈,比一百句“Python很有用”都管用。我们的知识图谱是这样铺开的:以“处理Excel”为第一主干,因为它覆盖了行政、财务、HR等绝大多数岗位的核心痛点;第二主干是“批量处理文件”,解决文档管理混乱;第三主干是“简单网络交互”,比如自动下载日报、抓取网页公告。所有语法点(变量、循环、条件判断、函数)都作为支撑这些主干的“钢筋”嵌入其中,而不是孤立存在。例如,学 for 循环,不是去打印1到100的数字,而是写一个脚本,遍历你桌面上所有 .docx 文件,把它们统一转换成PDF格式——你立刻明白 for 的本质是“对一批东西做同一件事”。
工具选型上,我们坚决不用IDLE或Sublime Text这类“纯代码编辑器”。新手的第一道坎,往往是环境配置失败、中文路径报错、依赖包装不上。所以全程锁定 VS Code + Python官方插件 + Jupyter Notebook 组合。VS Code界面清爽,错误提示友好,一键运行;Jupyter Notebook则像一个活的实验笔记本,代码、结果、说明文字可以混排,特别适合边学边试。至于Python版本,直接锁定 3.10 ——它足够新(支持海象运算符 := 等实用特性),又足够稳(不像3.12那样有少量库尚未适配),且Windows/macOS/Linux三大平台安装包都是傻瓜式一键安装。所有示例代码都经过跨平台实测,确保你在公司电脑(Win10)、家里MacBook或Linux服务器上,复制粘贴就能跑通。这种“零摩擦启动”的设计,不是偷懒,而是尊重学习者的注意力资源——你宝贵的精力,应该花在理解逻辑上,而不是和 pip 报错信息搏斗。
3. 核心细节解析与实操要点:从“读Excel”到“自动生成周报”的完整链路
3.1 为什么 pandas 是办公自动化的绝对核心,以及如何避开它的“温柔陷阱”
提到Python处理Excel,新手常被 openpyxl 和 pandas 搞晕。 openpyxl 能精细控制单元格样式、公式、图表,但它像一台精密手术刀——功能强大,但操作繁琐。而 pandas ,则是为你量身打造的“Excel增强版”。它把整个Excel表格看作一个叫 DataFrame 的数据框,你可以用一句 df[df['金额'] > 1000] ,就筛选出所有超千元的报销单;用 df.groupby('部门')['金额'].sum() ,瞬间算出各部门总花费。这种“所想即所得”的体验,正是basic python追求的效率本质。
但 pandas 有个经典“温柔陷阱”:它默认把Excel里的空单元格读作 NaN (Not a Number),而 NaN 在计算中会传染——比如 sum() 遇到 NaN ,结果直接变 NaN 。我带过的学员里,有位财务专员按教程写了 df['金额'].sum() ,结果周报里显示“总计:nan”,当场崩溃。解决方案其实很简单:在读取时就明确告诉 pandas ,“空单元格请当0处理”:
import pandas as pd
# 关键参数:na_values指定哪些值算空,keep_default_na=False禁用默认空值识别
df = pd.read_excel('报销单.xlsx', na_values=['', 'N/A', 'NULL'], keep_default_na=False)
# 然后用fillna(0)把所有空值替换为0
df['金额'] = df['金额'].fillna(0)
这个细节背后是重要理念: 数据清洗永远是分析的第一步,也是最容易被忽略的一步 。现实中,业务数据永远不“干净”——有人填“1000”,有人填“¥1,000.00”,还有人手误打成“1000元”。 pandas 的强大,不在于它能处理完美数据,而在于它提供了 str.replace() 、 str.extract() 、 astype() 等一系列“数据美容师”工具。比如统一金额格式:
# 把“¥1,000.00”、“1000元”、“1000”全部转成数字1000.0
df['金额'] = df['金额'].astype(str).str.replace(r'[¥,元]', '', regex=True).str.strip()
df['金额'] = pd.to_numeric(df['金额'], errors='coerce') # errors='coerce'把无法转换的变NaN,方便后续排查
提示:
errors='coerce'是pandas的救命稻草。它不会让程序崩溃,而是把脏数据悄悄变成NaN,让你能一眼看出哪些数据需要人工复核。这比程序直接报错退出,更适合办公场景。
3.2 文件批量处理:从“重命名100张发票”到“自动归档”的工程化思维
处理文件,是另一个高频刚需。想象你每周收到市场部发来的100张活动照片,命名全是“IMG_20240515_123456.jpg”、“DCIM_789.jpg”,你需要按活动主题(如“新品发布会”、“用户沙龙”)分类存放。手动操作?至少半小时。用Python,核心就三步: 定位文件 → 解析信息 → 执行动作 。
第一步“定位文件”,新手常犯错:用 os.listdir() 只获取当前目录下的文件名,却忘了子目录。正确姿势是 pathlib 库,它是Python 3.4+的官方推荐,语法优雅得像在说英语:
from pathlib import Path
# 找到桌面下所有jpg文件,包括子文件夹里的
jpg_files = list(Path.home() / 'Desktop').rglob('*.jpg')
# rglob = recursive glob,递归搜索
第二步“解析信息”,关键在于 从混乱命名中提取结构化线索 。如果照片名里没有线索,就看EXIF信息(拍照时间、设备型号)。 exifread 库能读取这些隐藏数据:
import exifread
for img_path in jpg_files:
with open(img_path, 'rb') as f:
tags = exifread.process_file(f, details=False)
# 获取拍摄时间,格式如'2024:05:15 14:23:01'
date_taken = str(tags.get('EXIF DateTimeOriginal', ''))
if date_taken != '': # 确保有时间信息
# 提取年月,用于创建文件夹名
year_month = date_taken.split()[0].replace(':', '')[:6] # '202405'
target_folder = Path.home() / 'Pictures' / '活动照片' / year_month
target_folder.mkdir(parents=True, exist_ok=True) # parents=True自动创建多级目录
# 第三步:移动文件
img_path.rename(target_folder / img_path.name)
这段代码展示了basic python的精髓: 用最少的代码,解决最痛的点 。 mkdir(parents=True, exist_ok=True) 这一行,就省去了手动创建“202405”、“202406”等文件夹的麻烦; rename() 直接移动,比复制再删除更高效。这里有个血泪经验: 永远在正式运行前,先用 print() 把要执行的动作“预演”一遍 。比如把 img_path.rename(...) 换成 print(f"将移动 {img_path} 到 {target_folder}") ,确认逻辑无误再动手。我曾因少加了一个 print ,误把客户资料全移到了回收站,花了两小时才恢复——这教训值得所有人记住。
3.3 自动化周报生成:把“复制粘贴”升级为“一键生成”的质变
生成周报,是检验basic python能力的终极考场。它融合了Excel读取、数据计算、图表绘制、PDF导出四大模块。我们以销售周报为例,目标:从 sales_data.xlsx 中读取本周数据,计算环比增长率,生成柱状图,并导出为 sales_report_20240515.pdf 。
核心难点不在代码,而在 数据流的设计 。很多新手试图在一个脚本里完成所有事,导致代码臃肿难维护。专业做法是分层: 数据层(读取+清洗)→ 计算层(指标生成)→ 展示层(图表+报告) 。
# 数据层:clean_data.py
import pandas as pd
def load_and_clean(file_path):
df = pd.read_excel(file_path)
# 清洗:处理空值、统一日期格式、过滤无效数据
df['日期'] = pd.to_datetime(df['日期'])
df = df.dropna(subset=['销售额', '订单数']) # 删除关键字段为空的行
return df
# 计算层:calculate_metrics.py
def calculate_weekly_report(df):
# 按周聚合(假设df有'日期'列)
weekly_df = df.resample('W-MON', on='日期').sum(numeric_only=True)
# 计算环比:本周/上周 - 1
weekly_df['环比增长'] = weekly_df['销售额'].pct_change()
return weekly_df
# 展示层:generate_report.py
import matplotlib.pyplot as plt
from fpdf import FPDF
def create_pdf_report(data_df, output_path):
# 绘制销售额趋势图
plt.figure(figsize=(10, 6))
plt.plot(data_df.index, data_df['销售额'], marker='o')
plt.title('周销售额趋势')
plt.ylabel('销售额(万元)')
plt.grid(True)
plt.savefig('temp_chart.png', dpi=300, bbox_inches='tight')
# 用FPDF生成PDF
pdf = FPDF()
pdf.add_page()
pdf.set_font("Arial", size=12)
pdf.cell(200, 10, txt="销售周报", ln=True, align='C')
# 插入图表
pdf.image('temp_chart.png', x=10, y=30, w=180)
pdf.output(output_path)
注意:
fpld库需单独安装(pip install fpdf),它比reportlab轻量,对basic需求足够。生成PDF时,plt.savefig()的dpi=300保证打印清晰,bbox_inches='tight'避免图表被裁切——这些参数,都是踩坑后总结的“隐形知识”。
4. 实操过程与核心环节实现:一个真实案例的逐行拆解
4.1 场景还原:行政专员的“会议纪要整理噩梦”
王琳是某科技公司的行政专员,每周要整理5场以上会议的纪要。流程是:从钉钉/微信收齐12份录音转文字稿(格式各异),手动复制到Word,按“时间-主持人-议题-结论-待办”结构排版,最后邮件发给参会人。平均耗时3.5小时/周。她找到我时,诉求很朴素:“能不能让电脑帮我把录音稿里的‘待办事项’自动摘出来,列成清单?”
这就是perfect的basic python切入点。我们没碰高大上的语音识别API,而是聚焦“文本提取”这一最小可行单元。原始文本样例( meeting_001.txt ):
【2024-05-10 14:00】项目启动会
主持人:张经理
议题:XX系统上线计划
...
结论:6月30日前完成UAT测试
待办:1. 李工负责梳理测试用例(5月15日前);2. 王琳协调测试环境(5月18日前);3. 赵总审批预算(5月20日前)
...
4.2 代码实现:从需求到运行的每一步推演
第一步:明确提取规则
待办事项总在“待办:”后面,用分号分隔,每项含“人名+职责+截止日”。规则可抽象为:
- 定位字符串“待办:”
- 提取其后到换行符之间的所有内容
- 按分号分割成列表
- 对每项,用正则提取“人名”、“职责”、“日期”
第二步:编写核心提取函数
import re
from pathlib import Path
def extract_action_items(file_path):
"""从单个会议纪要文件中提取待办事项"""
with open(file_path, 'r', encoding='utf-8') as f:
text = f.read()
# 正则:匹配“待办:”后的内容,直到遇到换行或“...”
action_text_match = re.search(r'待办:(.*?)(?=\n|...)', text, re.DOTALL)
if not action_text_match:
return [] # 没找到待办,返回空列表
action_text = action_text_match.group(1).strip()
# 按分号分割,去除空项和空白
items = [item.strip() for item in action_text.split(';') if item.strip()]
# 提取每项的结构化信息
structured_items = []
for item in items:
# 正则:匹配“姓名+负责/协调/审批+内容+(日期)”
# 示例:李工负责梳理测试用例(5月15日前)
pattern = r'([\u4e00-\u9fa5]+)[\u4e00-\u9fa5]*?(?:负责|协调|审批|提交|完成)(.*?)(?:(|\()(\d{1,2}月\d{1,2}日(?:前|后)?)(?:)|\))'
match = re.search(pattern, item)
if match:
name, task, deadline = match.groups()
structured_items.append({
'负责人': name.strip(),
'任务': task.strip(),
'截止日': deadline.strip()
})
return structured_items
# 测试单个文件
test_file = Path('meeting_001.txt')
items = extract_action_items(test_file)
print(items)
# 输出:[{'负责人': '李工', '任务': '梳理测试用例', '截止日': '5月15日前'}, ...]
第三步:批量处理所有文件
def batch_process_meetings(folder_path):
"""批量处理文件夹下所有txt会议纪要"""
folder = Path(folder_path)
all_items = []
# 遍历所有txt文件
for txt_file in folder.glob('*.txt'):
print(f"正在处理:{txt_file.name}")
items = extract_action_items(txt_file)
# 为每项添加来源文件名,便于追溯
for item in items:
item['来源文件'] = txt_file.name
all_items.extend(items)
# 转为DataFrame,方便后续操作
import pandas as pd
df = pd.DataFrame(all_items)
return df
# 运行批量处理
df_actions = batch_process_meetings('D:/会议纪要/')
print(df_actions.head())
# 导出为Excel
df_actions.to_excel('待办事项汇总.xlsx', index=False)
第四步:运行与验证
将代码保存为 extract_actions.py ,放在会议纪要文件夹同级目录。打开终端,执行:
python extract_actions.py
几秒后,生成 待办事项汇总.xlsx 。打开一看,12份纪要里的47项待办已整齐排列,列名清晰:负责人、任务、截止日、来源文件。王琳只需花5分钟检查是否有漏项(比如某份纪要里“待办”写成了“待办事项”),然后直接发给领导——耗时从3.5小时压缩到5分钟。这就是basic python的威力:它不创造新功能,而是把人类已有的、重复的、模式化的劳动,用代码固化下来。
5. 常见问题与排查技巧实录:那些没人告诉你的“坑”和“捷径”
5.1 编码报错: UnicodeDecodeError: 'gbk' codec can't decode byte 0xad ——中文世界的头号拦路虎
这是新手遇到最多、最懵的报错。根源在于:Windows记事本默认用 GBK 编码保存中文,而Python 3默认用 UTF-8 读取。当文件里有 GBK 特有的字符(如某些生僻字、旧版Office生成的符号), open() 就会崩溃。
标准解法 :强制指定编码为 gbk :
with open('file.txt', 'r', encoding='gbk') as f: # 不是'utf-8'
content = f.read()
但问题来了:你怎么知道该用 gbk 还是 utf-8 ? 终极方案是“自动探测” :
import chardet
def detect_encoding(file_path):
with open(file_path, 'rb') as f:
raw_data = f.read(10000) # 只读前1万字节,提高速度
encoding = chardet.detect(raw_data)['encoding']
return encoding or 'utf-8'
# 使用
encoding = detect_encoding('file.txt')
with open('file.txt', 'r', encoding=encoding) as f:
content = f.read()
chardet 库需 pip install chardet 。这个技巧的价值在于:它让你的脚本具备“环境适应性”,无论对方发来的是GBK、UTF-8还是ISO-8859-1编码的文件,都能自动兼容。这是我给所有学员的必装“安全气囊”。
5.2 Excel写入失败: PermissionError: [Errno 13] Permission denied ——被Excel“锁死”的真相
当你用 pandas 的 to_excel() 保存文件时,如果目标Excel文件正被Excel软件打开着,就会报这个错。表面看是权限问题,实则是Windows的文件锁机制:Excel进程占用了文件,Python无法写入。
最傻瓜的解法 :关掉Excel。但现实中,你可能忘了关,或者同事正开着。 专业解法是“改名避让” :
import os
from pathlib import Path
def safe_to_excel(df, file_path):
file_path = Path(file_path)
# 如果文件存在且被占用,尝试重命名原文件(加.bak后缀)
if file_path.exists():
backup_path = file_path.with_suffix(file_path.suffix + '.bak')
try:
file_path.rename(backup_path)
print(f"已备份原文件:{backup_path}")
except PermissionError:
# 如果连备份都失败,说明文件被强力锁定,改用新文件名
timestamp = pd.Timestamp.now().strftime('%Y%m%d_%H%M%S')
file_path = file_path.parent / f"{file_path.stem}_{timestamp}{file_path.suffix}"
df.to_excel(file_path, index=False)
print(f"文件已保存:{file_path}")
safe_to_excel(df_actions, '待办事项汇总.xlsx')
这段代码体现了basic python的务实哲学:不纠结于“为什么锁”,而是用“绕过去”的智慧解决问题。它先尝试备份,备份失败就自动创建带时间戳的新文件名,确保任务永不中断。
5.3 循环卡死: for i in range(1000000): 为什么我的电脑风扇狂转?
新手常写一个看似无害的循环,结果程序假死。根本原因不是循环本身,而是 循环体内做了高开销操作 。比如在循环里反复调用 pandas.read_excel() 读同一个大文件,或在循环里用 plt.show() 弹出1000个图表窗口。
排查口诀:“移出循环,一次搞定” 。
- 如果要处理100个Excel文件,别在循环里
read_excel()100次,而是用pd.concat([pd.read_excel(f) for f in files])一次性合并。 - 如果要画100张图,别用
plt.show(),改用plt.savefig(f'chart_{i}.png')批量保存,最后用plt.close()释放内存。
终极检测工具 : time 模块。在可疑循环前后加计时:
import time
start = time.time()
for i in range(10000):
# 你的代码
pass
end = time.time()
print(f"循环耗时:{end - start:.2f}秒")
如果耗时远超预期(比如0.01秒/次 × 10000次 = 100秒,实际跑了300秒),说明循环体里有“暗坑”,立即检查是否有I/O操作(读文件、联网)、图形渲染或未关闭的资源。
5.4 “代码能跑,结果不对”:逻辑漏洞的黄金排查法
最折磨人的不是报错,而是代码静默运行,结果却错得离谱。比如计算销售额总和,结果是负数;或筛选“金额>1000”,却漏掉了明明存在的记录。
独家排查四步法 :
- 断点验证 :在关键计算步骤后,加
print()输出中间变量。比如print(f"清洗后数据量:{len(df)}")、print(f"金额列前5行:{df['金额'].head().tolist()}")。 - 数据快照 :用
df.to_csv('debug_snapshot.csv', index=False)把中间数据存成CSV,用Excel打开肉眼检查。 - 缩小范围 :把大数据集切成小样本(如
df_sample = df.head(10)),确保逻辑在小数据上正确,再放大。 - 逆向验证 :用Excel手动算出一个结果,和代码输出对比。比如挑3条记录,手工加总金额,看代码结果是否一致。
我曾帮一位HR解决“简历筛选脚本漏人”问题,用第四步发现:脚本里 df[df['学历'].str.contains('本科')] 漏掉了“本科及以上”、“全日制本科”等表述。修正为 df[df['学历'].str.contains('本科', case=False, na=False)] ( case=False 忽略大小写, na=False 避免空值报错)后,问题消失。这个案例说明: 业务逻辑的严谨性,永远比代码技巧更重要 。
6. 工具链与效率组合:让basic python真正融入你的工作流
6.1 VS Code的“神级配置”:5分钟打造专属办公IDE
VS Code之所以成为我们的首选,不仅因为免费,更因为它能通过配置,变成你的“自动化工作台”。以下是三个必装插件和配置:
- Python官方插件 :提供智能补全、调试、Linting(语法检查)。开启
Pylint后,它会实时提醒你“变量名太短”、“函数缺少文档字符串”,强迫你写出可维护的代码。 - Code Runner :右键选择“Run Code”,无需打开终端,一键执行当前文件。对快速测试小脚本(如“试试这个正则能不能匹配”)极其高效。
- Auto Rename Tag :虽然主要为前端设计,但在处理HTML邮件模板时,改一个
<h1>标签,自动同步修改闭合标签,避免手误。
关键配置(settings.json) :
{
"python.defaultInterpreterPath": "./venv/Scripts/python.exe", // 指定虚拟环境解释器
"code-runner.runInTerminal": true, // 在终端运行,方便看到完整输出
"files.autoSave": "onFocusChange", // 失去焦点时自动保存,防忘存
"editor.fontSize": 14 // 字体调大,保护眼睛
}
提示:
python.defaultInterpreterPath指向虚拟环境,是隔离项目依赖的基石。创建虚拟环境只需两条命令:python -m venv venv(创建名为venv的环境)venv\\Scripts\\activate.bat(Windows激活)
这样,你为A项目装的pandas,绝不会影响B项目的numpy版本。
6.2 从“手动运行”到“定时触发”:让脚本真正自动化
写好脚本只是开始,让它每天早上8点自动运行,才算完成闭环。Windows用户首选 任务计划程序 ,macOS用户用 launchd ,但两者配置复杂。更简单的方案是: 用Python自身实现“简易定时器” 。
import schedule
import time
from datetime import datetime
def job():
print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] 开始执行周报生成...")
# 这里放你的核心代码,比如 batch_process_meetings()
print("周报生成完成!")
# 设定每天8:00执行
schedule.every().day.at("08:00").do(job)
# 主循环,保持程序运行
while True:
schedule.run_pending()
time.sleep(60) # 每分钟检查一次
将此代码保存为 auto_runner.py ,双击运行,它就会在后台默默等待。优点是跨平台、无需系统级配置;缺点是需要保持Python进程运行。对于长期服务,建议配合 pyinstaller 打包成exe,设置为开机自启——但这已超出basic范畴,点到为止。
6.3 错误处理的“兜底哲学”:让脚本在崩溃时给你留条活路
生产环境的脚本,必须有“容错”意识。不能因为一个文件损坏,就让整个周报生成失败。核心思想是: 用try-except包裹高风险操作,并提供有意义的错误日志 。
import logging
# 配置日志,错误信息写入文件
logging.basicConfig(
filename='automation.log',
level=logging.ERROR,
format='%(asctime)s - %(levelname)s - %(message)s'
)
def safe_process_file(file_path):
try:
df = pd.read_excel(file_path)
# 后续处理...
return df
except FileNotFoundError:
logging.error(f"文件未找到:{file_path}")
return None
except Exception as e:
logging.error(f"处理文件失败 {file_path}:{str(e)}")
return None
# 使用
for file in files:
df = safe_process_file(file)
if df is not None:
# 继续处理
pass
这个模式的意义在于:当某天市场部发来一个损坏的Excel,你的脚本不会中断,而是记录错误,继续处理其他99个正常文件。第二天你打开 automation.log ,看到一行 2024-05-15 08:02:11,234 - ERROR - 处理文件失败 D:\会议纪要\坏文件.xlsx:Excel file format not supported ,立刻知道问题在哪,而不至于在100个文件里大海捞针。
7. 学习路径与能力跃迁:从“能跑通”到“敢重构”的心法
7.1 三个月能力地图:每个阶段的目标与标志
basic python的学习,不是线性爬坡,而是螺旋上升。我为学员设计的三个月路径,每个阶段都有明确的“能力里程碑”和“自我检测信号”:
-
第1周:建立肌肉记忆
目标:能独立写出5行以内、解决单一问题的脚本(如“把文件夹里所有txt改成log”)。
标志:不再查for循环语法,能凭直觉写出for file in Path('.').glob('*.txt'):。
心法: 抄,但要抄出理解 。把示例代码改3个变量名、换2个文件路径,运行成功,就是进步。 -
第2个月:构建模块能力
目标:能组合多个知识点,完成中等复杂度任务(如“从10个Excel读数据,合并,按部门汇总,生成图表”)。
标志:开始主动使用函数封装重复逻辑(如def clean_sales_data(df):),而不是把所有代码堆在main里。
心法: 先搭骨架,再填血肉 。写代码前,先用中文写清步骤:“1.读取所有文件→2.合并→3.按部门分组→4.计算总和→5.画图”,再逐行翻译成Python。 -
第3个月:拥抱工程思维
目标:能设计可维护、可扩展的脚本(如加入日志、错误处理、配置文件、命令行参数)。
标志:开始思考“如果需求变了(比如新增一个部门),我改几处代码?”——答案最好是“只改配置文件”。
心法: 代码是写给人看的,顺便让机器执行 。变量名用sales_summary_df而非df1,函数名用generate_department_report()而非func1(),这些不是矫情,而是降低未来自己维护的成本。
7.2 从“能用”到“敢重构”:一个真实重构案例
我曾接手一个学员写的“日报生成脚本”,它能用,但有严重问题:所有逻辑挤在200行一个文件里,路径写死( C:\Users\Admin\Desktop\日报\ ),日期写死( 20240501 ),每次运行都要手动改。重构后,代码结构变成:
report_generator/
├── config.py # 配置:路径、日期格式、邮箱设置
├── data_loader.py # 专注读取数据
├── processor.py # 专注计算指标
├── reporter.py # 专注生成报告(图表+PDF)
└── main.py # 入口:加载配置→调用各模块→输出
重构的关键动作只有三步:
- 提取配置 :把所有硬编码的字符串、数字,移到
config.py,用import config调用。 - 分离关注点 :
data_loader.py只负责return pd.read_excel(config.SALES_FILE),绝不碰计算逻辑。 - 注入参数 :
main.py里,日期不再是'20240501',而是config.TODAY.strftime('%Y%m%d'),自动获取当天。
重构后,当公司要求“日报改为周报”,我只改了 config.py 里的两行: REPORT_PERIOD = 'weekly' 和`
更多推荐
所有评论(0)