事情是这样的,我是一个追求完美的人,特别喜欢锦上添花,去年在学习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() 要随时记得

  要注意休息、多喝热水

最新文章

  1. OpenSSL - 利用OpenSSL自签证书和CA颁发证书
  2. 深入理解java虚拟机(4)---类加载机制
  3. HDU 3951 (博弈) Coin Game
  4. [iOS基础控件 - 6.7] 微博展示 使用代码自定义TableCell(动态尺寸)
  5. 数据结构录 之 BST的高级应用。
  6. js动态设置输入框字体/颜色
  7. 同步 VS 异步
  8. jsp想js,action传值
  9. 《Effective C#》读书笔记-1.C# 语言习惯-2.使用运行时常量(readonly)而不是编译时常量(const)
  10. 笔记:XML-解析文档
  11. Mybatis 系列10
  12. Spring Boot 2.x 快速入门(下)HelloWorld示例详解
  13. 如何快速扫描C段(网站快照、后台识别/登录、目录扫描)
  14. Javascript中表达式和语句的区别
  15. 调皮的程序员:Linux之父雕刻在Linux内核中的故事
  16. HttpClient之可恨的Expect(C# http 请求卡住的解决办法)
  17. eclipse的svn插件添加代理访问svn
  18. 51nod 1483 化学变换 | 二进制 暴力
  19. Redis(一)-- 基础
  20. 获取指定订阅下所有Azure ARM虚拟机配置(CPU核数,内存大小,磁盘信息)的使用情况

热门文章

  1. SpringCloud学习笔记(11)----Spring Cloud Netflix之Hystrix断路器的使用
  2. css 禁止文本被选中复制代码
  3. dedecms简略标题(副标题)使用方法教程
  4. C语言基础 (1) 操作系统介绍,linux入门
  5. NodeJS学习笔记 (9)网络服务-https(ok)
  6. 紫书 例题8-18 UVa 1442 (扫描法)
  7. Mysql学习总结(23)——MySQL统计函数和分组查询
  8. CSDN 轻松周赛赛题:能否被8整除
  9. HDU——T 1068 Girls and Boys
  10. HDU 3108 Ant Trip