Python编程快速上手——让繁琐工作自动化(第八章)
8.9.1 扩展多重剪贴板
题目
- 扩展本章中的多重剪贴板程序,增加一个delete < keyword > 命令行参数,它将从shelf中删除一个关键字。
- 然后添加一个delete命令行参数,它将删除所有关键字。
分析
- 使用del mcbShelf[sys.argv[2]](对单个) mcbShelf.clear()(对群体)
代码
import shelve, pyperclip, sys
mcbShelf = shelve.open('mcb')
# sys.argv从程序外部获取参数的渠道,人机交互
# sys.argv[1]等于yyy.pyw XXX中的"XXX"
if len(sys.argv) == 3:
if sys.argv[1].lower() == 'save':
#将剪贴板的值放在“键”为sys.argv[2]的“值”上
mcbShelf[sys.argv[2]] = pyperclip.paste()
elif sys.argv[1].lower() == 'delete':
#删除shelf值中的某个“键”
if sys.argv[2] in mcbShelf:
del mcbShelf[sys.argv[2]]
elif len(sys.argv) == 2:
#查看当前插入了哪些“键”
if sys.argv[1].lower() == 'list':
pyperclip.copy(str(list(mcbShelf.keys())))
#将对应“键”的值复制到剪贴板上
elif sys.argv[1] in mcbShelf:
pyperclip.copy(mcbShelf[sys.argv[1]])
#将shelf值全部删除 #例 .\mcb.pyw delete
elif sys.argv[1].lower() == 'delete':
mcbShelf.clear()
mcbShelf.close()
测试
- 讲真,这个好测试,但不好表达。就不写了
8.9.2 疯狂填词
题目
- 创建个疯狂填词(Mad Libs)程序,它将读入文本文件,并让用户在该文本文件中出现ADJECTIVE、NOUN、ADVERB或VERB等单词的地方,加上他们自己的文本。例如,一个文本文件可能看起来像这样:
The ADJECTIVE panda walked to the NOUN and then VERB. A nearby NOUN was unaffected by these events.
程序将找到这些出现的单词,并提示用户取代它们。
Enter an adjective:
silly
Enter a noun:
chandelier
Enter a verb:
screamed
Enter a noun:
pickup truck
以下的文本文件将被创建:
The silly panda walked to the chandelier and then screamed. A nearby pickup truck was unaffected by these events.
结果应该打印到屏幕上,并保存为一个新的文本文件。
分析
- 读取A文件
- 正则寻找特殊单词
- input()特殊单词替换内容
- 运用正则的正则替换对应的值
- 将数据写入到B文件
代码
import re
#读取892.txt内容
textA = open(r'.\892A.txt')
madLibsA = textA.read()
#构造正则,用findall方法得到搜索列表
strRegexs = re.compile(r'ADJECTIVE|NOUN|ADVERB|VERB')
listRegex = strRegexs.findall(madLibsA)
#使用sub方法,替换字符串madLibsB的特殊值
madLibsB = madLibsA
for i in listRegex:
if i[0] == 'A' :
tmp = input("Enter an " + i.lower() + ':\n')
else:
tmp = input("Enter a " + i.lower() + ':\n')
strRegex = re.compile(r'('+ i +')')
madLibsB = strRegex.sub(tmp, madLibsB, count=1)
#将数据写入B文件
textB = open(r'.\892B.txt', 'w')
textB.write(madLibsB)
textB.close()
测试
- 测测测,为了节目效果,额外加了个print(madLibsB)
8.9.3 正则表达式查找
题目
- 编写一个程序,打开文件夹中所有的 .txt 文件,查找匹配用户提供的正则表达式的所有行。结果应该打印到屏幕上。
分析
- 找到所有文件目录
- 找到所有txt文件
- 输入正则
- 打印结果
代码
import re, os
listDir = os.listdir()
listDirTxt = []
#for+if 进阶 初体验
listDirTxt = [i for i in listDir if '.txt' in i]
print(listDirTxt)
# for i in listDir:
# if '.txt' in i:
# listDirTxt.append(i)
aim = input("请输入您的正则表达式:\n")
strRegex = re.compile(r'('+ aim +')')
for i in listDirTxt:
txtFile = open('.\\'+ i +'')
txt = txtFile.readlines()
if strRegex.search(str(txt)):
print(txt)
测试
- 使用了8.2的数据来测试,可以跳回去看B文件的写入内容
拓展
- 加深了对Regex的使用,有些技巧在之前写的 Excel 上使用过;
Python的excel应用
txtFile = open(’.\\’+ i +’’)
strRegex = re.compile(r’(’+ aim +’)’)
- 对sub()方法有特殊的需求,就查看了sub()方法里的其他参数,找到了sub()里有个参数count计数;
他人对sub()的介绍
AAA.sub(repl, string[, count = 0])
repl : 替换的字符串,也可为一个函数。
string : 要被查找替换的原始字符串。
count : 模式匹配后替换的最大次数,默认表示替换所有。
- 之前搞过几次for + if的组合形式,搞了就忘,搞了就忘,搞了就忘。多用才能记得牢,要向更高一阶逼近。
他人对三元表达的介绍1 他人对三元表达的介绍2