
你是不是经常有这样的困扰?
今天分享的是Python自动化办公案例合集,每一个都是经过实战检验的“效率神器”,真正做到复制粘贴就能用!
场景:每月末需要合并12个部门的财务报表,手动复制粘贴需要半天时间,还容易出错。
解决方案:使用Python自动读取所有Excel文件,智能合并相同结构的数据。
代码示例:
import pandas as pd
import os
def merge_excel_files(folder_path, output_file):
"""
合并文件夹中的所有Excel文件
参数:
folder_path: Excel文件所在文件夹路径
output_file: 合并后的输出文件路径
"""
all_data = []
# 遍历文件夹中的所有Excel文件
for file in os.listdir(folder_path):
if file.endswith('.xlsx') or file.endswith('.xls'):
file_path = os.path.join(folder_path, file)
try:
# 读取Excel文件
df = pd.read_excel(file_path)
# 添加文件名作为来源标识
df['来源文件'] = file
all_data.append(df)
print(f"已读取: {file} - {len(df)} 行数据")
except Exception as e:
print(f"读取文件 {file} 时出错: {e}")
if all_data:
# 合并所有数据
merged_df = pd.concat(all_data, ignore_index=True)
# 保存到新文件
merged_df.to_excel(output_file, index=False)
print(f"\n合并完成!共 {len(merged_df)} 行数据")
print(f"保存到: {output_file}")
else:
print("没有找到可合并的Excel文件")
# 使用示例
if __name__ == "__main__":
# 设置你的文件夹路径和输出文件名
input_folder = "./各部门报表" # 修改为你的文件夹路径
output_file = "./合并报表_总表.xlsx"
merge_excel_files(input_folder, output_file)使用效果:
场景:新产品上市需要向5000个客户发送个性化推广邮件。
解决方案:根据客户信息和购买历史,自动生成个性化邮件内容并批量发送。
代码示例:
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import pandas as pd
import time
def send_personalized_emails(client_file, template_file, sender_email, sender_password):
"""
发送个性化营销邮件
参数:
client_file: 客户信息Excel文件
template_file: 邮件模板文件
sender_email: 发件人邮箱
sender_password: 发件人邮箱密码/授权码
"""
# 读取客户数据
clients_df = pd.read_excel(client_file)
# 读取邮件模板
with open(template_file, 'r', encoding='utf-8') as f:
template = f.read()
# 设置SMTP服务器(以QQ邮箱为例)
smtp_server = "smtp.qq.com"
smtp_port = 587
# 连接到邮件服务器
server = smtplib.SMTP(smtp_server, smtp_port)
server.starttls()
server.login(sender_email, sender_password)
success_count = 0
fail_count = 0
print("开始发送个性化邮件...")
for index, client in clients_df.iterrows():
try:
# 创建邮件对象
msg = MIMEMultipart()
msg['From'] = sender_email
msg['To'] = client['邮箱']
msg['Subject'] = f"{client['姓名']},我们有特别优惠给您!"
# 个性化邮件内容
personalized_content = template.format(
姓名=client['姓名'],
产品=client['上次购买产品'],
折扣="8.8折",
专属码=f"VIP{client['客户编号']}"
)
msg.attach(MIMEText(personalized_content, 'plain', 'utf-8'))
# 发送邮件
server.send_message(msg)
success_count += 1
print(f"已发送给: {client['姓名']} ({client['邮箱']})")
# 避免发送频率过高(每发送10封暂停1秒)
if success_count % 10 == 0:
time.sleep(1)
except Exception as e:
fail_count += 1
print(f"发送失败 {client['邮箱']}: {e}")
# 关闭连接
server.quit()
print(f"\n发送完成!")
print(f"成功: {success_count} 封")
print(f"失败: {fail_count} 封")
# 使用示例
if __name__ == "__main__":
# 配置你的信息
client_data = "客户列表.xlsx" # 包含姓名、邮箱、客户编号等
email_template = "邮件模板.txt" # 包含{姓名}、{产品}等占位符
my_email = "your_email@qq.com" # 你的邮箱
my_password = "your_auth_code" # 邮箱授权码(不是登录密码!)
send_personalized_emails(client_data, email_template, my_email, my_password)邮件模板示例(邮件模板.txt):
尊敬的{姓名}:
感谢您一直以来对我们产品的支持!
我们发现您最近购买了{产品},特意为您准备了专属优惠:
专属折扣:{折扣}
优惠码:{专属码}
有效期:30天
点击这里立即使用:https://example.com/vip
祝您购物愉快!
{公司名称} 客户关怀团队场景:下载文件夹混乱不堪,各种文件混杂在一起,找文件如同大海捞针。
解决方案:按文件类型、日期、项目等自动分类整理。
代码示例:
import os
import shutil
from datetime import datetime
def organize_files_by_type(download_folder):
"""
按文件类型自动整理文件夹
参数:
download_folder: 需要整理的文件夹路径
"""
# 定义文件类型分类
file_categories = {
'图片': ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.svg'],
'文档': ['.pdf', '.doc', '.docx', '.txt', '.xlsx', '.xls', '.ppt', '.pptx'],
'视频': ['.mp4', '.avi', '.mov', '.wmv', '.flv'],
'音频': ['.mp3', '.wav', '.aac', '.flac'],
'压缩包': ['.zip', '.rar', '.7z', '.tar', '.gz'],
'程序': ['.exe', '.msi', '.apk', '.dmg'],
'代码': ['.py', '.java', '.cpp', '.html', '.css', '.js']
}
# 创建分类文件夹
for category in file_categories.keys():
category_path = os.path.join(download_folder, category)
if not os.path.exists(category_path):
os.makedirs(category_path)
print(f"创建文件夹: {category}")
# 统计信息
moved_count = 0
unknown_count = 0
# 遍历所有文件
for filename in os.listdir(download_folder):
file_path = os.path.join(download_folder, filename)
# 跳过文件夹
if os.path.isdir(file_path):
continue
# 获取文件扩展名
_, extension = os.path.splitext(filename)
extension = extension.lower()
# 查找对应的分类
moved = False
for category, extensions in file_categories.items():
if extension in extensions:
dest_folder = os.path.join(download_folder, category)
shutil.move(file_path, os.path.join(dest_folder, filename))
moved_count += 1
moved = True
break
# 未分类的文件放到"其他"文件夹
if not moved:
other_folder = os.path.join(download_folder, "其他")
if not os.path.exists(other_folder):
os.makedirs(other_folder)
shutil.move(file_path, os.path.join(other_folder, filename))
unknown_count += 1
print(f"\n整理完成!")
print(f"已整理文件: {moved_count} 个")
print(f"未分类文件: {unknown_count} 个")
# 显示整理后的文件夹结构
print(f"\n整理后的结构:")
for item in os.listdir(download_folder):
if os.path.isdir(os.path.join(download_folder, item)):
file_count = len(os.listdir(os.path.join(download_folder, item)))
print(f" ├── {item}/ ({file_count}个文件)")
# 使用示例
if __name__ == "__main__":
# 设置你的下载文件夹路径
downloads_path = "C:/Users/你的用户名/Downloads" # Windows
# downloads_path = "/Users/你的用户名/Downloads" # Mac
organize_files_by_type(downloads_path)场景:销售数据每日更新,需要图表随之自动刷新。
核心思路:使用 matplotlib 结合 pandas,将数据读取和图表的生成封装为函数,每次运行即可生成最新图表。
importpandasaspd
importmatplotlib.pyplotasplt
defplot_sales_trend(data_path):
df = pd.read_excel(data_path)
plt.figure(figsize=(10, 6))
plt.plot(df['日期'], df['销售额'], marker='o', label='销售额')
plt.title('每日销售趋势图')
plt.xlabel('日期')
plt.ylabel('销售额')
plt.legend()
plt.grid(True)
plt.xticks(rotation=45)
plt.tight_layout()
# 自动保存,文件名可包含日期
plt.savefig(f'销售趋势_{pd.Timestamp.now().strftime("%Y%m%d")}.png')
plt.show()场景:快速从明细数据生成按“地区”和“产品”分类的销售额汇总表。
核心思路:利用 pandas 的 pivot_table 方法。
defcreate_pivot_table(data_path):
df = pd.read_excel(data_path)
pivot_df = pd.pivot_table(df,
values='销售额',
index='地区',
columns='产品',
aggfunc='sum',
fill_value=0,
margins=True) # margins 添加总计
pivot_df.to_excel('销售数据透视表.xlsx')
returnpivot_df场景:在Excel的“总价”列批量填入“单价*数量”的公式。
核心思路:使用 openpyxl 库,直接向单元格写入Excel公式字符串。
fromopenpyxlimportload_workbook
deffill_formulas(file_path):
wb = load_workbook(file_path)
ws = wb.active
forrowinrange(2, ws.max_row+1): # 假设第一行是标题
# 在C列填入公式 =A2*B2
formula_cell = f'C{row}'
ws[formula_cell] = f'=A{row}*B{row}'
wb.save('带公式的文件.xlsx')场景:将“订单表”中的“客户ID”关联到“客户表”中的“客户名称”。
核心思路:使用 pandas.merge 函数。
defmerge_tables(order_path, customer_path):
order_df = pd.read_excel(order_path)
customer_df = pd.read_excel(customer_path)
# 类似于Excel的VLOOKUP
merged_df = pd.merge(order_df,
customer_df[['客户ID', '客户名称']],
on='客户ID',
how='left')
merged_df.to_excel('合并后的订单表.xlsx', index=False)场景:批量设置多个Excel文件的字体、对齐方式和列宽。
核心思路:使用 openpyxl 的样式功能。
fromopenpyxl.stylesimportFont, Alignment, Border, Side
defformat_excel(file_path):
wb = load_workbook(file_path)
ws = wb.active
# 设置标题行样式
title_font = Font(bold=True, size=12, color='FFFFFF')
title_fill = PatternFill(start_color='366092', end_color='366092', fill_type='solid')
forcellinws[1]:
cell.font = title_font
cell.fill = title_fill
cell.alignment = Alignment(horizontal='center')
# 自动调整列宽
forcolumninws.columns:
max_length = 0
column_letter = column[0].column_letter
forcellincolumn:
try:
iflen(str(cell.value)) >max_length:
max_length = len(str(cell.value))
except:
pass
adjusted_width = (max_length+2)
ws.column_dimensions[column_letter].width = adjusted_width
wb.save('美化后.xlsx')场景:在“部门”列下拉菜单中限制只能输入“销售部”、“技术部”、“市场部”。
核心思路:使用 openpyxl 的 DataValidation 对象。
fromopenpyxl.worksheet.datavalidationimportDataValidation
defset_data_validation(file_path):
wb = load_workbook(file_path)
ws = wb.active
dv = DataValidation(type="list",
formula1='"销售部,技术部,市场部"',
allow_blank=True)
dv.add(f'B2:B{ws.max_row}') # 假设部门在B列
ws.add_data_validation(dv)
wb.save('带验证的文件.xlsx')场景:为财务报表设置打开密码,并保护工作表防止修改。
核心思路:使用 openpyxl 的保护功能和 msoffcrypto-tool 库进行加密(加密需特定库)。
# 设置工作表保护(禁止编辑)
wb = load_workbook('报表.xlsx')
ws = wb.active
ws.protection.sheet = True# 启用保护
ws.protection.password = 'your_password'# 设置密码(非必需,但可防止轻易取消保护)
wb.save('受保护的报表.xlsx')
# 注意:openpyxl本身不支持设置文件打开密码,需使用其他工具或系统命令。场景:自动设置打印区域、页眉页脚和横向打印。
核心思路:配置 openpyxl 工作表的打印相关属性。
defset_print_settings(file_path):
wb = load_workbook(file_path)
ws = wb.active
ws.print_area = 'A1:G50' # 设置打印区域
ws.page_setup.orientation = ws.ORIENTATION_LANDSCAPE # 横向
ws.page_setup.paperSize = ws.PAPERSIZE_A4
# 设置页眉页脚
ws.oddHeader.center.text = "&[File]"
ws.oddFooter.right.text = "第&P页/共&N页"
wb.save('打印优化.xlsx')场景:快速找出新旧两个版本客户名单的差异(新增、删除、修改)。
核心思路:使用 pandas 比对两个 DataFrame。
defcompare_excel_files(old_path, new_path, key_column='客户ID'):
old_df = pd.read_excel(old_path)
new_df = pd.read_excel(new_path)
# 找出新增的行(在新表但不在旧表)
added = new_df[~new_df[key_column].isin(old_df[key_column])]
# 找出删除的行(在旧表但不在新表)
deleted = old_df[~old_df[key_column].isin(new_df[key_column])]
# 找出可能修改的行(Key都存在,但其他列有变化)
merged = pd.merge(old_df, new_df, on=key_column, suffixes=('_old', '_new'))
# 假设比较‘客户名称’列
modified = merged[merged['客户名称_old'] != merged['客户名称_new']]
returnadded, deleted, modified场景:将下载文件夹中的文件按“年-月”自动归档。
核心思路:使用 os 和 shutil,结合文件的修改时间。
importos, shutil
fromdatetimeimportdatetime
deforganize_by_date(folder_path):
forfilenameinos.listdir(folder_path):
filepath = os.path.join(folder_path, filename)
ifos.path.isfile(filepath):
mod_time = os.path.getmtime(filepath)
date_folder = datetime.fromtimestamp(mod_time).strftime('%Y-%m')
target_dir = os.path.join(folder_path, date_folder)
os.makedirs(target_dir, exist_ok=True)
shutil.move(filepath, os.path.join(target_dir, filename))场景:将一批图片 IMG_001.jpg, IMG_002.jpg… 重命名为 产品图_001.jpg, 产品图_002.jpg…
核心思路:遍历文件,使用字符串格式化生成新文件名。
defbatch_rename(folder_path, prefix):
counter = 1
forfilenameinsorted(os.listdir(folder_path)):
iffilename.lower().endswith(('.jpg', '.png')):
old_path = os.path.join(folder_path, filename)
ext = os.path.splitext(filename)
new_name = f"{prefix}_{counter:03d}{ext}"
new_path = os.path.join(folder_path, new_name)
os.rename(old_path, new_path)
counter += 1场景:找出并删除文件夹内内容完全相同的重复文件。
核心思路:计算每个文件的MD5哈希值进行比较。
importhashlib
deffind_duplicates(folder_path):
hash_dict = {}
duplicates = []
forroot, dirs, filesinos.walk(folder_path):
forfilenameinfiles:
filepath = os.path.join(root, filename)
withopen(filepath, 'rb') asf:
file_hash = hashlib.md5(f.read()).hexdigest()
iffile_hashinhash_dict:
duplicates.append(filepath)
else:
hash_dict[file_hash] = filepath
returnduplicates
# 随后可以询问用户或自动删除 duplicates 列表中的文件场景:在多个 .txt 或 .log 文件中搜索包含“ERROR”关键字的行。
核心思路:逐行读取文件并进行匹配。
defsearch_in_files(folder_path, keyword):
results = {}
forroot, dirs, filesinos.walk(folder_path):
forfilenameinfiles:
iffilename.endswith('.txt'):
filepath = os.path.join(root, filename)
matches = []
withopen(filepath, 'r', encoding='utf-8') asf:
forline_num, lineinenumerate(f, 1):
ifkeywordinline:
matches.append((line_num, line.strip()))
ifmatches:
results[filepath] = matches
returnresults场景:批量提取多个PDF文件中的文本。
核心思路:使用 pdfplumber 或 PyPDF2 库。
importpdfplumber
defpdf_to_text(pdf_folder, output_folder):
os.makedirs(output_folder, exist_ok=True)
forpdf_fileinos.listdir(pdf_folder):
ifpdf_file.endswith('.pdf'):
pdf_path = os.path.join(pdf_folder, pdf_file)
text_filename = os.path.splitext(pdf_file)[0] +'.txt'
text_path = os.path.join(output_folder, text_filename)
withpdfplumber.open(pdf_path) aspdf, open(text_path, 'w', encoding='utf-8') asout_f:
forpageinpdf.pages:
text = page.extract_text()
iftext:
out_f.write(text+'\\n\\n')场景:分析某个项目文件夹下各子目录的大小。
核心思路:递归计算文件夹大小。
defget_folder_size(folder_path):
total_size = 0
fordirpath, dirnames, filenamesinos.walk(folder_path):
forfinfilenames:
fp = os.path.join(dirpath, f)
total_size += os.path.getsize(fp)
returntotal_size # 返回字节数
defanalyze_disk_usage(root_path):
usage = {}
foriteminos.listdir(root_path):
item_path = os.path.join(root_path, item)
ifos.path.isdir(item_path):
usage[item] = get_folder_size(item_path)
# 按大小排序并打印
forname, sizeinsorted(usage.items(), key=lambdax: x[1], reverse=True):
print(f"{name}: {size / (1024**3):.2f} GB")场景:每天凌晨1点自动将重要文件夹压缩备份到指定位置。
核心思路:使用 schedule 库定时执行,shutil.make_archive 进行压缩。
importschedule
importtime
importshutil
defbackup_job(source_dir, backup_dir):
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
backup_name = f'backup_{timestamp}'
shutil.make_archive(os.path.join(backup_dir, backup_name),
'zip',
source_dir)
print(f'备份完成: {backup_name}.zip')
# 设置定时任务(每天1点)
schedule.every().day.at("01:00").do(backup_job, '/重要数据', '/备份位置')
whileTrue:
schedule.run_pending()
time.sleep(60)场景:批量将某个目录下的所有 .sh 脚本文件设置为可执行。
核心思路:使用 os.chmod 修改文件权限。
defset_executable_permission(folder_path):
forroot, dirs, filesinos.walk(folder_path):
forfilenameinfiles:
iffilename.endswith('.sh'):
filepath = os.path.join(root, filename)
os.chmod(filepath, 0o755) # 设置rwxr-xr-x权限
print(f'Set executable: {filepath}')已在之前的案例2中详细展示,核心是 smtplib 和 email 库,附件使用 MIMEBase。
场景:写好邮件,设定在明天上午9点自动发送给客户。
核心思路:结合案例2的发送函数和案例19的 schedule 库。
schedule.every().day.at("09:00").do(send_personalized_emails, ...参数...)场景:将收件箱中来自“通知@公司.com”的邮件自动移动到“公司通知”文件夹。
核心思路:使用 imaplib 库连接邮件服务器进行操作。
importimaplib, email
deforganize_inbox(username, password, imap_server):
mail = imaplib.IMAP4_SSL(imap_server)
mail.login(username, password)
mail.select('inbox')
# 搜索所有邮件
status, messages = mail.search(None, 'ALL')
fornuminmessages[0].split():
status, data = mail.fetch(num, '(RFC822)')
msg = email.message_from_bytes(data[1](@ref)
from_addr = msg.get('From')
if'通知@公司.com'infrom_addr:
# 将邮件复制或移动到目标文件夹
mail.copy(num, '公司通知')
mail.store(num, '+FLAGS', '\\Deleted') # 在原邮箱标记删除
mail.expunge()
mail.close()
mail.logout()场景:从一堆报价邮件中提取“总金额”和“订单号”。
核心思路:解析邮件正文(可能是纯文本或HTML),使用正则表达式提取关键信息。
importre
defextract_order_info(msg):
body = ""
ifmsg.is_multipart():
forpartinmsg.walk():
ifpart.get_content_type() == "text/plain":
body = part.get_payload(decode=True).decode()
break
else:
body = msg.get_payload(decode=True).decode()
# 使用正则表达式查找
amount_pattern = r'总金额[::]\\s*(\\d+(?:\\.\\d+)?)'
order_pattern = r'订单号[::]\\s*(\\w+)'
amount = re.search(amount_pattern, body)
order_no = re.search(order_pattern, body)
return (order_no.group(1) iforder_noelseNone,
amount.group(1) ifamountelseNone)场景:假期自动回复“您好,我将于X月X日返岗…”。
核心思路:同样使用 imaplib 监控收件箱,对符合条件的来信自动发送回复。
# 1. 使用imapllib IDLE命令监听新邮件
# 2. 当新邮件到达且发件人不在通讯录时,触发回复
# 3. 调用案例2的发送函数,发送固定内容的回复邮件
# 注意:实现较为复杂,需处理并发和规则引擎。场景:定时抓取某新闻网站的头条标题和链接。
核心思路:使用 requests 获取网页,BeautifulSoup 解析HTML。
importrequests
frombs4importBeautifulSoup
defscrape_news(url):
headers = {'User-Agent': 'Mozilla/5.0'}
resp = requests.get(url, headers=headers)
soup = BeautifulSoup(resp.content, 'html.parser')
news_list = []
foriteminsoup.select('.news-title a'): # 根据实际网站CSS选择器修改
title = item.text.strip()
link = item['href']
news_list.append({'title': title, 'link': link})
returnnews_list场景:调用公司CRM系统的API,获取当日新增客户列表。
核心思路:使用 requests 库发送GET/POST请求,处理JSON响应。
importrequests
deffetch_crm_data(api_url, api_token):
headers = {'Authorization': f'Bearer {api_token}'}
params = {'date': '2025-04-28'} # 假设参数
response = requests.get(api_url, headers=headers, params=params)
ifresponse.status_code == 200:
data = response.json()
returnpd.DataFrame(data['clients']) # 转为DataFrame方便处理
else:
print(f'API请求失败: {response.status_code}')
returnNone场景:每天将Excel中的销售数据增量同步到MySQL数据库。
核心思路:使用 pandas 读取Excel,sqlalchemy 建立数据库连接并写入。
importsqlalchemy
defsync_to_mysql(excel_path, table_name):
df = pd.read_excel(excel_path)
# 创建数据库连接引擎
engine = sqlalchemy.create_engine('mysql+pymysql://user:pass@localhost/db_name')
# 将DataFrame写入数据库表,'append'模式表示增量添加
df.to_sql(table_name, con=engine, if_exists='append', index=False)场景:自动生成销售数据的柱状图、折线图和散点图。
核心思路:matplotlib 和 seaborn 是核心库。案例4已展示折线图,以下是多子图示例。
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
# 子图1:柱状图
axes[0, 0].bar(df['产品'], df['销量'])
axes[0, 0].set_title('产品销量柱状图')
# 子图2:折线图
axes[0, 1].plot(df['日期'], df['销售额'], marker='o')
axes[0, 1].set_title('销售额趋势')
# 子图3:散点图
axes[1, 0].scatter(df['广告投入'], df['销售额'])
axes[1, 0].set_title('广告投入与销售额关系')
# 子图4:箱线图
axes[1, 1].boxplot([df[df['地区']==r]['销售额'] forrindf['地区'].unique()])
axes[1, 1].set_xticklabels(df['地区'].unique())
axes[1, 1].set_title('各地区销售额分布')
plt.tight_layout()
plt.savefig('综合销售分析.png')场景:结合数据查询、计算和图表,生成一份包含摘要、表格和图片的Word周报。
核心思路:使用 python-docx 库操作Word文档。
fromdocximportDocument
fromdocx.sharedimportInches
defgenerate_word_report(summary_text, dataframe, chart_image_path):
doc = Document()
doc.add_heading('每周销售报告', 0)
# 添加摘要
doc.add_paragraph(summary_text)
# 添加表格
table = doc.add_table(dataframe.shape[0]+1, dataframe.shape[1](@ref)
forj, col_nameinenumerate(dataframe.columns):
table.cell(0, j).text = col_name
fori, rowindataframe.iterrows():
forj, valueinenumerate(row):
table.cell(i+1, j).text = str(value)
# 添加图表图片
doc.add_picture(chart_image_path, width=Inches(6.0))
doc.save('销售周报.docx')场景:在销售数据中自动识别销量为负数或异常高的离群值。
核心思路:使用统计学方法(如Z-score或IQR)或简单规则。
defdetect_anomalies(df, column):
Q1 = df[column].quantile(0.25)
Q3 = df[column].quantile(0.75)
IQR = Q3-Q1
lower_bound = Q1-1.5*IQR
upper_bound = Q3+1.5*IQR
anomalies = df[(df[column] <lower_bound) | (df[column] >upper_bound)]
returnanomalies场景:对包含敏感信息的CSV文件进行加密存储。
核心思路:使用 cryptography 库。
fromcryptography.fernetimportFernet
defencrypt_file(input_path, output_path, key):
cipher = Fernet(key)
withopen(input_path, 'rb') asf:
data = f.read()
encrypted_data = cipher.encrypt(data)
withopen(output_path, 'wb') asf:
f.write(encrypted_data)
# 生成密钥: key = Fernet.generate_key(),并妥善保存场景:分析应用日志,统计ERROR出现的频率和上下文。
核心思路:读取日志文件,使用正则或字符串匹配进行分析。
defanalyze_log(log_path):
error_count = 0
ip_pattern = r'\\d+\\.\\d+\\.\\d+\\.\\d+'
ip_errors = {}
withopen(log_path, 'r') asf:
forlineinf:
if'ERROR'inline:
error_count += 1
ip_match = re.search(ip_pattern, line)
ifip_match:
ip = ip_match.group()
ip_errors[ip] = ip_errors.get(ip, 0) +1
print(f'总ERROR数: {error_count}')
print('IP错误排行:', sorted(ip_errors.items(), key=lambdax:x[1], reverse=True)[:5])场景:将会议录音文件转为文字稿。
核心思路:调用语音识别API(如科大讯飞、百度AI开放平台)或使用离线库 speech_recognition。
importspeech_recognitionassr
defaudio_to_text(audio_path):
r = sr.Recognizer()
withsr.AudioFile(audio_path) assource:
audio = r.record(source)
try:
text = r.recognize_google(audio, language='zh-CN')
returntext
exceptsr.UnknownValueError:
return"无法识别音频"
exceptsr.RequestError:
return"服务请求出错"场景:根据任务列表和优先级,自动规划一周的工作日历。
核心思路:使用算法(如贪心算法)进行简单排程,并用 icalendar 库生成 .ics 日历文件。
fromicalendarimportCalendar, Event
fromdatetimeimportdatetime, timedelta
defcreate_schedule(tasks, start_date):
cal = Calendar()
current_time = datetime.combine(start_date, datetime.min.time())
fortaskintasks:
event = Event()
event.add('summary', task['name'])
event.add('dtstart', current_time)
event.add('dtend', current_time+timedelta(hours=task['duration']))
cal.add_component(event)
current_time += timedelta(hours=task['duration'] +1) # 假设间隔1小时
withopen('my_schedule.ics', 'wb') asf:
f.write(cal.to_ical())场景:命令行或简单GUI的待办清单,支持增删改查和到期提醒。
核心思路:使用 json 或 sqlite3 存储数据,schedule 库检查提醒。
importjson, schedule
classTodoList:
def__init__(self, file_path='todo.json'):
self.file_path = file_path
self.load()
defadd(self, task, due_date):
self.tasks.append({'task': task, 'due': due_date, 'done': False})
self.save()
defcheck_reminder(self):
today = datetime.now().date()
fortinself.tasks:
ifnott['done'] anddatetime.strptime(t['due'], '%Y-%m-%d').date() == today:
print(f'提醒: 今天需要完成 - {t["task"]}')
# 定时检查
schedule.every().day.at("09:00").do(TodoList().check_reminder)场景:从打卡机导出的原始记录中,计算每人每天的上班时长和迟到次数。
核心思路:pandas 处理时间序列数据,进行分组和重采样计算。
defcalculate_attendance(record_path):
df = pd.read_csv(record_path, parse_dates=['打卡时间'])
df['日期'] = df['打卡时间'].dt.date
# 假设每人每天两条记录:上班和下班
pivot = df.pivot_table(index=['姓名','日期'],
columns=df.groupby(['姓名','日期']).cumcount(),
values='打卡时间',
aggfunc='first')
pivot.columns = ['上班时间', '下班时间']
pivot['工作时长'] = (pivot['下班时间'] -pivot['上班时间']).dt.total_seconds() /3600
pivot['是否迟到'] = pivot['上班时间'].dt.hour>9 # 假设9点后算迟到
returnpivot场景:批量扫描发票图片,识别其中的金额、税号、日期等信息。
核心思路:使用OCR库(如 pytesseract 或 paddleocr)识别图片文字,再用正则提取关键字段。
importpytesseract
fromPILimportImage
defextract_invoice_info(image_path):
img = Image.open(image_path)
text = pytesseract.image_to_string(img, lang='chi_sim+eng')
# 使用正则表达式匹配金额、税号等模式
amount_pattern = r'(?:¥|¥|人民币)\\s*(\\d+(?:\\.\\d+)?)'
tax_id_pattern = r'纳税人识别号[::]\\s*([0-9A-Z]{15,20})'
# ... 提取逻辑
return {'raw_text': text, 'amount': ..., 'tax_id': ...}场景:批量从合同PDF中提取甲方、乙方、签约日期和金额,存入数据库。
核心思路:结合案例17的PDF文本提取和案例39的信息提取技术。
defprocess_contracts(pdf_folder):
all_contracts = []
forpdf_fileinos.listdir(pdf_folder):
text = pdf_to_text_single(pdf_file) # 调用提取文本的函数
info = extract_contract_fields(text) # 调用自定义的信息提取函数
info['文件名'] = pdf_file
all_contracts.append(info)
contracts_df = pd.DataFrame(all_contracts)
contracts_df.to_sql('contracts', con=engine, if_exists='append', index=False) # 存入数据库场景:自动从简历文件(PDF/Word)中提取姓名、电话、邮箱和工作经验。
核心思路:与合同管理类似,是OCR/NLP信息提取的应用。
# 核心流程与案例40高度相似:
# 1. 读取文件 -> 2. 提取文本 -> 3. 使用规则或NLP模型(如ner)提取实体 -> 4. 结构化存储场景:根据销售数据、考勤数据、项目完成度等多个来源的数据,按公式计算员工月度绩效分数。
核心思路:使用 pandas 作为数据整合和计算的核心引擎。
defcalculate_performance(sales_df, attendance_df, project_df):
# 1. 数据合并与清洗
merged_df = pd.merge(sales_df, attendance_df, on=['员工ID','月份'], how='outer')
merged_df = pd.merge(merged_df, project_df, on=['员工ID','月份'], how='outer')
# 2. 定义计算规则
merged_df['绩效分数'] = (
merged_df['销售额'] *0.5+
merged_df['出勤率'] *100*0.2+
merged_df['项目完成度'] *100*0.3
)
# 3. 排序和输出
result = merged_df[['员工ID','姓名','月份','绩效分数']].sort_values('绩效分数', ascending=False)
result.to_excel('月度绩效表.xlsx', index=False)
returnresult总结:以上是从案例4到案例42的核心代码思路和片段。每个案例都可以根据您的具体需求(如文件路径、数据结构、业务规则)进行修改和扩展,组合使用这些案例可以构建出强大的个性化办公自动化系统。
# 安装必要的Python库
pip install pandas openpyxl numpy matplotlib
pip install requests beautifulsoup4
pip install schedule python-docx pdfkit“无他,惟手熟尔”!有需要的用起来!
如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!
本文分享自 Nicholas与Pypi 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!