PYTHON基础技能 – Python自动化办公的14个实用脚本

释放双眼,带上耳机,听听看~!

在日常工作中,重复性的任务不仅耗时,还容易出错。Python凭借其简洁易学的语法,成为许多办公室自动化任务的首选工具。今天,我们就一起来看看如何用Python编写一些实用的小脚本,提高工作效率。

1. 文本文件批量重命名

在整理文档时,经常需要对大量文件进行重命名。下面是一个简单的脚本,帮助你批量处理这些任务。


1
import&nbsp;os<br><br>def&nbsp;rename_files(directory,&nbsp;prefix=""):<br>&nbsp;&nbsp;&nbsp;&nbsp;"""<br>&nbsp;&nbsp;&nbsp;&nbsp;批量重命名指定目录下的所有文件。<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;:param&nbsp;directory:&nbsp;要处理的文件夹路径<br>&nbsp;&nbsp;&nbsp;&nbsp;:param&nbsp;prefix:&nbsp;文件的新前缀,默认为空字符串<br>&nbsp;&nbsp;&nbsp;&nbsp;"""<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;遍历指定目录下的所有文件</em><br>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;filename&nbsp;in&nbsp;os.listdir(directory):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;获取文件名和扩展名</em><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file_base,&nbsp;file_ext&nbsp;=&nbsp;os.path.splitext(filename)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;生成新文件名</em><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new_filename&nbsp;=&nbsp;f"{prefix}{file_base}{file_ext}"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;拼接完整路径</em><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;old_path&nbsp;=&nbsp;os.path.join(directory,&nbsp;filename)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new_path&nbsp;=&nbsp;os.path.join(directory,&nbsp;new_filename)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;重命名文件</em><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.rename(old_path,&nbsp;new_path)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(f"Renamed&nbsp;'{filename}'&nbsp;to&nbsp;'{new_filename}'")<br><br><em>#&nbsp;使用示例</em><br>rename_files("path/to/your/directory",&nbsp;"New_")

输出示例:


1
Renamed&nbsp;'old_file.txt'&nbsp;to&nbsp;'New_old_file.txt'<br>Renamed&nbsp;'another_file.docx'&nbsp;to&nbsp;'New_another_file.docx'

2. Excel数据清洗

Excel表中的数据经常需要清理才能进一步分析。这个脚本可以帮助你删除空行、格式化日期等。


1
import&nbsp;pandas&nbsp;as&nbsp;pd<br><br>def&nbsp;clean_excel(file_path):<br>&nbsp;&nbsp;&nbsp;&nbsp;"""<br>&nbsp;&nbsp;&nbsp;&nbsp;清洗Excel表格中的数据。<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;:param&nbsp;file_path:&nbsp;Excel文件的路径<br>&nbsp;&nbsp;&nbsp;&nbsp;"""<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;读取Excel文件</em><br>&nbsp;&nbsp;&nbsp;&nbsp;df&nbsp;=&nbsp;pd.read_excel(file_path)<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;删除空行</em><br>&nbsp;&nbsp;&nbsp;&nbsp;df.dropna(inplace=True)<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;格式化日期列(假设日期列名为'Date')</em><br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;'Date'&nbsp;in&nbsp;df.columns:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;df&#091;'Date']&nbsp;=&nbsp;pd.to_datetime(df&#091;'Date'],&nbsp;format='%Y-%m-%d')<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;保存修改后的数据</em><br>&nbsp;&nbsp;&nbsp;&nbsp;df.to_excel(file_path,&nbsp;index=False)<br>&nbsp;&nbsp;&nbsp;&nbsp;print(f"Data&nbsp;cleaned&nbsp;and&nbsp;saved&nbsp;to&nbsp;{file_path}")<br><br><em>#&nbsp;使用示例</em><br>clean_excel("path/to/your/excel/file.xlsx")

3. PDF合并器

工作中经常需要将多个PDF文件合并成一个。下面这个脚本可以轻松实现这一点。


1
from&nbsp;PyPDF2&nbsp;import&nbsp;PdfMerger<br><br>def&nbsp;merge_pdfs(output_path,&nbsp;*input_paths):<br>&nbsp;&nbsp;&nbsp;&nbsp;"""<br>&nbsp;&nbsp;&nbsp;&nbsp;合并多个PDF文件为一个。<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;:param&nbsp;output_path:&nbsp;输出文件的路径<br>&nbsp;&nbsp;&nbsp;&nbsp;:param&nbsp;input_paths:&nbsp;一个或多个输入文件的路径<br>&nbsp;&nbsp;&nbsp;&nbsp;"""<br>&nbsp;&nbsp;&nbsp;&nbsp;merger&nbsp;=&nbsp;PdfMerger()<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;循环添加每个PDF文件</em><br>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;path&nbsp;in&nbsp;input_paths:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;merger.append(path)<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;写入输出文件</em><br>&nbsp;&nbsp;&nbsp;&nbsp;merger.write(output_path)<br>&nbsp;&nbsp;&nbsp;&nbsp;merger.close()<br>&nbsp;&nbsp;&nbsp;&nbsp;print(f"Merged&nbsp;files&nbsp;into&nbsp;{output_path}")<br><br><em>#&nbsp;使用示例</em><br>merge_pdfs("path/to/output.pdf",&nbsp;"path/to/file1.pdf",&nbsp;"path/to/file2.pdf")

输出示例:


1
Merged&nbsp;files&nbsp;into&nbsp;path/to/output.pdf

4. 图片压缩工具

发送邮件或者上传图片时,常常需要先压缩图片以减少文件大小。这个脚本利用Pillow库来完成这一任务。


1
from&nbsp;PIL&nbsp;import&nbsp;Image<br><br>def&nbsp;compress_image(file_path,&nbsp;output_path=None,&nbsp;quality=75):<br>&nbsp;&nbsp;&nbsp;&nbsp;"""<br>&nbsp;&nbsp;&nbsp;&nbsp;压缩图片文件。<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;:param&nbsp;file_path:&nbsp;输入图片的路径<br>&nbsp;&nbsp;&nbsp;&nbsp;:param&nbsp;output_path:&nbsp;输出图片的路径,默认为原文件覆盖<br>&nbsp;&nbsp;&nbsp;&nbsp;:param&nbsp;quality:&nbsp;压缩质量,范围0-100<br>&nbsp;&nbsp;&nbsp;&nbsp;"""<br>&nbsp;&nbsp;&nbsp;&nbsp;img&nbsp;=&nbsp;Image.open(file_path)<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;not&nbsp;output_path:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output_path&nbsp;=&nbsp;file_path<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;img.save(output_path,&nbsp;optimize=True,&nbsp;quality=quality)<br>&nbsp;&nbsp;&nbsp;&nbsp;print(f"Image&nbsp;compressed&nbsp;and&nbsp;saved&nbsp;to&nbsp;{output_path}")<br><br><em>#&nbsp;使用示例</em><br>compress_image("path/to/image.jpg")

输出示例:


1
Image&nbsp;compressed&nbsp;and&nbsp;saved&nbsp;to&nbsp;path/to/image.jpg

5. 文本内容替换

编辑文档时,可能需要批量替换某些文本内容。这个脚本可以帮你快速实现。


1
def&nbsp;replace_text_in_files(directory,&nbsp;old_text,&nbsp;new_text):<br>&nbsp;&nbsp;&nbsp;&nbsp;"""<br>&nbsp;&nbsp;&nbsp;&nbsp;在指定目录下所有文本文件中替换指定文本。<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;:param&nbsp;directory:&nbsp;文件所在的目录<br>&nbsp;&nbsp;&nbsp;&nbsp;:param&nbsp;old_text:&nbsp;要被替换的文本<br>&nbsp;&nbsp;&nbsp;&nbsp;:param&nbsp;new_text:&nbsp;新文本<br>&nbsp;&nbsp;&nbsp;&nbsp;"""<br>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;filename&nbsp;in&nbsp;os.listdir(directory):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;filename.endswith(".txt"):&nbsp;&nbsp;<em>#&nbsp;只处理.txt文件</em><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file_path&nbsp;=&nbsp;os.path.join(directory,&nbsp;filename)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;with&nbsp;open(file_path,&nbsp;'r',&nbsp;encoding='utf-8')&nbsp;as&nbsp;file:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file_data&nbsp;=&nbsp;file.read()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;替换文本</em><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file_data&nbsp;=&nbsp;file_data.replace(old_text,&nbsp;new_text)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;写回文件</em><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;with&nbsp;open(file_path,&nbsp;'w',&nbsp;encoding='utf-8')&nbsp;as&nbsp;file:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file.write(file_data)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(f"Replaced&nbsp;text&nbsp;in&nbsp;{filename}")<br><br><em>#&nbsp;使用示例</em><br>replace_text_in_files("path/to/text/files",&nbsp;"old_text",&nbsp;"new_text")

输出示例:


1
Replaced&nbsp;text&nbsp;in&nbsp;file1.txt<br>Replaced&nbsp;text&nbsp;in&nbsp;file2.txt

6. 数据抓取与解析

在进行市场调研或数据分析时,从网页上抓取数据是一项常见的任务。下面是一个使用

1
requests

1
BeautifulSoup

库来抓取和解析网页数据的例子。


1
import&nbsp;requests<br>from&nbsp;bs4&nbsp;import&nbsp;BeautifulSoup<br><br>def&nbsp;scrape_webpage(url):<br>&nbsp;&nbsp;&nbsp;&nbsp;"""<br>&nbsp;&nbsp;&nbsp;&nbsp;抓取并解析网页上的数据。<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;:param&nbsp;url:&nbsp;目标网页的URL<br>&nbsp;&nbsp;&nbsp;&nbsp;"""<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;发送请求获取网页内容</em><br>&nbsp;&nbsp;&nbsp;&nbsp;response&nbsp;=&nbsp;requests.get(url)<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;解析HTML内容</em><br>&nbsp;&nbsp;&nbsp;&nbsp;soup&nbsp;=&nbsp;BeautifulSoup(response.text,&nbsp;'html.parser')<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;提取特定信息(例如标题)</em><br>&nbsp;&nbsp;&nbsp;&nbsp;titles&nbsp;=&nbsp;soup.find_all('h1')<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;打印提取的信息</em><br>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;title&nbsp;in&nbsp;titles:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(title.text.strip())<br><br><em>#&nbsp;使用示例</em><br>scrape_webpage("https://example.com")

输出示例:


1
Example&nbsp;Domain<br>This&nbsp;domain&nbsp;is&nbsp;for&nbsp;use&nbsp;in&nbsp;illustrative&nbsp;examples&nbsp;in&nbsp;documents.<br>You&nbsp;may&nbsp;use&nbsp;this&nbsp;domain&nbsp;in&nbsp;literature&nbsp;without&nbsp;prior&nbsp;coordination&nbsp;or&nbsp;asking&nbsp;for&nbsp;permission.

7. 数据导出到CSV

抓取的数据通常需要导出到CSV文件以便进一步分析。以下脚本展示了如何将数据导出到CSV文件。


1
import&nbsp;csv<br><br>def&nbsp;export_to_csv(data,&nbsp;file_path):<br>&nbsp;&nbsp;&nbsp;&nbsp;"""<br>&nbsp;&nbsp;&nbsp;&nbsp;将数据导出到CSV文件。<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;:param&nbsp;data:&nbsp;要导出的数据列表,每个元素是一个字典<br>&nbsp;&nbsp;&nbsp;&nbsp;:param&nbsp;file_path:&nbsp;CSV文件的路径<br>&nbsp;&nbsp;&nbsp;&nbsp;"""<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;确定CSV文件的字段</em><br>&nbsp;&nbsp;&nbsp;&nbsp;fieldnames&nbsp;=&nbsp;data&#091;0].keys()<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;打开CSV文件并写入数据</em><br>&nbsp;&nbsp;&nbsp;&nbsp;with&nbsp;open(file_path,&nbsp;'w',&nbsp;newline='',&nbsp;encoding='utf-8')&nbsp;as&nbsp;csvfile:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer&nbsp;=&nbsp;csv.DictWriter(csvfile,&nbsp;fieldnames=fieldnames)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;写入表头</em><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.writeheader()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;写入每一行数据</em><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;row&nbsp;in&nbsp;data:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.writerow(row)<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;print(f"Data&nbsp;exported&nbsp;to&nbsp;{file_path}")<br><br><em>#&nbsp;示例数据</em><br>data&nbsp;=&nbsp;&#091;<br>&nbsp;&nbsp;&nbsp;&nbsp;{'Name':&nbsp;'Alice',&nbsp;'Age':&nbsp;25,&nbsp;'City':&nbsp;'New&nbsp;York'},<br>&nbsp;&nbsp;&nbsp;&nbsp;{'Name':&nbsp;'Bob',&nbsp;'Age':&nbsp;30,&nbsp;'City':&nbsp;'San&nbsp;Francisco'}<br>]<br><br><em>#&nbsp;使用示例</em><br>export_to_csv(data,&nbsp;"path/to/output.csv")

输出示例:


1
Data&nbsp;exported&nbsp;to&nbsp;path/to/output.csv

8. 邮件自动发送

工作中经常需要发送大量的电子邮件。下面是一个使用

1
smtplib

库自动发送邮件的例子。


1
import&nbsp;smtplib<br>from&nbsp;email.mime.text&nbsp;import&nbsp;MIMEText<br>from&nbsp;email.mime.multipart&nbsp;import&nbsp;MIMEMultipart<br><br>def&nbsp;send_email(subject,&nbsp;body,&nbsp;recipient,&nbsp;sender="your_email@example.com"):<br>&nbsp;&nbsp;&nbsp;&nbsp;"""<br>&nbsp;&nbsp;&nbsp;&nbsp;发送电子邮件。<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;:param&nbsp;subject:&nbsp;邮件主题<br>&nbsp;&nbsp;&nbsp;&nbsp;:param&nbsp;body:&nbsp;邮件正文<br>&nbsp;&nbsp;&nbsp;&nbsp;:param&nbsp;recipient:&nbsp;收件人邮箱地址<br>&nbsp;&nbsp;&nbsp;&nbsp;:param&nbsp;sender:&nbsp;发件人邮箱地址,默认为"your_email@example.com"<br>&nbsp;&nbsp;&nbsp;&nbsp;"""<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;创建邮件对象</em><br>&nbsp;&nbsp;&nbsp;&nbsp;message&nbsp;=&nbsp;MIMEMultipart()<br>&nbsp;&nbsp;&nbsp;&nbsp;message&#091;'From']&nbsp;=&nbsp;sender<br>&nbsp;&nbsp;&nbsp;&nbsp;message&#091;'To']&nbsp;=&nbsp;recipient<br>&nbsp;&nbsp;&nbsp;&nbsp;message&#091;'Subject']&nbsp;=&nbsp;subject<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;添加邮件正文</em><br>&nbsp;&nbsp;&nbsp;&nbsp;message.attach(MIMEText(body,&nbsp;'plain'))<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;发送邮件</em><br>&nbsp;&nbsp;&nbsp;&nbsp;with&nbsp;smtplib.SMTP('smtp.example.com',&nbsp;587)&nbsp;as&nbsp;server:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server.starttls()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server.login(sender,&nbsp;'your_password')<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server.sendmail(sender,&nbsp;recipient,&nbsp;message.as_string())<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;print(f"Email&nbsp;sent&nbsp;to&nbsp;{recipient}")<br><br><em>#&nbsp;使用示例</em><br>send_email("Meeting&nbsp;Reminder",&nbsp;"Don't&nbsp;forget&nbsp;the&nbsp;meeting&nbsp;at&nbsp;2&nbsp;PM.",&nbsp;"recipient@example.com")

输出示例:


1
Email&nbsp;sent&nbsp;to&nbsp;recipient@example.com

9. 文件夹监控与同步

有时需要实时监控文件夹的变化,并将更改同步到另一个位置。以下脚本展示了如何使用

1
watchdog

库实现这一功能。


1
from&nbsp;watchdog.observers&nbsp;import&nbsp;Observer<br>from&nbsp;watchdog.events&nbsp;import&nbsp;FileSystemEventHandler<br><br>class&nbsp;FolderSyncHandler(FileSystemEventHandler):<br>&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;__init__(self,&nbsp;source_folder,&nbsp;target_folder):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.source_folder&nbsp;=&nbsp;source_folder<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.target_folder&nbsp;=&nbsp;target_folder<br><br>&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;on_modified(self,&nbsp;event):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"""<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当文件夹中的文件被修改时触发。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"""<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;event.is_directory:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;source_path&nbsp;=&nbsp;event.src_path<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;target_path&nbsp;=&nbsp;source_path.replace(self.source_folder,&nbsp;self.target_folder)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;复制文件</em><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;with&nbsp;open(source_path,&nbsp;'rb')&nbsp;as&nbsp;src_file:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;with&nbsp;open(target_path,&nbsp;'wb')&nbsp;as&nbsp;target_file:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;target_file.write(src_file.read())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(f"File&nbsp;synced&nbsp;from&nbsp;{source_path}&nbsp;to&nbsp;{target_path}")<br><br>def&nbsp;sync_folders(source_folder,&nbsp;target_folder):<br>&nbsp;&nbsp;&nbsp;&nbsp;"""<br>&nbsp;&nbsp;&nbsp;&nbsp;监控源文件夹并将更改同步到目标文件夹。<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;:param&nbsp;source_folder:&nbsp;源文件夹路径<br>&nbsp;&nbsp;&nbsp;&nbsp;:param&nbsp;target_folder:&nbsp;目标文件夹路径<br>&nbsp;&nbsp;&nbsp;&nbsp;"""<br>&nbsp;&nbsp;&nbsp;&nbsp;event_handler&nbsp;=&nbsp;FolderSyncHandler(source_folder,&nbsp;target_folder)<br>&nbsp;&nbsp;&nbsp;&nbsp;observer&nbsp;=&nbsp;Observer()<br>&nbsp;&nbsp;&nbsp;&nbsp;observer.schedule(event_handler,&nbsp;source_folder,&nbsp;recursive=True)<br>&nbsp;&nbsp;&nbsp;&nbsp;observer.start()<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;try:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;True:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pass<br>&nbsp;&nbsp;&nbsp;&nbsp;except&nbsp;KeyboardInterrupt:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;observer.stop()<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;observer.join()<br><br><em>#&nbsp;使用示例</em><br>sync_folders("path/to/source/folder",&nbsp;"path/to/target/folder")

输出示例:


1
File&nbsp;synced&nbsp;from&nbsp;path/to/source/folder/file.txt&nbsp;to&nbsp;path/to/target/folder/file.txt

10. 数据库操作

在处理大量数据时,数据库是一个非常有用的工具。下面是一个使用

1
sqlite3

库来创建和查询数据库的例子。


1
import&nbsp;sqlite3<br><br>def&nbsp;create_and_query_database():<br>&nbsp;&nbsp;&nbsp;&nbsp;"""<br>&nbsp;&nbsp;&nbsp;&nbsp;创建一个简单的SQLite数据库并进行查询。<br>&nbsp;&nbsp;&nbsp;&nbsp;"""<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;连接到SQLite数据库</em><br>&nbsp;&nbsp;&nbsp;&nbsp;conn&nbsp;=&nbsp;sqlite3.connect('example.db')<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;创建游标</em><br>&nbsp;&nbsp;&nbsp;&nbsp;cursor&nbsp;=&nbsp;conn.cursor()<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;创建表</em><br>&nbsp;&nbsp;&nbsp;&nbsp;cursor.execute('''<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CREATE&nbsp;TABLE&nbsp;IF&nbsp;NOT&nbsp;EXISTS&nbsp;employees&nbsp;(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id&nbsp;INTEGER&nbsp;PRIMARY&nbsp;KEY,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;TEXT,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;age&nbsp;INTEGER<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;''')<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;插入数据</em><br>&nbsp;&nbsp;&nbsp;&nbsp;cursor.execute("INSERT&nbsp;INTO&nbsp;employees&nbsp;(name,&nbsp;age)&nbsp;VALUES&nbsp;('Alice',&nbsp;25)")<br>&nbsp;&nbsp;&nbsp;&nbsp;cursor.execute("INSERT&nbsp;INTO&nbsp;employees&nbsp;(name,&nbsp;age)&nbsp;VALUES&nbsp;('Bob',&nbsp;30)")<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;提交事务</em><br>&nbsp;&nbsp;&nbsp;&nbsp;conn.commit()<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;查询数据</em><br>&nbsp;&nbsp;&nbsp;&nbsp;cursor.execute("SELECT&nbsp;*&nbsp;FROM&nbsp;employees")<br>&nbsp;&nbsp;&nbsp;&nbsp;rows&nbsp;=&nbsp;cursor.fetchall()<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;打印查询结果</em><br>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;row&nbsp;in&nbsp;rows:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(row)<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;关闭连接</em><br>&nbsp;&nbsp;&nbsp;&nbsp;conn.close()<br><br><em>#&nbsp;使用示例</em><br>create_and_query_database()

输出示例:


1
(1,&nbsp;'Alice',&nbsp;25)<br>(2,&nbsp;'Bob',&nbsp;30)

11. 日志记录

在开发过程中,日志记录是非常重要的。以下脚本展示了如何使用

1
logging

库记录日志。


1
import&nbsp;logging<br><br>def&nbsp;setup_logger():<br>&nbsp;&nbsp;&nbsp;&nbsp;"""<br>&nbsp;&nbsp;&nbsp;&nbsp;设置日志记录。<br>&nbsp;&nbsp;&nbsp;&nbsp;"""<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;创建logger</em><br>&nbsp;&nbsp;&nbsp;&nbsp;logger&nbsp;=&nbsp;logging.getLogger('my_logger')<br>&nbsp;&nbsp;&nbsp;&nbsp;logger.setLevel(logging.DEBUG)<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;创建handler</em><br>&nbsp;&nbsp;&nbsp;&nbsp;file_handler&nbsp;=&nbsp;logging.FileHandler('app.log')<br>&nbsp;&nbsp;&nbsp;&nbsp;console_handler&nbsp;=&nbsp;logging.StreamHandler()<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;设置日志级别</em><br>&nbsp;&nbsp;&nbsp;&nbsp;file_handler.setLevel(logging.DEBUG)<br>&nbsp;&nbsp;&nbsp;&nbsp;console_handler.setLevel(logging.INFO)<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;定义日志格式</em><br>&nbsp;&nbsp;&nbsp;&nbsp;formatter&nbsp;=&nbsp;logging.Formatter('%(asctime)s&nbsp;-&nbsp;%(levelname)s&nbsp;-&nbsp;%(message)s')<br>&nbsp;&nbsp;&nbsp;&nbsp;file_handler.setFormatter(formatter)<br>&nbsp;&nbsp;&nbsp;&nbsp;console_handler.setFormatter(formatter)<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;添加handler到logger</em><br>&nbsp;&nbsp;&nbsp;&nbsp;logger.addHandler(file_handler)<br>&nbsp;&nbsp;&nbsp;&nbsp;logger.addHandler(console_handler)<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;logger<br><br>def&nbsp;log_example(logger):<br>&nbsp;&nbsp;&nbsp;&nbsp;"""<br>&nbsp;&nbsp;&nbsp;&nbsp;记录日志示例。<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;:param&nbsp;logger:&nbsp;日志记录器<br>&nbsp;&nbsp;&nbsp;&nbsp;"""<br>&nbsp;&nbsp;&nbsp;&nbsp;logger.debug("This&nbsp;is&nbsp;a&nbsp;debug&nbsp;message")<br>&nbsp;&nbsp;&nbsp;&nbsp;logger.info("This&nbsp;is&nbsp;an&nbsp;info&nbsp;message")<br>&nbsp;&nbsp;&nbsp;&nbsp;logger.warning("This&nbsp;is&nbsp;a&nbsp;warning&nbsp;message")<br>&nbsp;&nbsp;&nbsp;&nbsp;logger.error("This&nbsp;is&nbsp;an&nbsp;error&nbsp;message")<br>&nbsp;&nbsp;&nbsp;&nbsp;logger.critical("This&nbsp;is&nbsp;a&nbsp;critical&nbsp;message")<br><br><em>#&nbsp;使用示例</em><br>logger&nbsp;=&nbsp;setup_logger()<br>log_example(logger)

输出示例:


1
2023-09-25&nbsp;14:30:00,123&nbsp;-&nbsp;INFO&nbsp;-&nbsp;This&nbsp;is&nbsp;an&nbsp;info&nbsp;message<br>2023-09-25&nbsp;14:30:00,123&nbsp;-&nbsp;WARNING&nbsp;-&nbsp;This&nbsp;is&nbsp;a&nbsp;warning&nbsp;message<br>2023-09-25&nbsp;14:30:00,123&nbsp;-&nbsp;ERROR&nbsp;-&nbsp;This&nbsp;is&nbsp;an&nbsp;error&nbsp;message<br>2023-09-25&nbsp;14:30:00,123&nbsp;-&nbsp;CRITICAL&nbsp;-&nbsp;This&nbsp;is&nbsp;a&nbsp;critical&nbsp;message

12. 数据可视化

在数据分析中,数据可视化是必不可少的一部分。以下脚本展示了如何使用

1
matplotlib

库绘制简单的图表。


1
import&nbsp;matplotlib.pyplot&nbsp;as&nbsp;plt<br><br>def&nbsp;plot_data(x,&nbsp;y):<br>&nbsp;&nbsp;&nbsp;&nbsp;"""<br>&nbsp;&nbsp;&nbsp;&nbsp;绘制数据图表。<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;:param&nbsp;x:&nbsp;X轴数据<br>&nbsp;&nbsp;&nbsp;&nbsp;:param&nbsp;y:&nbsp;Y轴数据<br>&nbsp;&nbsp;&nbsp;&nbsp;"""<br>&nbsp;&nbsp;&nbsp;&nbsp;plt.plot(x,&nbsp;y)<br>&nbsp;&nbsp;&nbsp;&nbsp;plt.xlabel('X&nbsp;Label')<br>&nbsp;&nbsp;&nbsp;&nbsp;plt.ylabel('Y&nbsp;Label')<br>&nbsp;&nbsp;&nbsp;&nbsp;plt.title('Simple&nbsp;Plot')<br>&nbsp;&nbsp;&nbsp;&nbsp;plt.show()<br><br><em>#&nbsp;使用示例</em><br>x&nbsp;=&nbsp;&#091;1,&nbsp;2,&nbsp;3,&nbsp;4,&nbsp;5]<br>y&nbsp;=&nbsp;&#091;2,&nbsp;4,&nbsp;6,&nbsp;8,&nbsp;10]<br>plot_data(x,&nbsp;y)

13. PDF拆分器

有时需要将一个大的PDF文件拆分成多个小文件。以下脚本展示了如何使用

1
PyPDF2

库来实现这一功能。


1
from&nbsp;PyPDF2&nbsp;import&nbsp;PdfReader,&nbsp;PdfWriter<br><br>def&nbsp;split_pdf(input_path,&nbsp;output_dir):<br>&nbsp;&nbsp;&nbsp;&nbsp;"""<br>&nbsp;&nbsp;&nbsp;&nbsp;将PDF文件拆分成多个小文件。<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;:param&nbsp;input_path:&nbsp;输入PDF文件的路径<br>&nbsp;&nbsp;&nbsp;&nbsp;:param&nbsp;output_dir:&nbsp;输出文件夹路径<br>&nbsp;&nbsp;&nbsp;&nbsp;"""<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;读取PDF文件</em><br>&nbsp;&nbsp;&nbsp;&nbsp;reader&nbsp;=&nbsp;PdfReader(input_path)<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;循环拆分每一页</em><br>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;page_num&nbsp;in&nbsp;range(len(reader.pages)):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer&nbsp;=&nbsp;PdfWriter()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.add_page(reader.pages&#091;page_num])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;生成输出文件名</em><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output_path&nbsp;=&nbsp;os.path.join(output_dir,&nbsp;f"page_{page_num&nbsp;+&nbsp;1}.pdf")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;写入输出文件</em><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;with&nbsp;open(output_path,&nbsp;'wb')&nbsp;as&nbsp;output_file:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.write(output_file)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(f"Split&nbsp;page&nbsp;{page_num&nbsp;+&nbsp;1}&nbsp;to&nbsp;{output_path}")<br><br><em>#&nbsp;使用示例</em><br>split_pdf("path/to/input.pdf",&nbsp;"path/to/output/directory")

输出示例:


1
Split&nbsp;page&nbsp;1&nbsp;to&nbsp;path/to/output/directory/page_1.pdf<br>Split&nbsp;page&nbsp;2&nbsp;to&nbsp;path/to/output/directory/page_2.pdf

14. 实战案例:自动化报表生成

假设你需要每个月自动生成一份销售报告。以下是一个完整的脚本,展示如何从Excel文件中读取数据,生成分析报告,并发送给相关人员。


1
import&nbsp;pandas&nbsp;as&nbsp;pd<br>from&nbsp;reportlab.lib.pagesizes&nbsp;import&nbsp;letter<br>from&nbsp;reportlab.pdfgen&nbsp;import&nbsp;canvas<br>import&nbsp;smtplib<br>from&nbsp;email.mime.text&nbsp;import&nbsp;MIMEText<br>from&nbsp;email.mime.multipart&nbsp;import&nbsp;MIMEMultipart<br>from&nbsp;email.mime.application&nbsp;import&nbsp;MIMEApplication<br><br>def&nbsp;generate_report(excel_path,&nbsp;pdf_path):<br>&nbsp;&nbsp;&nbsp;&nbsp;"""<br>&nbsp;&nbsp;&nbsp;&nbsp;从Excel文件中读取数据并生成PDF报告。<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;:param&nbsp;excel_path:&nbsp;Excel文件路径<br>&nbsp;&nbsp;&nbsp;&nbsp;:param&nbsp;pdf_path:&nbsp;PDF文件路径<br>&nbsp;&nbsp;&nbsp;&nbsp;"""<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;读取Excel文件</em><br>&nbsp;&nbsp;&nbsp;&nbsp;df&nbsp;=&nbsp;pd.read_excel(excel_path)<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;分析数据</em><br>&nbsp;&nbsp;&nbsp;&nbsp;total_sales&nbsp;=&nbsp;df&#091;'Sales'].sum()<br>&nbsp;&nbsp;&nbsp;&nbsp;top_products&nbsp;=&nbsp;df.groupby('Product')&#091;'Sales'].sum().nlargest(5)<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;创建PDF报告</em><br>&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;=&nbsp;canvas.Canvas(pdf_path,&nbsp;pagesize=letter)<br>&nbsp;&nbsp;&nbsp;&nbsp;c.drawString(100,&nbsp;750,&nbsp;"Monthly&nbsp;Sales&nbsp;Report")<br>&nbsp;&nbsp;&nbsp;&nbsp;c.drawString(100,&nbsp;730,&nbsp;f"Total&nbsp;Sales:&nbsp;${total_sales:.2f}")<br>&nbsp;&nbsp;&nbsp;&nbsp;c.drawString(100,&nbsp;710,&nbsp;"Top&nbsp;Products:")<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;y&nbsp;=&nbsp;690<br>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;product,&nbsp;sales&nbsp;in&nbsp;top_products.items():<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.drawString(120,&nbsp;y,&nbsp;f"{product}:&nbsp;${sales:.2f}")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y&nbsp;-=&nbsp;20<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;c.save()<br>&nbsp;&nbsp;&nbsp;&nbsp;print(f"Report&nbsp;generated&nbsp;at&nbsp;{pdf_path}")<br><br>def&nbsp;send_report(pdf_path,&nbsp;recipient,&nbsp;sender="your_email@example.com"):<br>&nbsp;&nbsp;&nbsp;&nbsp;"""<br>&nbsp;&nbsp;&nbsp;&nbsp;发送PDF报告。<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;:param&nbsp;pdf_path:&nbsp;PDF文件路径<br>&nbsp;&nbsp;&nbsp;&nbsp;:param&nbsp;recipient:&nbsp;收件人邮箱地址<br>&nbsp;&nbsp;&nbsp;&nbsp;:param&nbsp;sender:&nbsp;发件人邮箱地址,默认为"your_email@example.com"<br>&nbsp;&nbsp;&nbsp;&nbsp;"""<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;创建邮件对象</em><br>&nbsp;&nbsp;&nbsp;&nbsp;message&nbsp;=&nbsp;MIMEMultipart()<br>&nbsp;&nbsp;&nbsp;&nbsp;message&#091;'From']&nbsp;=&nbsp;sender<br>&nbsp;&nbsp;&nbsp;&nbsp;message&#091;'To']&nbsp;=&nbsp;recipient<br>&nbsp;&nbsp;&nbsp;&nbsp;message&#091;'Subject']&nbsp;=&nbsp;"Monthly&nbsp;Sales&nbsp;Report"<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;添加邮件正文</em><br>&nbsp;&nbsp;&nbsp;&nbsp;message.attach(MIMEText("Please&nbsp;find&nbsp;attached&nbsp;the&nbsp;monthly&nbsp;sales&nbsp;report."))<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;添加附件</em><br>&nbsp;&nbsp;&nbsp;&nbsp;with&nbsp;open(pdf_path,&nbsp;'rb')&nbsp;as&nbsp;file:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;attachment&nbsp;=&nbsp;MIMEApplication(file.read(),&nbsp;_subtype="pdf")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;attachment.add_header('Content-Disposition',&nbsp;'attachment',&nbsp;filename=os.path.basename(pdf_path))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message.attach(attachment)<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<em>#&nbsp;发送邮件</em><br>&nbsp;&nbsp;&nbsp;&nbsp;with&nbsp;smtplib.SMTP('smtp.example.com',&nbsp;587)&nbsp;as&nbsp;server:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server.starttls()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server.login(sender,&nbsp;'your_password')<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server.sendmail(sender,&nbsp;recipient,&nbsp;message.as_string())<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;print(f"Report&nbsp;sent&nbsp;to&nbsp;{recipient}")<br><br><em>#&nbsp;使用示例</em><br>generate_report("path/to/sales_data.xlsx",&nbsp;"path/to/report.pdf")<br>send_report("path/to/report.pdf",&nbsp;"recipient@example.com")

输出示例:


1
Report&nbsp;generated&nbsp;at&nbsp;path/to/report.pdf<br>Report&nbsp;sent&nbsp;to&nbsp;recipient@example.com

给TA打赏
共{{data.count}}人
人已打赏
安全运维

安全运维之道:发现、解决问题的有效闭环

2024-4-14 20:59:36

安全运维

稳定性建设 – 架构优化的关键策略

2025-2-11 17:15:56

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索