码迷,mamicode.com
首页 > 编程语言 > 详细

【Python基础 day21】random & 序列化 & 异常处理 & Os

时间:2017-11-22 22:02:11      阅读:285      评论:0      收藏:0      [点我收藏+]

标签:包含   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中的数据结构)
View Code

序列化的目的

1、以某种存储形式使自定义对象持久化
2、将对象从一个地方传递到另一个地方。
3、使程序更具维护性。
json提供了四个功能:dumps、dump、loads、load
json:序列化集合时报错,序列化中的内容只能包含:字典 列表 数字 字符串,如果是元组——自动转成列表的样子
>>> 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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!