在日常工作中,重复性的任务不仅耗时,还容易出错。Python凭借其简洁易学的语法,成为许多办公室自动化任务的首选工具。今天,我们就一起来看看如何用Python编写一些实用的小脚本,提高工作效率。
1. 文本文件批量重命名
在整理文档时,经常需要对大量文件进行重命名。下面是一个简单的脚本,帮助你批量处理这些任务。
1 import os<br><br>def rename_files(directory, prefix=""):<br> """<br> 批量重命名指定目录下的所有文件。<br> <br> :param directory: 要处理的文件夹路径<br> :param prefix: 文件的新前缀,默认为空字符串<br> """<br> <em># 遍历指定目录下的所有文件</em><br> for filename in os.listdir(directory):<br> <em># 获取文件名和扩展名</em><br> file_base, file_ext = os.path.splitext(filename)<br> <br> <em># 生成新文件名</em><br> new_filename = f"{prefix}{file_base}{file_ext}"<br> <br> <em># 拼接完整路径</em><br> old_path = os.path.join(directory, filename)<br> new_path = os.path.join(directory, new_filename)<br> <br> <em># 重命名文件</em><br> os.rename(old_path, new_path)<br> print(f"Renamed '{filename}' to '{new_filename}'")<br><br><em># 使用示例</em><br>rename_files("path/to/your/directory", "New_")
输出示例:
1 Renamed 'old_file.txt' to 'New_old_file.txt'<br>Renamed 'another_file.docx' to 'New_another_file.docx'
2. Excel数据清洗
Excel表中的数据经常需要清理才能进一步分析。这个脚本可以帮助你删除空行、格式化日期等。
1 import pandas as pd<br><br>def clean_excel(file_path):<br> """<br> 清洗Excel表格中的数据。<br> <br> :param file_path: Excel文件的路径<br> """<br> <em># 读取Excel文件</em><br> df = pd.read_excel(file_path)<br> <br> <em># 删除空行</em><br> df.dropna(inplace=True)<br> <br> <em># 格式化日期列(假设日期列名为'Date')</em><br> if 'Date' in df.columns:<br> df['Date'] = pd.to_datetime(df['Date'], format='%Y-%m-%d')<br> <br> <em># 保存修改后的数据</em><br> df.to_excel(file_path, index=False)<br> print(f"Data cleaned and saved to {file_path}")<br><br><em># 使用示例</em><br>clean_excel("path/to/your/excel/file.xlsx")
3. PDF合并器
工作中经常需要将多个PDF文件合并成一个。下面这个脚本可以轻松实现这一点。
1 from PyPDF2 import PdfMerger<br><br>def merge_pdfs(output_path, *input_paths):<br> """<br> 合并多个PDF文件为一个。<br> <br> :param output_path: 输出文件的路径<br> :param input_paths: 一个或多个输入文件的路径<br> """<br> merger = PdfMerger()<br> <br> <em># 循环添加每个PDF文件</em><br> for path in input_paths:<br> merger.append(path)<br> <br> <em># 写入输出文件</em><br> merger.write(output_path)<br> merger.close()<br> print(f"Merged files into {output_path}")<br><br><em># 使用示例</em><br>merge_pdfs("path/to/output.pdf", "path/to/file1.pdf", "path/to/file2.pdf")
输出示例:
1 Merged files into path/to/output.pdf
4. 图片压缩工具
发送邮件或者上传图片时,常常需要先压缩图片以减少文件大小。这个脚本利用Pillow库来完成这一任务。
1 from PIL import Image<br><br>def compress_image(file_path, output_path=None, quality=75):<br> """<br> 压缩图片文件。<br> <br> :param file_path: 输入图片的路径<br> :param output_path: 输出图片的路径,默认为原文件覆盖<br> :param quality: 压缩质量,范围0-100<br> """<br> img = Image.open(file_path)<br> <br> if not output_path:<br> output_path = file_path<br> <br> img.save(output_path, optimize=True, quality=quality)<br> print(f"Image compressed and saved to {output_path}")<br><br><em># 使用示例</em><br>compress_image("path/to/image.jpg")
输出示例:
1 Image compressed and saved to path/to/image.jpg
5. 文本内容替换
编辑文档时,可能需要批量替换某些文本内容。这个脚本可以帮你快速实现。
1 def replace_text_in_files(directory, old_text, new_text):<br> """<br> 在指定目录下所有文本文件中替换指定文本。<br> <br> :param directory: 文件所在的目录<br> :param old_text: 要被替换的文本<br> :param new_text: 新文本<br> """<br> for filename in os.listdir(directory):<br> if filename.endswith(".txt"): <em># 只处理.txt文件</em><br> file_path = os.path.join(directory, filename)<br> <br> with open(file_path, 'r', encoding='utf-8') as file:<br> file_data = file.read()<br> <br> <em># 替换文本</em><br> file_data = file_data.replace(old_text, new_text)<br> <br> <em># 写回文件</em><br> with open(file_path, 'w', encoding='utf-8') as file:<br> file.write(file_data)<br> <br> print(f"Replaced text in {filename}")<br><br><em># 使用示例</em><br>replace_text_in_files("path/to/text/files", "old_text", "new_text")
输出示例:
1 Replaced text in file1.txt<br>Replaced text in file2.txt
6. 数据抓取与解析
在进行市场调研或数据分析时,从网页上抓取数据是一项常见的任务。下面是一个使用
1 | requests |
和
1 | BeautifulSoup |
库来抓取和解析网页数据的例子。
1 import requests<br>from bs4 import BeautifulSoup<br><br>def scrape_webpage(url):<br> """<br> 抓取并解析网页上的数据。<br> <br> :param url: 目标网页的URL<br> """<br> <em># 发送请求获取网页内容</em><br> response = requests.get(url)<br> <br> <em># 解析HTML内容</em><br> soup = BeautifulSoup(response.text, 'html.parser')<br> <br> <em># 提取特定信息(例如标题)</em><br> titles = soup.find_all('h1')<br> <br> <em># 打印提取的信息</em><br> for title in titles:<br> print(title.text.strip())<br><br><em># 使用示例</em><br>scrape_webpage("https://example.com")
输出示例:
1 Example Domain<br>This domain is for use in illustrative examples in documents.<br>You may use this domain in literature without prior coordination or asking for permission.
7. 数据导出到CSV
抓取的数据通常需要导出到CSV文件以便进一步分析。以下脚本展示了如何将数据导出到CSV文件。
1 import csv<br><br>def export_to_csv(data, file_path):<br> """<br> 将数据导出到CSV文件。<br> <br> :param data: 要导出的数据列表,每个元素是一个字典<br> :param file_path: CSV文件的路径<br> """<br> <em># 确定CSV文件的字段</em><br> fieldnames = data[0].keys()<br> <br> <em># 打开CSV文件并写入数据</em><br> with open(file_path, 'w', newline='', encoding='utf-8') as csvfile:<br> writer = csv.DictWriter(csvfile, fieldnames=fieldnames)<br> <br> <em># 写入表头</em><br> writer.writeheader()<br> <br> <em># 写入每一行数据</em><br> for row in data:<br> writer.writerow(row)<br> <br> print(f"Data exported to {file_path}")<br><br><em># 示例数据</em><br>data = [<br> {'Name': 'Alice', 'Age': 25, 'City': 'New York'},<br> {'Name': 'Bob', 'Age': 30, 'City': 'San Francisco'}<br>]<br><br><em># 使用示例</em><br>export_to_csv(data, "path/to/output.csv")
输出示例:
1 Data exported to path/to/output.csv
8. 邮件自动发送
工作中经常需要发送大量的电子邮件。下面是一个使用
1 | smtplib |
库自动发送邮件的例子。
1 import smtplib<br>from email.mime.text import MIMEText<br>from email.mime.multipart import MIMEMultipart<br><br>def send_email(subject, body, recipient, sender="your_email@example.com"):<br> """<br> 发送电子邮件。<br> <br> :param subject: 邮件主题<br> :param body: 邮件正文<br> :param recipient: 收件人邮箱地址<br> :param sender: 发件人邮箱地址,默认为"your_email@example.com"<br> """<br> <em># 创建邮件对象</em><br> message = MIMEMultipart()<br> message['From'] = sender<br> message['To'] = recipient<br> message['Subject'] = subject<br> <br> <em># 添加邮件正文</em><br> message.attach(MIMEText(body, 'plain'))<br> <br> <em># 发送邮件</em><br> with smtplib.SMTP('smtp.example.com', 587) as server:<br> server.starttls()<br> server.login(sender, 'your_password')<br> server.sendmail(sender, recipient, message.as_string())<br> <br> print(f"Email sent to {recipient}")<br><br><em># 使用示例</em><br>send_email("Meeting Reminder", "Don't forget the meeting at 2 PM.", "recipient@example.com")
输出示例:
1 Email sent to recipient@example.com
9. 文件夹监控与同步
有时需要实时监控文件夹的变化,并将更改同步到另一个位置。以下脚本展示了如何使用
1 | watchdog |
库实现这一功能。
1 from watchdog.observers import Observer<br>from watchdog.events import FileSystemEventHandler<br><br>class FolderSyncHandler(FileSystemEventHandler):<br> def __init__(self, source_folder, target_folder):<br> self.source_folder = source_folder<br> self.target_folder = target_folder<br><br> def on_modified(self, event):<br> """<br> 当文件夹中的文件被修改时触发。<br> """<br> if event.is_directory:<br> return<br> <br> source_path = event.src_path<br> target_path = source_path.replace(self.source_folder, self.target_folder)<br> <br> <em># 复制文件</em><br> with open(source_path, 'rb') as src_file:<br> with open(target_path, 'wb') as target_file:<br> target_file.write(src_file.read())<br> <br> print(f"File synced from {source_path} to {target_path}")<br><br>def sync_folders(source_folder, target_folder):<br> """<br> 监控源文件夹并将更改同步到目标文件夹。<br> <br> :param source_folder: 源文件夹路径<br> :param target_folder: 目标文件夹路径<br> """<br> event_handler = FolderSyncHandler(source_folder, target_folder)<br> observer = Observer()<br> observer.schedule(event_handler, source_folder, recursive=True)<br> observer.start()<br> <br> try:<br> while True:<br> pass<br> except KeyboardInterrupt:<br> observer.stop()<br> <br> observer.join()<br><br><em># 使用示例</em><br>sync_folders("path/to/source/folder", "path/to/target/folder")
输出示例:
1 File synced from path/to/source/folder/file.txt to path/to/target/folder/file.txt
10. 数据库操作
在处理大量数据时,数据库是一个非常有用的工具。下面是一个使用
1 | sqlite3 |
库来创建和查询数据库的例子。
1 import sqlite3<br><br>def create_and_query_database():<br> """<br> 创建一个简单的SQLite数据库并进行查询。<br> """<br> <em># 连接到SQLite数据库</em><br> conn = sqlite3.connect('example.db')<br> <br> <em># 创建游标</em><br> cursor = conn.cursor()<br> <br> <em># 创建表</em><br> cursor.execute('''<br> CREATE TABLE IF NOT EXISTS employees (<br> id INTEGER PRIMARY KEY,<br> name TEXT,<br> age INTEGER<br> )<br> ''')<br> <br> <em># 插入数据</em><br> cursor.execute("INSERT INTO employees (name, age) VALUES ('Alice', 25)")<br> cursor.execute("INSERT INTO employees (name, age) VALUES ('Bob', 30)")<br> <br> <em># 提交事务</em><br> conn.commit()<br> <br> <em># 查询数据</em><br> cursor.execute("SELECT * FROM employees")<br> rows = cursor.fetchall()<br> <br> <em># 打印查询结果</em><br> for row in rows:<br> print(row)<br> <br> <em># 关闭连接</em><br> conn.close()<br><br><em># 使用示例</em><br>create_and_query_database()
输出示例:
1 (1, 'Alice', 25)<br>(2, 'Bob', 30)
11. 日志记录
在开发过程中,日志记录是非常重要的。以下脚本展示了如何使用
1 | logging |
库记录日志。
1 import logging<br><br>def setup_logger():<br> """<br> 设置日志记录。<br> """<br> <em># 创建logger</em><br> logger = logging.getLogger('my_logger')<br> logger.setLevel(logging.DEBUG)<br> <br> <em># 创建handler</em><br> file_handler = logging.FileHandler('app.log')<br> console_handler = logging.StreamHandler()<br> <br> <em># 设置日志级别</em><br> file_handler.setLevel(logging.DEBUG)<br> console_handler.setLevel(logging.INFO)<br> <br> <em># 定义日志格式</em><br> formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')<br> file_handler.setFormatter(formatter)<br> console_handler.setFormatter(formatter)<br> <br> <em># 添加handler到logger</em><br> logger.addHandler(file_handler)<br> logger.addHandler(console_handler)<br> <br> return logger<br><br>def log_example(logger):<br> """<br> 记录日志示例。<br> <br> :param logger: 日志记录器<br> """<br> logger.debug("This is a debug message")<br> logger.info("This is an info message")<br> logger.warning("This is a warning message")<br> logger.error("This is an error message")<br> logger.critical("This is a critical message")<br><br><em># 使用示例</em><br>logger = setup_logger()<br>log_example(logger)
输出示例:
1 2023-09-25 14:30:00,123 - INFO - This is an info message<br>2023-09-25 14:30:00,123 - WARNING - This is a warning message<br>2023-09-25 14:30:00,123 - ERROR - This is an error message<br>2023-09-25 14:30:00,123 - CRITICAL - This is a critical message
12. 数据可视化
在数据分析中,数据可视化是必不可少的一部分。以下脚本展示了如何使用
1 | matplotlib |
库绘制简单的图表。
1 import matplotlib.pyplot as plt<br><br>def plot_data(x, y):<br> """<br> 绘制数据图表。<br> <br> :param x: X轴数据<br> :param y: Y轴数据<br> """<br> plt.plot(x, y)<br> plt.xlabel('X Label')<br> plt.ylabel('Y Label')<br> plt.title('Simple Plot')<br> plt.show()<br><br><em># 使用示例</em><br>x = [1, 2, 3, 4, 5]<br>y = [2, 4, 6, 8, 10]<br>plot_data(x, y)
13. PDF拆分器
有时需要将一个大的PDF文件拆分成多个小文件。以下脚本展示了如何使用
1 | PyPDF2 |
库来实现这一功能。
1 from PyPDF2 import PdfReader, PdfWriter<br><br>def split_pdf(input_path, output_dir):<br> """<br> 将PDF文件拆分成多个小文件。<br> <br> :param input_path: 输入PDF文件的路径<br> :param output_dir: 输出文件夹路径<br> """<br> <em># 读取PDF文件</em><br> reader = PdfReader(input_path)<br> <br> <em># 循环拆分每一页</em><br> for page_num in range(len(reader.pages)):<br> writer = PdfWriter()<br> writer.add_page(reader.pages[page_num])<br> <br> <em># 生成输出文件名</em><br> output_path = os.path.join(output_dir, f"page_{page_num + 1}.pdf")<br> <br> <em># 写入输出文件</em><br> with open(output_path, 'wb') as output_file:<br> writer.write(output_file)<br> <br> print(f"Split page {page_num + 1} to {output_path}")<br><br><em># 使用示例</em><br>split_pdf("path/to/input.pdf", "path/to/output/directory")
输出示例:
1 Split page 1 to path/to/output/directory/page_1.pdf<br>Split page 2 to path/to/output/directory/page_2.pdf
14. 实战案例:自动化报表生成
假设你需要每个月自动生成一份销售报告。以下是一个完整的脚本,展示如何从Excel文件中读取数据,生成分析报告,并发送给相关人员。
1 import pandas as pd<br>from reportlab.lib.pagesizes import letter<br>from reportlab.pdfgen import canvas<br>import smtplib<br>from email.mime.text import MIMEText<br>from email.mime.multipart import MIMEMultipart<br>from email.mime.application import MIMEApplication<br><br>def generate_report(excel_path, pdf_path):<br> """<br> 从Excel文件中读取数据并生成PDF报告。<br> <br> :param excel_path: Excel文件路径<br> :param pdf_path: PDF文件路径<br> """<br> <em># 读取Excel文件</em><br> df = pd.read_excel(excel_path)<br> <br> <em># 分析数据</em><br> total_sales = df['Sales'].sum()<br> top_products = df.groupby('Product')['Sales'].sum().nlargest(5)<br> <br> <em># 创建PDF报告</em><br> c = canvas.Canvas(pdf_path, pagesize=letter)<br> c.drawString(100, 750, "Monthly Sales Report")<br> c.drawString(100, 730, f"Total Sales: ${total_sales:.2f}")<br> c.drawString(100, 710, "Top Products:")<br> <br> y = 690<br> for product, sales in top_products.items():<br> c.drawString(120, y, f"{product}: ${sales:.2f}")<br> y -= 20<br> <br> c.save()<br> print(f"Report generated at {pdf_path}")<br><br>def send_report(pdf_path, recipient, sender="your_email@example.com"):<br> """<br> 发送PDF报告。<br> <br> :param pdf_path: PDF文件路径<br> :param recipient: 收件人邮箱地址<br> :param sender: 发件人邮箱地址,默认为"your_email@example.com"<br> """<br> <em># 创建邮件对象</em><br> message = MIMEMultipart()<br> message['From'] = sender<br> message['To'] = recipient<br> message['Subject'] = "Monthly Sales Report"<br> <br> <em># 添加邮件正文</em><br> message.attach(MIMEText("Please find attached the monthly sales report."))<br> <br> <em># 添加附件</em><br> with open(pdf_path, 'rb') as file:<br> attachment = MIMEApplication(file.read(), _subtype="pdf")<br> attachment.add_header('Content-Disposition', 'attachment', filename=os.path.basename(pdf_path))<br> message.attach(attachment)<br> <br> <em># 发送邮件</em><br> with smtplib.SMTP('smtp.example.com', 587) as server:<br> server.starttls()<br> server.login(sender, 'your_password')<br> server.sendmail(sender, recipient, message.as_string())<br> <br> print(f"Report sent to {recipient}")<br><br><em># 使用示例</em><br>generate_report("path/to/sales_data.xlsx", "path/to/report.pdf")<br>send_report("path/to/report.pdf", "recipient@example.com")
输出示例:
1 Report generated at path/to/report.pdf<br>Report sent to recipient@example.com