存储和获取代码文件的细节小记___Python学习笔记12
开始接触如何存储,并且是长久储存然后再获取的若干细节。我追随一连串的代码,来体验体验这python记录储存代码和获取代码数据的若干细节。第一个代码是建立一个简单的数据库,刚刚知道,一个数据库就是给一个类或者一个对象建立一个列表,也就是为db建立一个列表。
一、在>>>标识后编译代码,在编译器执行
文件存储首先自然是要有一个路径目录,你在这个目录下建立你的python文件。但python文件你在交互式的编译器中是无法保存并存储下来的,你得另有一个文件编辑器,我用的是atom,从github中下载的。而且,你使用交互式编译器,它也一定在某个路径之中。所以,学习python,总是在这两个工具之间的交互使用。好在atom中使用F5很容易切换到power shell。不切换也没有关系,桌面上有图标也很容易启动。我启动的编译器和编辑器atom,都是在PS C:\Users\zzx21> cd py文件夹下。但最先下载python平台的时候,是在zzx21之下,但py文件都放在py文件夹下,好像无法越级,只有使用cd再下一级。在这一级下,使用python指令,python编译器就出现了。
你在编译器交互式地编译代码,一边编,一边执行。以下从1到20的编码就既有码,又有执行的结果。编码在第15行print开始执行,17-20就是执行结果。
PS C:\Users\zzx21\py文件夹> python
Python 3.9.2 (tags/v3.9.2:1a79785, Feb 19 2021, 13:44:55) [MSC v.1928 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
1>>> #记录
2>>> bob = {'name': 'Bob Smith', 'age': 42, 'pay':30000, 'job': 'dev'}
3>>> sue = {'name': 'Sue Jones', 'age': 45, 'pay':40000, 'job': 'hdw'}
4>>> tom = {'name': 'Tom', 'age': 50, 'pay':0, 'job': None}
5>>> joe = {'name': 'Joe zhou', 'age': 55, 'pay': 60000, 'job': 'tut'}
6>>> #建立数据库
7>>> db = {}
8>>> db['bob'] = bob
9>>> db['sue'] = sue
10>>> db['tom'] = tom
11>>> db['joe'] = joe
12>>>
13>>> if __name__ == '__main__': #脚本运行入口的标识
14... for key in db:
15... print(key, '=>', db[key])
16...
17bob => {'name': 'Bob Smith', 'age': 42, 'pay': 30000, 'job': 'dev'}
18sue => {'name': 'Sue Jones', 'age': 45, 'pay': 40000, 'job': 'hdw'}
19tom => {'name': 'Tom', 'age': 50, 'pay': 0, 'job': None}
20joe => {'name': 'Joe zhou', 'age': 55, 'pay': 60000, 'job': 'tut'}
二、退出编译器在路径目录下执行atom中的代码文件 initdata.py
编译器没有存储,但有复制,不过把编译器的代码复制到atom中也很麻烦,它连那些标识箭头>>>之类的符号都带进去了,在atom中删除还没有找到快捷的办法。所以,我的感觉,这复制还不如就在atom中直接做文件。如果要执行,就切换到编译器路径之下执行。以下是切换后,执行一个python文件的结果。
先退出编译器,用quit()指令。
>>> quit()
PS C:\Users\zzx21\py文件夹> initdata.py
结果出现:
initdata.py : 无法将“initdata.py”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
所在位置 行:1 字符: 1
+ initdata.py
+ ~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (initdata.py:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
PS C:\Users\zzx21\py文件夹> python initdata.py
C:\Users\zzx21\python.exe: can't open file 'C:\Users\zzx21\py鏂囦欢澶筡initdata.py': [Errno 2] No such file or directory
体验出错误两点:
1.文件名写错,无法执行。检查发现文件名写错,initdata.py写成了intidata.py,所以不执行.这大概说明代码的检查很重要,许多错误是细节性的错误。
2.文件名更改正确,但没有python的引导符,依然不执行。教材告知也许可不用python引导,但实际不是这样,没有引导符python不执行,用py缩写做引导也不行。
Suggestion [3,General]: 找不到命令 initdata.py,但它确实存在于当前位置。默认情况下,Windows PowerShell 不会从当前位置加载命令。如果信任此命令,请改为键入“.\initdata.py”。有关详细信息,请参阅 "get-help about_Command_Precedence"。
PS C:\Users\zzx21\py文件夹> \initdata.py
\initdata.py : 无法将“\initdata.py”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
所在位置 行:1 字符: 1
+ \initdata.py
+ ~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (\initdata.py:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
三、路径目录不可超级,隔级文件不执行
目录文件路径需要在直接的级别之下,如果越级,文件也不执行。
C:\Users\zzx21\py文件夹>python dump_db_pickle.py
python: can't open file 'C:\Users\zzx21\py鏂囦欢澶筡dump_db_pickle.py': [Errno 2] No such file or directory
代码文件不在zzx21之下,而在py文件夹下,不执行。导引至py文件夹,文件执行。
C:\Users\zzx21\py文件夹>python dump_db_pickle.py
bob => {'name': 'Bob Smith', 'age': 42, 'pay': 30000, 'job': 'dev'}
sue => {'name': 'Sue Jones', 'age': 45, 'pay': 40000, 'job': 'hdw'}
tom => {'name': 'Tom', 'age': 50, 'pay': 0, 'job': None}
joe => {'name': 'Joe zhou', 'age': 55, 'pay': 60000, 'job': 'tut'}
Sue Jones
四、若要获取持久代码文件,通用方法是引入pickle模块和shelve模块
(一)导入pickle模块,获取保存的持久数据
建立导入pickle的代码文件make-db-pickle.py
from initdata import db
import pickle
dbfile = open('people-pickle', 'wb')
pickle.dump(db, dbfile)
dbfile.close()
建立打开文件传给pickle的代码文件dump_db_pickle.py
import pickle
dbfile = open('people-pickle', 'rb')
db = pickle.load(dbfile)
for key in db:
print(key, '=> ', db[key])
print(db['sue']['name'])
在py文件夹下执行这个文件,将两个文件排列如下获得执行结果。
C:\Users\zzx21\py文件夹>python update_db_pickle.py
C:\Users\zzx21\py文件夹>python dump_db_pickle.py
bob => {'name': 'Bob Smith', 'age': 42, 'pay': 30000, 'job': 'dev'}
sue => {'name': 'Sue Jones', 'age': 45, 'pay': 44000.0, 'job': 'hdw'}
tom => {'name': 'Tom Tom', 'age': 50, 'pay': 0, 'job': None}
joe => {'name': 'Joe zhou', 'age': 55, 'pay': 60000, 'job': 'tut'}
Sue Jones
(二)导入shelve模块,获取保存的持久数据
几乎完全相同的执行步骤。
在py文件夹下建立导入shelve的代码文件make_db_shelve.py。
from initdata import sue, bob
import shelve
db = shelve.open('people-shelve')
db['sue'] = sue
db['bob'] = bob
db.close()
建立打开文件传给shelve的代码文件dump_db_shelve.py
import shelve
db = shelve.open('people-shelve')
for key in db:
print(key, '=>\n ', db[key])
print(db['sue']['name'])
db.close()
在py文件夹下执行这个文件,将两个文件排列如下获得执行结果。
C:\Users\zzx21\py文件夹>python make_db_shelve.py
C:\Users\zzx21\py文件夹>python dump_db_shelve.py
sue =>
{'name': 'Sue Jones', 'age': 45, 'pay': 40000, 'job': 'hdw'}
bob =>
{'name': 'Bob Smith', 'age': 42, 'pay': 30000, 'job': 'dev'}
Sue Jones