Python可以实现哪些办公自动化? - Go语言中文社区

Python可以实现哪些办公自动化?


处理Excel电子表格

你可能有一个枯燥的任务,那就是从一个电子表格中复制某些数据并粘贴到另一个电子表格中。或者你可能需要翻阅成千上万的行,然后根据一些标准挑选出其中的一小部分,并进行一些小修改。或者你可能要翻阅数百个部门预算的电子表格,寻找所有包含赤字的电子表格。这些正是Python可以为你做的那种繁琐的、没有技术含量的电子表格任务。

处理PDF和Word文档

PDF和Word文档是二进制文件,它们比纯文本文件要复杂得多。除了文本,它们还保存了许多字体、颜色和布局信息。如果希望程序能读取或写入PDF和Word 文档,那么需要做的就不只是将它们的文件名传递给open()了。

好在有一些Python模块使得处理PDF和Word文档变得容易。

保持时间、计划任务和启动程序

坐在计算机前看着程序运行是不错的,但在你没有直接监督时运行程序也是可以的。计算机的时钟可以调度程序在特定的时间和日期运行或定期运行。例如,程序可以每小时抓取一个网站,检查变更,或在凌晨4点你睡觉时,执行CPU密集型任务。Python的time和datetime模块提供了这些函数。

利用subprocess和threading模块,你也可以编程以按时启动其他程序。通常,编程最快的方法是利用其他人已经写好的应用程序。

发送电子邮件和短信

也许你有一个电子表格,其中包含许多客户记录,你希望根据他们的年龄和位置信息,向每个客户发送不同格式的邮件。商业软件可能无法做到这一点。好在,你可以编写自己的程序来发送这些电子邮件,节省大量复制和粘贴电子邮件的时间。

你可以编写程序发送电子邮件和短信,也能远程收到通知。如果要自动化的任务需要执行几小时,你一定不希望每过几分钟就回到计算机旁边检查程序的状态。设计好程序可以在任务完成时向手机发送短信,让你在离开计算机时,能专注于做更重要的事情。

实例:向会员发送会费提醒电子邮件

假定你一直“自愿”为“强制自愿俱乐部”记录会员会费。这确实是一项枯燥的工作,包括维护一个电子表格,记录每个月谁交了会费,并用电子邮件提醒那些没交的会员。你不必自己查看电子表格,而是向会费逾期的会员复制、粘贴和发送相同的电子邮件。让我们编写一个脚本,帮你完成任务。

在较高的层面上,下面是程序要完成的任务。

1.从Excel电子表格中读取数据。

2.找出上个月没有交费的所有会员。

3.找到他们的电子邮件地址,向他们发送针对个人的提醒。

这意味着代码需要执行以下操作。

1.用openpyxl模块打开并读取Excel文档的单元格(处理Excel文档参见第13章)。

2.创建一个字典,包含会费逾期的会员。

3.调用smtplib.SMTP()、ehlo()、starttls()和login(),登录SMTP服务器。

4.针对会费逾期的所有会员,调用sendmail()方法,发送针对个人的电子邮件提醒。

打开一个新的文件编辑器窗口,并保存为sendDuesReminders.py。

第1步:打开Excel文件

假定用来记录会费支付的Excel电子表格看起来如图 18-2 所示,放在名为duesRecords.xlsx的文件中。可以从异步社区本书对应页面下载该文件。

该电子表格中包含每个成员的姓名和电子邮件地址。每个月有一列,用来记录会员的付款状态。在成员支付会费后,对应的单元格就记为paid。

该程序必须打开duesRecords.xlsx,通过读取sheet.max_column属性,弄清楚最近一个月的列(可以参考第13章,了解用openpyxl模块访问Excel电子表格文件单元格的更多信息)。在文件编辑器窗口中输入以下代码:

   #! python3
   # sendDuesReminders.py - Sends emails based on payment status in spreadsheet.

   import openpyxl, smtplib, sys

   # Open the spreadsheet and get the latest dues status.
❶ wb  =  openpyxl.load_workbook('duesRecords.xlsx')
❷ sheet = wb.get_sheet_by_name('Sheet1')
❸ lastCol = sheet.max_column
❹ latestMonth = sheet.cell(row=1, column=lastCol).value

   # TODO: Check each member's payment status.

   # TODO: Log in to email account.

   # TODO: Send out reminder emails.

 

 

图18-2 记录会员会费支付的电子表格

导入openpyxl、smtplib和sys模块后,我们打开duesRecords.xlsx文件,将得到的Workbook对象保存在wb中❶。然后取得Sheet1,将得到的Worksheet对象保存在sheet中❷。既然有了Worksheet对象,就可以访问行、列和单元格了。我们将最后一列保存在lastCol中❸,然后用行号1和lastCol来访问应该记录着最近月份的单元格。取得该单元格的值,并将其保存在latestMonth中❹。

第2步:查找所有未支付会费的成员

一旦确定了最近一个月的列数(保存在lastCol中),就可以循环遍历第一行(这是列标题)之后的所有行,看看哪些成员在该月会费的单元格中写着paid。如果会员没有支付会费,就可以从列1和列2中分别抓取成员的姓名和电子邮件地址。这些信息将放入unpaidMembers字典,它记录最近一个月没有交费的所有成员。将以下代码添加到sendDuesReminder.py中:

   #! python3
   # sendDuesReminders.py - Sends emails based on payment status in spreadsheet.

   --snip--

   # Check each member's payment status. 
   unpaidMembers = {}
❶ for r in range(2, sheet.max_row + 1):
     ❷ payment = sheet.cell(row=r, column=lastCol).value
        if payment != 'paid':
          ❸ name = sheet.cell(row=r, column=1).value
          ❹ email = sheet.cell(row=r, column=2).value
          ❺ unpaidMembers[name] = email

这段代码设置了一个空字典unpaidMembers,然后循环遍历第一行之后所有的行❶。对于每一行,最近月份的值保存在payment中❷。如果payment不等于'paid',则第一列的值保存在name中❸,第二列的值保存在email中❹,将name和email添加到unpaidMembers中❺。

第3步:发送定制的电子邮件提醒

得到所有未付费成员的名单后,就可以向他们发送电子邮件提醒了。将下面的代码添加到程序中,但要代入你的真实电子邮件地址和提供商的信息:

#! python3
# sendDuesReminders.py - Sends emails based on payment status in spreadsheet.

--snip--

# Log in to email account.
smtpObj  =  smtplib.SMTP('smtp. 

 

', 587)
smtpObj.ehlo()
smtpObj.starttls()
smtpObj.login('my_email_address@example.com', sys.argv[1])

调用smtplib.SMTP()并传入提供商的域名和端口,来创建一个SMTP对象。调用ehlo()和starttls(),然后调用login(),并传入你的电子邮件地址和sys.argv[1](其中保存着你的口令字符串)。在每次运行程序时,将口令作为命令行参数输入,避免在源代码中保存口令。

程序登录到你的电子邮件账户后,就应该遍历unpaidMembers字典,向未支付会费的会员的电子邮件地址发送针对个人的电子邮件。将以下代码添加到sendDuesReminders.py:

#! python3
# sendDuesReminders.py - Sends emails based on payment status in spreadsheet.

--snip--

# Send out reminder emails.
for name, email in unpaidMembers.items():
❶ body = "Subject: %s dues unpaid.nDear %s,nRecords show that you have not
paid dues for %s. Please make this payment as soon as possible. Thank you!'" %
(latestMonth, name, latestMonth)
❷ print('Sending email to %s...' % email)
❸ sendmailStatus = smtpObj.sendmail('my_email_address@example.com', email, body)

❹ if sendmailStatus != {}:
      print('There was a problem sending email to %s: %s' % (email, sendmailStatus))
smtpObj.quit()

这段代码循环遍历unpaidMembers中的姓名和电子邮件。对于每个没有付费的成员,我们用最新的月份和成员的名称定制了一条消息,并保存在body中❶。输出表示正在向这个会员的电子邮件地址发送电子邮件❷。然后调用sendmail(),向它传入地址和定制的消息❸。返回值保存在sendmailStatus中。

回忆一下,如果SMTP服务器在发送某个电子邮件时报告错误,sendmail()方法将返回一个非空的字典值。for循环的最后部分在❹行检查返回的字典是否非空,如果非空,则输出收件人的电子邮件地址以及返回的字典。

程序完成发送所有电子邮件后,调用quit()方法,与SMTP服务器断开连接。

如果运行该程序,输出结果会像这样:

Sending email to alice@example.com...
Sending email to bob@example.com...
Sending email to eve@example.com...

收件人会收到一封关于他们未支付会费的邮件,看起来就像你手动发送的邮件一样。

操作图像

如果你有一台数码相机,或者只是将照片从手机上传到Facebook,你可能随时会遇到数字图像文件。你可能知道如何使用基本的图形软件,如Microsoft Paint或Paintbrush,甚至用更高级的应用程序,如Adobe Photoshop。但是,如果需要编辑大量的图像,手动编辑可能是漫长、繁琐的工作。

请用Python。pillow是一个第三方Python模块,用于处理图像文件。该模块包含一些函数,可以很容易地裁剪图像、调整图像大小,以及编辑图像的内容。它可以像Microsoft Paint或Adobe Photoshop一样处理图像,有了这种能力,Python可以轻松地自动编辑成千上万的图像。你可以通过运行pip install--user -U pillow==6.0.0来安装pillow。

书籍推荐:

 

  • 办公自动化效率指南
  • 自学Python来摆脱繁忙重复的工作一本就够

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/epubit17/article/details/115747171
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-05-17 22:26:07
  • 阅读 ( 793 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢