事情是这样的,我是一个追求完美的人,特别喜欢锦上添花,去年在学习python的时候做了一个作业:多重剪贴板,今天大概是吃饱了,查了一下自己的头发以后,我觉得可以挑战一下自己,所以决定为那个小程序添加一些功能,下面有描述,原以为这个过程会十分顺利,然而 shelve 君早已看穿了一切。。。
为“多重剪贴板”增加功能:
增加一个 delete <keyword> 命令行参数,它将从Shelve值中删除一个关键字。假如不提供关键字,将删除所有的关键字
我是这样做的:先去瞧了书上的shelve模块,发现没有删除的介绍。又想起shelve储存值的方式与字典类似又看了书,结果没有,只能上网搜索了,说起来,我好像一直就是宁愿在书上翻来翻去而不去新平台查阅东西。。。最后当然查出来了发现是这样删除的:
>>> import shelve >>> mcbShelve=shelve.open('mcb') >>> del mcbShelve['cats'] #删除键值对 >>>mcbShelve.close() #记得关闭
知道了操作的方法,就成功了一半,你以为我马上就要去写了吗,不,我没有,它不是和字典类似吗,我马上又去试了字典的删除键值对方式,结果是的,get!
果然,出现了问题,命令行运行失败代码如下
1 #! python3 2 # mcb.pyw - Save and load pieces of text to the clipboard. 3 # Usage: py.exe mcb.pyw save <keyword> - Saves clipboard to keyword 4 # py.exe mcb.pyw <keyword> - Loads keyword to clipboard 5 # py.exe mcb.pyw list - Loads all keywords to clipboard 6 # py.exe mcb.pyw delete <keyword> - 删除键名为<keyword>的键值对 7 # py.exe mcb.pyw delete - 删除全部的键值对 8 9 import shelve ,pyperclip,sys 10 11 mcbShelf=shelve.open('mcb') 12 #Save clipboard content 13 if len(sys.argv)==3: 14 if sys.argv[1].lower()=='save': 15 mcbShelf[sys.argv[2]]=pyperclip.paste() 16 else: 17 del mcbShelf[sys.argv[1]] 18 elif len(sys.argv)==2: 19 #List keywords and load content 20 if sys.argv[1].lower()=='list': 21 pyperclip.copy(str(list(mcbShelf.keys()))) 22 elif sys.argv[1].lower()=='delete': 23 for i in mcbShelve.keys():#通过遍历删除所有的键值对 24 del mcbShelve[i] 25 elif sys.argv[1] in mcbShelf: 26 pyperclip.copy(mcbShelf[sys.argv[1]]) 27 else: 28 print('请阅读说明') 29 30 mcbShelf.close()
使用命令行调用没反应,不会输出“请阅读说明”,明明昨天还好好的,我就只不过改了if逻辑,然后就死了,我以为是pyw格式的问题,改回来还是不行,只好重新新建了了两个文件 mcb-Bate.py 、 mcb-Bate.bat 把原来代码复制进去就好了,这下能运行了但是发现23行的代码中的变量拼错了 mcbShelve 应该是 mcbShelf 修改之后,运行:
mcb-bate delete
这次运行:
1 mcb-bate list
返回的是空
但在shell里检查:
1 >>> for items in mcbShelf.items(): 2 items 3 4 5 ('Job', {'name': 'Job', 'sex': 'boy'}) 6 ('Karry', {'name': 'Karry', 'sex': 'gril'}) 7 >>>
还是无效啊
经过严谨的思考和测试,我发现命令行运行和shell运行出来的结果会不相同代码如下:
1 #! python3 2 # mcb.pyw - Save and load pieces of text to the clipboard. 3 # Usage: py.exe mcb.pyw save <keyword> - Saves clipboard to keyword 4 # py.exe mcb.pyw <keyword> - Loads keyword to clipboard 5 # py.exe mcb.pyw list - Loads all keywords to clipboard 6 # py.exe mcb.pyw delete <keyword> - 删除键名为<keyword>的键值对 7 # py.exe mcb.pyw delete - 删除全部的键值对 8 9 import shelve ,pyperclip,sys 10 11 12 #定义方法来遍历shelve值 13 def traversing(parameter): 14 print('当前shelve值:') 15 for item in parameter.items(): 16 print(item) 17 18 mcbShelf=shelve.open('mcb') 19 #Save clipboard content 20 print(len(sys.argv)) 21 22 if len(sys.argv)==3: 23 if sys.argv[1].lower()=='save': 24 mcbShelf[sys.argv[2]]=pyperclip.paste() 25 else: 26 del mcbShelf[sys.argv[2]] 27 elif len(sys.argv)==2: 28 #List keywords and load content 29 if sys.argv[1].lower()=='list': 30 pyperclip.copy(str(list(mcbShelf.keys()))) 31 elif sys.argv[1].lower()=='delete': 32 for i in mcbShelf.keys():#通过遍历删除所有的键值对 33 del mcbShelf[i] 34 elif sys.argv[1] in mcbShelf: 35 pyperclip.copy(mcbShelf[sys.argv[1]]) 36 else: 37 print('请阅读说明') 38 traversing(mcbShelf) 39 mcbShelf.close()
命令行运行结果:
shell运行结果
聪明的分割线
截好第一个图我明白了,之所以不同,是因为我用的命令行参数,而 F5 不会向shell传参数,本以为 shelve 君就会这样放过我,然而:
1 >>> mcbShelf=shelve.open('mcb') #这是在shell中,mcb是Shelve值名称 2 >>> list(mcbShelf.values()) 3 [{'name': 'Job'}]
看到这个结果,我胖虎无话可说。。。
吃堑长智的结果:
要养成严密的逻辑, close() 要随时记得
要注意休息、多喝热水