标签:包含 last 增加 comm pyc 操作 sam 程序 char
random模块:选择功能只能对序列类型进行迭代
>>> import random #随机生成小数 >>> random.random()#random.random(),只能生成0-1之间的小数 0.13410910544892163 >>> random.random(1) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: random() takes no arguments (1 given) >>> random.uniform(1,2)#按照指定的区间进行生成小数 1.7771163573646869 >>> random.randrange(1,3)#random.randrange(),随机取指定区间的值,顾头不顾尾,可以加步长 2 #随机生成整数 >>> random.randrange(1,3) 1 >>> random.randrange(1,10,2) 7 >>> random.randint(1,2)#与random.randrange()的区别可以取大于等于1,小于等于2的数 2 >>> random.randint(1,2) 1 #随机选择一个数,参数不能为字典, >>> random.choice([1,‘23‘,[4,5]])#随机选择一个数 ‘23‘ >>> random.sample([1,‘23‘,[4,5]],3)#随机返回sample函数中第二个参数,
指定的个数,必须指定随机选择的个数,返回的list [[4, 5], ‘23‘, 1] #打乱列表顺序,shuffle 该函数没有返回值, >>> item = [1,2,3,4,5] >>> random.shuffle(item) >>> a = random.shuffle(item) >>> print(a,type(a)) None <class ‘NoneType‘> >>> random.shuffle(item) >>> item [5, 2, 1, 3, 4] >>> random.shuffle(item) >>> item [4, 1, 3, 5, 2]
实现验证码:
import random var = "" for i in range(6): num = str(random.randint(1,9)) strs = chr(random.randint(65,90)) chocie = random.choice([num,strs]) # var = var + chocie var = "".join([var,chocie]) print(var,repr(var))
序列化
比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给? 现在我们能想到的方法就是存在文件里,然后另一个python程序再从文件里读出来。 但是我们都知道,对于文件来说是没有字典这个概念的,所以我们只能将数据转换成字典放到文件中。 你一定会问,将字典转换成一个字符串很简单,就是str(dic)就可以办到了,为什么我们还要学习序列化模块呢? 没错序列化的过程就是从dic 变成str(dic)的过程。现在你可以通过str(dic),将一个名为dic的字典转换成一个字符串, 但是你要怎么把一个字符串转换成字典呢? 聪明的你肯定想到了eval(),如果我们将一个字符串类型的字典str_dic传给eval,就会得到一个返回的字典类型了。 eval()函数十分强大,但是eval是做什么的?e官方demo解释为:将字符串str当成有效的表达式来求值并返回计算结果。 BUT!强大的函数有代价。安全性是其最大的缺点。 想象一下,如果我们从文件中读出的不是一个数据结构,而是一句"删除文件"类似的破坏性语句,那么后果实在不堪设设想。 而使用eval就要担这个风险。 所以,我们并不推荐用eval方法来进行反序列化操作(将str转换成python中的数据结构)
序列化的目的
>>> import json >>> dic = {‘k1‘:‘v1‘,‘k2‘:‘v2‘,‘k3‘:‘v3‘} >>> str_dic = json.dumps(dic) >>> print(type(str_dic),str_dic) <class ‘str‘> {"k1": "v1", "k2": "v2", "k3": "v3"} >>> dic2 = json.loads(str_dic) >>> print(type(dic2),dic2) <class ‘dict‘> {‘k1‘: ‘v1‘, ‘k2‘: ‘v2‘, ‘k3‘: ‘v3‘} >>> t1 = (1,2,3) >>> str_dic = json.dumps(t1)#如果将元组序列化后,反序列化不能变成元组 >>> print(type(str_dic),str_dic) <class ‘str‘> [1, 2, 3] >>> dic2 = json.loads(str_dic) >>> print(type(dic2),dic2) <class ‘list‘> [1, 2, 3] >>> t2= [1,2,3] >>> str_dic = json.dumps(t2) >>> print(type(str_dic),str_dic) <class ‘str‘> [1, 2, 3] >>> dic2 = json.loads(str_dic) >>> print(type(dic2),dic2) <class ‘list‘> [1, 2, 3]
>>> list_s = [1,[‘a‘,‘b‘,‘c‘],3,{‘k1‘:‘v1‘,‘k2‘:‘v2‘}]#可以处理多类型
>>> str_dic = json.dumps(list_s)
>>> print(type(str_dic),str_dic)
<class ‘str‘> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}]
>>> s = {1,3,4,5}#序列化列表时报错
>>> str_dic = json.dumps(s)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python36\lib\json\__init__.py", line 231, in dumps
return _default_encoder.encode(obj)
File "C:\Python36\lib\json\encoder.py", line 199, in encode
chunks = self.iterencode(o, _one_shot=True)
File "C:\Python36\lib\json\encoder.py", line 257, in iterencode
return _iterencode(o, 0)
File "C:\Python36\lib\json\encoder.py", line 180, in default
o.__class__.__name__)
TypeError: Object of type ‘set‘ is not JSON serializable
load &dump
load & dump 只是一次性的存读。
f = open("text.txt", ‘a‘) dic = {"k1":1} tu = (123,[1,2,3],{"1":23}) json.dump(dic, f) json.dump(tu, f) f.close() f = open("text.txt") dic2 = json.load(f) dic3 = json.load(f) f.close() print(dic2) print(dic3)
pickle:
dic = {‘k1‘:‘v1‘,‘k2‘:‘v2‘,‘k3‘:‘v3‘}# str_pic = pickle.dumps(dic) #序列化到内存(字符串格式保存) # print(str_pic,type(str_pic)) dic2 = pickle.loads(str_pic) print(dic2,type(dic2))
# str_time = time.localtime(1000000000) # f = open("times.txt","wb") # pickle.dump(str_time,f) # f.close() f = open("times.txt","rb") str_time = pickle.load(f) print(str_time.tm_year)
既然pickle如此强大,为什么还要学json呢?json是一种所有的语言都可以识别的数据结构。
但是如果我们用pickle进行序列化,其他语言就不能读懂这是什么了~
shelve:
引用shelve后,使用shelve打开文件shelve.open(),
f1 = shelve.open("shelve_file.txt") # print(f1["key"]) f1["key"] = "this was not here before" print(type(f1["key"]))#<class ‘str‘> f1.close() f1 = shelve.open("shelve_file.txt") existing = f1["key"] #首先需要将读取的内容赋值给一个变量 f1.close() print(existing) f = shelve.open("shelve.txt",flag="r")#设置flag= “r”,代表只读,不支持多人同时写,但是可以同时读 tiems = f["key"] f.close() print(tiems) #正常情况下shelve打开的文件句柄感知不到值的修改,设置writeback = True就可以保存修改内容了 import shelve # f2 = shelve.open(‘shelve_file‘, writeback=True) # print(f2[‘key‘]) # f2[‘key‘][‘new_value‘] = {1,2,3} # f2.close() # import shelve f = shelve.open(‘shelve_file‘,flag=‘r‘) print(f[‘key‘]) f.close()
f = shelve.open("shelve.txt",writeback=True) ts = f["key"] f.close() print(ts)
writeback方式有优点也有缺点。优点是减少了我们出错的概率,并且让对象的持久化对用户更加的透明了;但这种方式并不是所有的情况下都需要,首先,使用writeback以后,shelf在open()的时候会增加额外的内存消耗,并且当DB在close()的时候会将缓存中的每一个对象都写入到DB,这也会带来额外的等待时间。因为shelve没有办法知道缓存中哪些对象修改了,哪些对象没有修改,因此所有的对象都会被写入。
os模块:
os模块时与操作系统交互的一个接口
os.getcwd():获取当前路径
os.chdir("文件名"):移动文件路径
os.makedirs("name1/name2")递归生成多级目录,已存在报错,
os.removedirs("name"):
os.removedirs(r"C:\Users\yanghu\PycharmProjects\s8\day21\name1\name2\name3")
os.mkdir("name1")#不可以重复创建
os.rmdir("name1")
os.listdir(‘dirname‘) 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove() 删除一个文件
os.rename("oldname","newname") 重命名文件/目录
os.stat(‘path/filename‘) 获取文件/目录信息
os.stat(‘path/filename‘) 获取文件/目录信息
os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep 输出当前平台使用的行终止符,win下为"\r\n",Linux下为"\n"
os.system("bash command")运行shell命令,直接显示
os.popen("文件"):
# os.system(‘dir‘) #没有返回值,且直接执行代码,把结果直接输出 # ret = os.popen(‘dir‘) #如果有结果就将结果返回回来 # print(ret.read()) #ret.read()获取结果
os.path
os.path.abspath(path) 返回path规范化的绝对路径 os.path.split(path) 将path分割成目录和文件名二元组返回 os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素 os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。
即os.path.split(path)的第二个元素
os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path) 如果path是绝对路径,返回True
os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False
os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False
os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.getatime(path) 返回path所指向的文件或者目录的最后访问时间
os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
os.path.getsize(path) 返回path的大小
sys模块 与Python解释器的一个接口
sys.argv 命令行参数List,第一个元素是程序本身路径
sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1)
sys.version 获取Python解释程序的版本信息
sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform 返回操作系统平台名称
【Python基础 day21】random & 序列化 & 异常处理 & Os
标签:包含 last 增加 comm pyc 操作 sam 程序 char
原文地址:http://www.cnblogs.com/huyangblog/p/7841090.html