
每周三下午,我都会被同一个“仪式”困住半小时。
不是开会,而是机械地打开邮箱,从几十封邮件里,一封封找出“财务报销审批通过”的邮件,下载附件,重命名为“报销单张三20260508.pdf”,然后拖进一个叫“本周已处理”的文件夹。
每周五早上,我还要花一小时,手动把销售同事发来的5个Excel表格,合并成一个,再生成几张柱状图,贴进周报PPT里。
这些事,琐碎、重复、毫无创造性,却雷打不动地占用着我每周近3个小时。直到上个月,我实在忍无可忍,决定让电脑自己干。
简单来说就是:
与其抱怨时间不够用,不如写几行代码,把时间偷回来。
往期阅读>>>
Python 自动化管理Jenkins的15个实用脚本,提升效率
App2Docker:如何无需编写Dockerfile也可以创建容器镜像
Python 自动化识别Nginx配置并导出为excel文件,提升Nginx管理效率
痛点: 手动筛选、下载、重命名邮件附件,耗时费力还容易漏。每周都要花近半小时在这件小事上。
我用Python的 imaplib 和 email 库,写了一个不到50行的脚本,让它每天下午4点自动运行。
importimaplibimportemailimportosfromdatetimeimportdatetimedefauto_fetch_invoice_attachments():# 连接到邮箱(这里以QQ邮箱为例)mail = imaplib.IMAP4_SSL('imap.qq.com')mail.login('你的邮箱@qq.com', '你的授权码') # 注意:用授权码,不是密码!mail.select('inbox')# 搜索主题包含“报销审批通过”的未读邮件_, message_nums = mail.search(None, '(UNSEEN SUBJECT "报销审批通过")')fornuminmessage_nums[0].split():_, msg_data = mail.fetch(num, '(RFC822)')email_msg = email.message_from_bytes(msg_data[0][1])# 从发件人提取姓名(假设发件人格式是“张三 <zhangsan@company.com>”)sender = email_msg['From']name = sender.split('<')[0].strip() if'<'insenderelse'未知'forpartinemail_msg.walk():ifpart.get_content_disposition() == 'attachment':filename = part.get_filename()iffilenameandfilename.lower().endswith('.pdf'):# 生成新文件名:报销单_姓名_年月日.pdftoday = datetime.now().strftime('%Y%m%d')new_filename = f'报销单_{name}_{today}.pdf'# 保存到指定文件夹save_path = os.path.join('/Users/你/Desktop/本周已处理', new_filename)withopen(save_path, 'wb') asf:f.write(part.get_payload(decode=True))print(f'已保存: {new_filename}')mail.close()mail.logout()# 可以配合系统定时任务(如crontab或Windows任务计划程序)每天自动执行
效果: 现在,每天下午4点05分,我的“本周已处理”文件夹里就会自动出现整理好的报销单。我只需要每周五下班前花2分钟检查一下。每周省时:约0.5小时。
痛点: 手动合并多个Excel,复制粘贴做图表,枯燥易错。每周五上午雷打不动的一小时“数据搬运工”。
我用 pandas 和 matplotlib,写了一个更强大的脚本。
importpandasaspdimportmatplotlib.pyplotaspltimportosfromdatetimeimportdatetimedefauto_generate_weekly_report():report_date = datetime.now().strftime('%Y%m%d')input_folder = '/Users/你/Desktop/销售数据'output_file = f'/Users/你/Desktop/周报/销售汇总_{report_date}.xlsx'chart_folder = f'/Users/你/Desktop/周报/图表_{report_date}'# 1. 自动合并所有Excelall_data = []forfileinos.listdir(input_folder):iffile.endswith('.xlsx'):df = pd.read_excel(os.path.join(input_folder, file))df['数据来源'] = file.replace('.xlsx', '') # 标记来源all_data.append(df)ifnotall_data:print("没有找到Excel文件")returnmerged_df = pd.concat(all_data, ignore_index=True)# 2. 保存合并后的总表merged_df.to_excel(output_file, index=False)print(f'数据已合并保存至: {output_file}')# 3. 自动生成图表os.makedirs(chart_folder, exist_ok=True)# 示例:按“数据来源”汇总销售额if'销售额'inmerged_df.columnsand'数据来源'inmerged_df.columns:summary = merged_df.groupby('数据来源')['销售额'].sum().sort_values(ascending=False)# 生成柱状图plt.figure(figsize=(10, 6))summary.plot(kind='bar', color='skyblue')plt.title('各渠道本周销售额汇总', fontsize=14)plt.xlabel('渠道')plt.ylabel('销售额(元)')plt.xticks(rotation=45)plt.tight_layout()plt.savefig(os.path.join(chart_folder, '销售额柱状图.png'), dpi=300)plt.close()# 生成饼图plt.figure(figsize=(8, 8))plt.pie(summary.values, labels=summary.index, autopct='%1.1f%%', startangle=90)plt.title('销售额渠道占比', fontsize=14)plt.savefig(os.path.join(chart_folder, '销售额占比饼图.png'), dpi=300)plt.close()print(f'图表已生成至文件夹: {chart_folder}')print("周报数据准备完毕!")# 可以设定每周五上午10点自动运行
效果: 现在,我每周五早上到公司,喝杯咖啡的功夫,脚本已经帮我把5个表格合并好,生成了漂亮的柱状图和饼图,静静躺在文件夹里。我只需要把图片拖进PPT。每周省时:约2小时。
痛点: 下载文件夹是重灾区,图片、文档、压缩包全混在一起,找文件如同大海捞针。每天浪费的碎片时间累积起来很可观。
我用 shutil 库写了个“桌面清洁工”,设定每次开机后运行一次。
importosimportshutildefauto_organize_downloads():downloads_path = '/Users/你/Downloads'# 定义分类规则categories = {'图片': ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.svg'],'文档': ['.pdf', '.docx', '.doc', '.xlsx', '.xls', '.pptx', '.txt'],'压缩包': ['.zip', '.rar', '.7z', '.tar.gz'],'安装包': ['.dmg', '.pkg', '.exe', '.msi'],'音频视频': ['.mp3', '.mp4', '.avi', '.mov', '.wav'] }forfilenameinos.listdir(downloads_path):file_path = os.path.join(downloads_path, filename)# 跳过文件夹和隐藏文件ifos.path.isdir(file_path) orfilename.startswith('.'):continue# 按后缀分类moved = Falseforfolder, extensionsincategories.items():ifany(filename.lower().endswith(ext) forextinextensions):dest_folder = os.path.join(downloads_path, folder)os.makedirs(dest_folder, exist_ok=True)shutil.move(file_path, os.path.join(dest_folder, filename))moved = Truebreak# 未分类的放入“其他”ifnotmoved:other_folder = os.path.join(downloads_path, '其他')os.makedirs(other_folder, exist_ok=True)shutil.move(file_path, os.path.join(other_folder, filename))print("下载文件夹整理完毕!")# 可以添加到开机启动项或每天第一次启动浏览器时运行
效果: 从此,我的下载文件夹再也没有乱过。找文件从“大海捞针”变成了“开柜即取”。每周省时:约0.5小时(积少成多)。
痛点: 需要每天手动打开几个竞品网站或数据看板,查看关键指标(如价格、库存、排名),一旦有变动需要立即记录。这个过程既枯燥又容易错过重要变化。
我用 requests 和 BeautifulSoup 写了个爬虫监控脚本,搭配企业微信机器人推送告警。
importrequestsfrombs4importBeautifulSoupimporttimeimporthashlibdefmonitor_website_price(url, selector, webhook_url):"""监控特定网页上某个元素的价格变化"""try:headers = {'User-Agent': 'Mozilla/5.0'}resp = requests.get(url, headers=headers, timeout=10)soup = BeautifulSoup(resp.text, 'html.parser')target_element = soup.select_one(selector)ifnottarget_element:return"未找到目标元素"current_price = target_element.text.strip()# 生成当前内容的哈希值,用于判断是否变化current_hash = hashlib.md5(current_price.encode()).hexdigest()# 这里应该从文件或数据库读取上一次的哈希值进行对比# 假设我们有一个简单的文件来存储上次的状态record_file = 'last_state.txt'try:withopen(record_file, 'r') asf:last_hash = f.read().strip()exceptFileNotFoundError:last_hash = ''ifcurrent_hash!= last_hash:# 价格发生变化,发送企业微信通知message = f"🔔 监控告警!\n页面: {url}\n目标元素内容已更新:\n{current_price}"send_wechat_notification(webhook_url, message)# 更新记录withopen(record_file, 'w') asf:f.write(current_hash)return"检测到变化,已通知"else:return"无变化"exceptExceptionase:returnf"监控出错: {e}"defsend_wechat_notification(webhook_url, content):"""通过企业微信机器人发送通知"""data = {"msgtype": "text","text": {"content": content } }requests.post(webhook_url, json=data)# 示例:监控某商品价格,每2小时检查一次# while True:# result = monitor_website_price(# 'https://example.com/product/123',# '.price-selector',# 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY'# )# print(f"{time.ctime()}: {result}")# time.sleep(2 * 60 * 60) # 2小时
效果: 现在,我不再需要每天手动检查。一旦监控的目标价格或库存发生变化,企业微信会立即给我推送消息。每周省时:约1小时(从每天多次检查变为被动接收告警)。
痛点: 作为运营,需要将同一篇内容(如活动通知)手动发布到微信公众号、知乎、小红书等多个平台,格式调整、图片上传非常繁琐。每周都要花数小时做这种“复制粘贴”工作。
我用 selenium 自动化浏览器操作,虽然代码稍复杂,但一劳永逸。
fromseleniumimportwebdriverfromselenium.webdriver.common.byimportByfromselenium.webdriver.common.keysimportKeysimporttimedefauto_post_to_zhihu(title, content, image_paths=None):"""自动发布内容到知乎(简化示例,实际需要处理登录、验证码等)"""driver = webdriver.Chrome() # 需要安装ChromeDrivertry:# 1. 登录(这里省略具体登录逻辑,实际可能需要处理验证码)driver.get('https://www.zhihu.com/signin')time.sleep(3)# ... 填写用户名密码登录# 2. 进入发布页面driver.get('https://zhuanlan.zhihu.com/write')time.sleep(2)# 3. 填写标题title_input = driver.find_element(By.CSS_SELECTOR, '.WriteIndex-titleInput')title_input.clear()title_input.send_keys(title)# 4. 填写内容content_area = driver.find_element(By.CSS_SELECTOR, '.DraftEditor-editorContainer')content_area.click()# 通过JavaScript直接设置内容(更稳定)driver.execute_script(f""" document.querySelector('.DraftEditor-editorContainer [contenteditable="true"]').innerHTML = '{content}'; """)# 5. 上传图片(如果有)ifimage_paths:upload_btn = driver.find_element(By.CSS_SELECTOR, '.WriteIndex-uploadButton')forimg_pathinimage_paths:upload_btn.send_keys(img_path)time.sleep(1) # 等待上传完成# 6. 选择话题、设置权限等(根据实际需要添加)# 7. 发布(这里注释掉,避免误操作)# publish_btn = driver.find_element(By.CSS_SELECTOR, '.WriteIndex-publishButton')# publish_btn.click()print("知乎内容已填写完成,请手动检查后发布")time.sleep(5)finally:driver.quit()# 类似地,可以编写发布到其他平台的函数# 然后创建一个主函数,依次调用各个平台的发布函数
效果: 虽然首次设置需要一些时间,但之后每次发布,我只需要运行一次脚本,它就会自动帮我填写好所有平台的内容,我只需要做最后的检查确认。每周省时:约2小时(多平台发布)。
如果你也心动了,但觉得“写代码太难”,听听我的路径:
从最痛的那个点开始: 别想着一口吃成胖子。先选一个你最厌烦、最重复的任务动手。哪怕一开始代码写得丑、效率低,只要能跑起来,就是胜利。
善用搜索和“借鉴”: 我80%的代码都是从搜索引擎(如“Python 如何读取邮件附件”)和类似 @20个Python实用脚本 这样的文章里学来、改来的。编程很多时候是“组装”的艺术。
让工具自己运行: 写好脚本不是终点。学会使用系统的定时任务(Mac/Linux的 crontab,Windows的“任务计划程序”),或者用 schedule 库让Python脚本自己定时循环,才能真正解放你。
安全第一:像邮箱密码、API密钥这些敏感信息,千万不要直接写在代码里!学会使用环境变量(比如在.env文件里写 EMAIL_PASSWORD=xxx,在代码里用 os.getenv('EMAIL_PASSWORD') 读取)。
从简单到复杂: 先搞定文件操作(案例一、二、三),再尝试网络请求(案例四),最后挑战浏览器自动化(案例五)。每一步的成功都会给你继续下去的信心。
这每周省下的3小时,不是从工作中“挤”出来的,而是从重复劳动中“偷”回来的。
https://ima.qq.com/wiki/?shareId=f2628818f0874da17b71ffa0e5e8408114e7dbad46f1745bbd1cc1365277631c
