1.序列化html
定义:
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。简单地说,JSON 能够将 JavaScript 对象中表示的一组数据转换为字符串,而后就
能够在函数之间轻松地传递这个字符串,或者在异步应用程序中将字符串从 Web 客户机传递给服务器端程序。这个字符串看起来有点儿古怪,可是JavaScript很容易
解释它,并且 JSON 能够表示比"名称 / 值对"更复杂的结构。
特色:
json:JavaScript 对象表示法(JavaScript Object Notation)。
json:是存储和交换文本信息的语法。相似 XML。
json:比 XML 更小、更快,更易解析。
json是通用语言,没有环境区分
python中的json
1.导入模块:import json
2.将字典对象转成字符串
dic = {'1':2}
s = json.dumps(dic)
print(repr(s),typr(s))
3.将字典转成字符串
str1 = "{\"1\":2}"
s = json.loads(str1)
print(s,type(s)
4.将字典转成字符串写入文件
json.dump({'1':4},open('a'),'w',encoding='utf-8')
5.将文件中的字符串转成字典
json.load(open('a','r',encoding='utf-8'))
拓展:快速转化json字符串为json对象(linux系统中) $ echo '{"links":[{"name":"Google","url":"http://www.google.com"},{"name":"Baidu","url":"http://www.baidu.com"}]}' | python -m json.tool
注意:json支持的数据类型较少,甚至连集合都不支持
import json data = {'username':['李华','二愣子'],'sex':'male','age':16} json_dic2 = json.dumps(data,sort_keys=True,indent=2,separators=(',',':'),ensure_ascii=False) print(json_dic2) #separators=(',',':') 将,转成: #ensure_ascii=False 不使用ascii对中文编码 #sort_keys=True 按照字母的ascii的编码大小排序 #indent=2 空2个缩进
2.picklenode
pickle是python内部独有的序列化方法,只是在python语言中有效,不通用,可是在python中的序列化速度,由于其读取二进制流
import pickle #导入模块
print(pickle.dumps({'1':4})) #将对象转换成相似二进制的东西(字节)
print(pickle.loads(b'\x80\x03}q\x00X\x01\x00\x00\x001q\x01K\x04s.')) #将二进制(字节)转成字典
pickle.dump({'2':4},open('b','wb')) #将字典转成字节写入文件
d = pickle.load(open('b','rb')) #将文件中的字节转换成字典
print(d)
总结:
loads json里的将字符串转换成字典 pickle 将字节转换成字典
dumps json里的将字典转换成字符串 pickle 将字典转换成字节
load json里的将文件中的字符串转换成字典 pickle 将文件中的字节转换成字典
dump json里的将字典转换字符串写入到文件中,pickle 将字典转换成字节写入到文件中
注意:在文件中的字符串类型的字典的键值必须是双引号{"1":2}
支持的数据类型较多,甚至支持类的实例化的对象和一些复杂的数据类型!
3.shelve(文件+字典操做)python
import shelve f = shelve.open('c',writeback=True) #建立文件 # writeback = True 回写 f['name'] = 'tmac' ['age'] = 18 print(f['name'],f['age']) f['name'] = ['kobe','admin'] print(f['name']) for i in f: print(i) #获取到全部的键
print(i[item]) #获取全部的值
序列化总结linux
什么是序列化?把其余类型转化成str/bytes的过程就是序列化 反序列化:把str/bytes转化成其余类型
Json pickle shelve Json 全部语言通用 能处理的数据类型有限(list\dict\数字\str) Pickle python 语言专用 能处理几乎全部的数据类型 场景用途:文件存储网络传输
4.random面试
import random print(random.random()) #获取到的0-1之间的小数?将小数的前两位怎么取值那? 面试题,能体现出基础 print(random.randint(1,10)) #获取a-b之间的随机数(b包含a和b) print(random.randrange(1,3)) #获取1-3之间的随机数,可是不包含3 print(random.randrange(1,21,2)) #获取1-21之间的随机奇数,可是不包含21 print(random.choice([1,2,3,4,5,6,7])) #从可迭代对象里面随机 print(random.choice("sdfwefw")) #从可迭代对象里面随机选(没有索引的就会报错,好比字典,集合等无序的可迭代对象) print(random.choices("sdfwefw",k=2)) #从可迭代对象里面随机选则两个,可是有重复(没有索引的就会报错,好比字典,集合等无序的可迭代对象) print(random.sample("sdfwefw",k=2)) #从可迭代对象里面选择两个不一样的 print(random.uniform(10, 20)) #生成小数 print(round(a,2)) #保留两位小数 print('%.2f'%a) #########简陋版验证码########### import random U=(chr(random.randrange(65,91))) #获取65-91之间的ascii码值 大写 l=(chr(random.randrange(97,123))) #获取97-123之间的ascii码值 小写 n= random.randrange(0,10) #获取两个数字 n2 =random.randrange(0,10) print(U,l,n,n2,sep="")
5.os模块算法
python标准库中的os模块对操做系统的api进行了封装,而且使用同一个api接口来管理不一样的操做系统的相同功能。
os模块包含与操做系统的系统环境,系统变量,系统文件,用户数据库以及权限进行交换的函数,主要用来和操做系统作交互
python标准库中的os模块对操做系统的api进行了封装,而且使用同一个api接口来管理不一样的操做系统的相同功能。 os模块包含与操做系统的系统环境,系统变量,系统文件,用户数据库以及权限进行交换的函数 2.1 os模块 os模块中包含两个比较经常使用的函数 os.getcwd() #获取当前绝对路径 os.listdir() #列出当前目录下的文件和文件夹 2.2 os.path详解(用来对文件和文件路径进行管理) 拆分路径 os.path.split() #返回一个二元组,包含文件路径和文件名 os.path.dirname() #返回文件的路径 os.path.basename() #返回文件名 os.path.splitext() #返回一个去处扩展名部分和扩展名的二元组 import os path = "/root/p0st/h/error.log" print(os.path.split(path)) --->('/root/p0st/h', 'error.log') print(os.path.dirname(path)) --->/root/p0st/h print(os.path.basename(path)) --->error.log print(os.path.splitext(path)) --->('/root/p0st/h/error', '.log') 构建路径 os.path.expanduser('~')#返回当前输入用户的家目录,必须得加~或~adm等指定用户 os.path.abspath() #返回文件或路径的绝对路径 os.path.path() #根据不一样的操做系统,使用不一样的路径分隔符拼接路径 import os print(os.path.expanduser('~adm')) --->/var/adm print(os.path.abspath('456')) --->E:\oldboy\python 20\456 print(os.path.join(os.path.expanduser('~'),'123','456.txt')) --->/var/adm/123/456.txt 判断一个路径是否为绝对路径 import os os.path.isabs(os.path.join(os.path.expanduser('~adm'),'123','456.txt')) --->True 查看当前文件名字须要使用__file__这个特殊变量:当前代码所在的源文件 import os path = os.path.abspath(__file__) print(path) --->/var/adm/123/456.py print(os.path.abspath(os.path.join(os.path.dirname(path),os.path.pardir))) -->/var 获取文件属性和判断文件类型 import os path= os.path.abspath(__file__) print(os.path.getatime(path)) #获取当前文件的访问时间 print(os.path.getctime(path)) #获取当前文件的建立时间 print(os.path.getmtime(path)) #获取当前文件的修改时间 print(os.path.getsize(path)) #获取当前文件的大小 print(os.path.exists(path)) #判断当前路径是否存在 print(os.path.isfile(path)) #参数所指的路径存在,而且是一个文件 print(os.path.isdir(path)) #参数所所指的路径存在,而且是一个目录 print(os.path.islink(path)) #。。。。。。。而且是一个连接 print(os.path.ismount(path)) #。。。。。。。而且是一个挂载点 使用os模块管理文件和目录 os.remove(path)/unlink(path): 删除path所指的文件 os.rmdir(path)/removedirs(path) : 删除path所指向的目录,该文件夹必须为空,不然报错。 os.mkdir(path):建立一个文件夹 os.rename('olddir','newdir'):修改一个文件夹的名字 使用os模块来修改和判断文件权限 os.chmod(filename,0777) #修改文件权限 os.access(filename,os.R_OK)#判断文件权限---> os.R_OK:是否可读, os.W_OK:是否可写, os.X_OK:是否可执行
#和文件夹相关 os.makedirs('dirname1/dirname2') 可生成多层递归目录 os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 os.mkdir('dirname') 生成单级目录;至关于shell中mkdir dirname os.rmdir('dirname') 删除单级空目录,若目录不为空则没法删除,报错;至关于shell中rmdir dirname os.listdir('dirname') 列出指定目录下的全部文件和子目录,包括隐藏文件,并以列表方式打印 # 和文件相关 os.remove() 删除一个文件 os.rename("oldname","newname") 重命名文件/目录 os.stat('path/filename') 获取文件/目录信息 # 和操做系统差别相关 os.sep 输出操做系统特定的路径分隔符,win下为"\\",Linux下为"/" os.linesep 输出当前平台使用的行终止符,win下为"\r\n",Linux下为"\n" os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为: os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix' # 和执行系统命令相关 os.system("bash command") 运行shell命令,直接显示 os.popen("bash command).read() 运行shell命令,获取执行结果 os.environ 获取系统环境变量 #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的大小<br></em> #其余应用 os.getcwd() 获取当前工做目录,即当前python脚本工做的目录路径 os.chdir("dirname") 改变当前脚本工做目录;至关于shell下cd os.curdir 返回当前目录: ('.') os.pardir 获取当前目录的父目录字符串名:('..') 注意:os.stat('path/filename') 获取文件/目录信息 的结构说明 stat 结构: st_mode: inode 保护模式 st_ino: inode 节点号。 st_dev: inode 驻留的设备。 st_nlink: inode 的连接数。 st_uid: 全部者的用户ID。 st_gid: 全部者的组ID。 st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。 st_atime: 上次访问的时间。 st_mtime: 最后一次修改的时间。 st_ctime: 由操做系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,在其它系统上(如Windows)是建立时间(详细信息参见平台的文档)。
6.sys模块shell
sys模块提供对解释器使用或维护的一些变量的访问,以及与解释器强烈交互的函数。它始终可用
1.基本 print(sys.path) # 添加自定义模块路径和解释器的工做目录 # ****** print(sys.version) # 获取解释的版本号 print(sys.platform) #获取当前操做系统的平台位数 print(sys.exit(1)) #退出并返回1 2.sys.argv sys.argv(): sys.argv:是sys库下面的列表,该列表保存了全部的命令行参数,其中下标为0的元素是执行文件的名字,其他的参数已字符串的形式保存在该列表中 此列表能够从终端接收无数个参数,而存放在列表当中,若是没有第一个参数的话,程序会报错,而没法执行,因此在argv中添加一个空元素,当python json.py test.txt有参数的时候,test.txt就成了argv的第一个元素 在Python标准库sys中有三个文件描述符分别是: stdin(标准输入 0,指的是经过<或者|来传递数据), stdout(标准输出 1), stderr(标准错误 2)。 经过标准输入结合管道,就不须要经过open()函数来打开文件了。 1.使用sys库中的stdin读取内容(linux中的标准输入) windows 建立 tes_sys_stdin.py文件 import sys name = sys.stdin.readline() print (name) linux: 建立 test_sys_stdin.py文件 import sys for line in sys.stdin(): print (line) 执行test_sys_stdin.py文件: cat /etc/passwd | python test_sys_stdin.py python test_sys_stdin.py < /etc/passwd 也能够经过stdin.readlines()函数将标准输入的内容读取到一个列表里面 sys.stdin.readline( )会将标准输入所有获取,包括末尾的'\n',所以用len计算长度时是把换行符'\n'算进去了的,可是input( )获取输入时返回的结果是不包含末尾的换行符'\n'的。 所以若是在平时使用sys.stdin.readline( )获取输入的话,不要忘了去掉末尾的换行符. 能够用strip( )函数(sys.stdin.readline( ).strip('\n'))或sys.stdin.readline( )[:-1]这两种方法去掉换行。
other数据库
""" 经过命令行读取文件名称,若是文件存在,则查看是否能执行,不能的话修改权限为777,若是可执行的话就打印输出文件内容,若是文件不在,则提示文不存在 """ # _*_ encoding:utf-8 _*_ import os import sys sys.argv.append('') file_name = sys.argv[1] def read_file(): if not os.path.isfile(file_name): raise SystemExit(file_name + " 文件不存在") elif os.access(file_name,os.X_OK): with open(file_name) as info: print(info.read()) else: os.chmod(file_name,0777) print("已修改成0777") if __name__ == '__main__': read_file()
import os ''' root 所指的是当前正在遍历的这个文件夹的自己的地址 dirs 是一个 list ,内容是该文件夹中全部的目录的名字(不包括子目录) files 一样是 list , 内容是该文件夹中全部的文件(不包括子目录) topdown --可选,为 True,则优先遍历 top 目录,不然优先遍历 top 的子目录(默认为开启)。若是 topdown 参数为 True,walk 会遍历top文件夹,与top 文件夹中每个子目录。 onerror -- 可选,须要一个 callable 对象,当 walk 须要异常时,会调用。 followlinks -- 可选,若是为 True,则会遍历目录下的快捷方式(linux 下是软链接 symbolic link )实际所指的目录(默认关闭),若是为 False,则优先遍历 top 的子目录。 ''' boot=0 for root, dirs, files in os.walk("E:\oldboy\python 20\day16\code", topdown=False): for name in files: boot +=os.path.getsize(name) print(name, os.path.getsize(name)) print(boot)
""" 打印最经常使用的十条linux命令 """ #_*_ encoding:utf-8 _*_ import os from collections import Counter c = Counter() with open(os.path.expanduser('~/.bash_history')) as cmd_info: for line in cmd_info: cmd = line.strip().split() if cmd: c[cmd[0]]+=1 print(c.most_common(10)) ''' Counter计数器是位了可以方便的统计数字,Counter是dict的子集,所以也可使用字典的方法 此类返回一个以元素为key,以元素的个数为值的字典 c[cmd[0]]+=1 等价于修改字典的值 '''
7.hashlib json
Python的hashlib提供了常见的摘要算法,如MD5,SHA1,SHA256,SHA512等等。 什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它经过一个函数,把任意长度的数据转换为一个长度固定的数据串(一般用16进制的字符串表示)。 基本应用 import hashlib #导入hashlib模块 md5 = hashlib.md5() #选择一个要加密的方式 md5.update('123456'.encode('utf-8')) #将要加密的内容格使用选择后的方法进行加密 print(md5.hexdigest()) #返回加密后的字符串 import hashlib md5 = hashlib.md5('盐'.encode('utf-8')) # 选择加密方式 加盐 md5.update('admin'.encode('utf-8')) #将明文转成字节而后进行加密 print(md5.hexdigest()) #生成密文
使用sha1等加密方式,只须要把上面MD5的名字换掉就ok
注意:在使用hashlib测试的时候,文件名字不能起名为hashlib.py会报错
为何要写encoding('utf-8')那?
由于其源码默认为字符串要为bytes类型,因此要将字符串转为bytes类型的
print('123'.encode("utf-8"))
print(bytes('123',encoding='utf-8'))
print(b'123')
以上三种都是b'123'
注释:
一、文件打开方式必定要是二进制方式,既打开文件时使用b模式,不然Hash计算是基于文本的那将获得错误的文件Hash(网上看到有人说遇到Python的Hash计算错误在大可能是因为这个缘由形成的)。
二、对于MD5若是须要16位(bytes)的值那么调用对象的digest()而hexdigest()默认是32位(bytes),同理Sha1的digest()和hexdigest()分别产生20位(bytes)和40位(bytes)的hash值
返回系列windows