- 内容提要
- 作者简介
- 技术评审者简介
- 致谢
- 译者序 会编程的人不一样
- 前言
- 本书的读者对象
- 编码规范
- 什么是编程
- 本书简介
- 下载和安装 Python
- 启动 IDLE
- 如何寻求帮助
- 聪明地提出编程问题
- 小结
- 第一部分 Python 编程基础
- 第1章 Python 基础
- 第2章 控制流
- 第3章 函数
- 第4章 列表
- 第5章 字典和结构化数据
- 第6章 字符串操作
- 第二部分 自动化任务
- 第7章 模式匹配与正则表达式
- 第8章 读写文件
- 第9章 组织文件
- 第10章 调试
- 第11章 从 Web 抓取信息
- 第12章 处理 Excel 电子表格
- 第13章 处理 PDF 和 Word 文档
- 第14章 处理 CSV 文件和 JSON 数据
- 第15章 保持时间、计划任务和启动程序
- 第16章 发送电子邮件和短信
- 第17章 操作图像
- 第18章 用 GUI 自动化控制键盘和鼠标
- 附录A 安装第三方模块
- 附录B 运行程序
- 附录C 习题答案
12.6 项目:更新一个电子表格
这个项目需要编写一个程序,更新产品销售电子表格中的单元格。程序将遍历这个电子表格,找到特定类型的产品,并更新它们的价格。请从http://nostarch.com/ automatestuff/下载这个电子表格。图12-3展示了这个电子表格。
图12-3 产品销售的电子表格
每一行代表一次单独的销售。列分别是销售产品的类型(A)、产品每磅的价格(B)、销售的磅数(C),以及这次销售的总收入。TOTAL列设置为Excel公式,将每磅的成本乘以销售的磅数,并将结果取整到分。有了这个公式,如果列B或C发生变化,TOTAL列中的单元格将自动更新。
现在假设Garlic、Celery和Lemons的价格输入的不正确。这让你面对一项无聊的任务:遍历这个电子表格中的几千行,更新所有garlic、celery和lemon行中每磅的价格。你不能简单地对价格查找替换,因为可能有其他的产品价格一样,你不希望错误地“更正”。对于几千行数据,手工操作可能要几小时。但你可以编写程序,几秒钟内完成这个任务。
你的程序做下面的事情:
· 循环遍历所有行。
· 如果该行是Garlic、Celery或Lemons,更新价格。
这意味着代码需要做下面的事情:
· 打开电子表格文件。
· 针对每一行,检查列A的值是不是Celery、Garlic或Lemon。
· 如果是,更新列B中的价格。
· 将该电子表格保存为一个新文件(这样就不会丢失原来的电子表格,以防万一)。
第1步:利用更新信息建立数据结构
需要更新的价格如下:
Celery 1.19
Garlic 3.07
Lemon 1.27
你可以像这样编写代码:
if produceName == 'Celery': cellObj = 1.19 if produceName == 'Garlic': cellObj = 3.07 if produceName == 'Lemon': cellObj = 1.27
这样硬编码产品和更新的价格有点不优雅。如果你需要用不同的价格,或针对不同的产品,再次更新这个电子表格,就必须修改很多代码。每次修改代码,都有引入缺陷的风险。
更灵活的解决方案,是将正确的价格信息保存在字典中,在编写代码时,利用这个数据结构。在一个新的文件编辑器窗口中,输入以下代码:
#! python3 # updateProduce.py - Corrects costs in produce sales spreadsheet. import openpyxl wb = openpyxl.load_workbook('produceSales.xlsx') sheet = wb.get_sheet_by_name('Sheet') # The produce types and their updated prices PRICE_UPDATES = {'Garlic': 3.07, 'Celery': 1.19, 'Lemon': 1.27} # TODO: Loop through the rows and update the prices.
将它保存为updateProduce.py。如果需要再次更新这个电子表格,只需要更新PRICE_UPDATES字典,不用修改其他代码。
第2步:检查所有行,更新不正确的价格
程序的下一部分将循环遍历电子表格中的所有行。将下面代码添加到updateProduce.py的末尾:
#! python3 # updateProduce.py - Corrects costs in produce sales spreadsheet. --snip-- # Loop through the rows and update the prices. ❶ for rowNum in range(2, sheet.get_highest_row()): # skip the first row ❷ produceName = sheet.cell(row=rowNum, column=1).value ❸ if produceName in PRICE_UPDATES: sheet.cell(row=rowNum, column=2).value = PRICE_UPDATES[produceName] ❹ wb.save('updatedProduceSales.xlsx')
我们从第二行开始循环遍历,因为第1行是标题❶。第1列的单元格(即列A)将保存在变量produceName中❷。如果produceName的值是PRICE_ UPDATES字典中的一个键❸,你就知道,这行的价格必须修改。正确的价格是PRICE_UPDATES[produceName]。
请注意,使用PRICE_UPDATES让代码变得多么干净。只需要一条if语句,而不是像if produceName == 'Garlic'这样的代码,就能够更新所有类型的产品。因为代码没有硬编码产品名称,而是使用PRICE_UPDATES字典,在for循环中更新价格,所以如果产品销售电子表格需要进一步修改,你只需要修改PRICE_UPDATES字典,不用改其他代码。
在遍历整个电子表格并进行修改后,代码将Workbook对象保存到updatedProduceSales. xlsx❹。它没有覆写原来的电子表格,以防万一程序有缺陷,将电子表格改错。在确认修改的电子表格正确后,你可以删除原来的电子表格。
你可以从http://nostarch.com/automatestuff/下载这个程序的完整源代码。
第3步:类似程序的思想
因为许多办公室职员一直在使用Excel电子表格,所以能够自动编辑和写入Excel文件的程序,将非常有用。这样的程序可以完成下列任务:
· 从一个电子表格读取数据,写入其他电子表格的某些部分。
· 从网站、文本文件或剪贴板读取数据,将它写入电子表格。
· 自动清理电子表格中的数据。例如,可以利用正则表达式,读取多种格式的电话号码,将它们转换成单一的标准格式。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论