1.序列化

什么是序列化?
  是将对象的状态信息转化为可以存储或传输的过程。

   简单来说序列化就是一种用来处理对象流的机制。所谓对象流也就是将对象的
   内容进行流化,流的概念这里不用多说(就是I/O)。我们可以对流化后的对象进行读写
   操作,也可将流化后的对象传输于网络之间(注:要想将对象传输于网络必须进行流化)!
   在对对象流进行读写操作时会引发一些问题,而序列化机制正是用来解决这些问题的!

为什么要需要序列化?
  1.将对象的状态保存到存储中,方便可以在以后重新创建出副本
  2.在网络上进行传输(只有字符串类型的能转成bytes,json.dumps可以将对象序列化成str,在转成bytes)
定义:
  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个缩进

json示例

2.pickle

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(文件+字典操作)

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]) #获取所有的值

 序列化总结

什么是序列化?把其他类型转化成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('')) --->E:\oldboy\python 20\456
          print(os.path.join(os.path.expanduser('~'),'','456.txt')) --->/var/adm/123/456.txt         判断一个路径是否为绝对路径
          import os
          os.path.isabs(os.path.join(os.path.expanduser('~adm'),'','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运维相关

#和文件夹相关
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)是创建时间(详细信息参见平台的文档)。 

os模块常用

 6.sys模块

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]这两种方法去掉换行。

sys模块应用

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()

os,sys模块例子

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)

os.walk()

"""
打印最常用的十条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 等价于修改字典的值
'''

打印最常用的十条linux命令

7.hashlib 

Python的hashlib提供了常见的摘要算法,如MD5,SHA1,SHA256,SHA512等等。
什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。 基本应用
import hashlib #导入hashlib模块
md5 = hashlib.md5() #选择一个要加密的方式
md5.update(''.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'
注释: 
1、文件打开方式一定要是二进制方式,既打开文件时使用b模式,否则Hash计算是基于文本的那将得到错误的文件Hash(网上看到有人说遇到Python的Hash计算错误在大多是由于这个原因造成的)。
2、对于MD5如果需要16位(bytes)的值那么调用对象的digest()而hexdigest()默认是32位(bytes),同理Sha1的digest()和hexdigest()分别产生20位(bytes)和40位(bytes)的hash值

返回系列

python基础之 序列化,os,sys,random,hashlib的更多相关文章

  1. python基础 (序列化,os,sys,random,hashlib)

    1.序列化 定义: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.简单地说,JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然 ...

  2. 序列化,os,sys,hashlib,collections

    序列化,os,sys,hashlib,collections 1.序列化 什么是序列化?序列化的本质就是将一种数据结构(如字典,列表)等转换成一个特殊的序列(字符串或者bytes)的过程就叫做序列化. ...

  3. Python模块02/序列化/os模块/sys模块/haslib加密/collections

    Python模块02/序列化/os模块/sys模块/haslib加密/collections 内容大纲 1.序列化 2.os模块 3.sys模块 4.haslib加密 5.collections 1. ...

  4. Python(正则 Time datatime os sys random json pickle模块)

    正则表达式: import re #导入模块名 p = re.compile(-]代表匹配0至9的任意一个数字, 所以这里的意思是对传进来的字符串进行匹配,如果这个字符串的开头第一个字符是数字,就代表 ...

  5. python模块 os&sys&subprocess&hashlib模块

    os模块 # os模块可根据带不带path分为两类 # 不带path print(os.getcwd()) # 得到当前工作目录 print(os.name) # 指定你正在使用的操作系统,windo ...

  6. python基础之模块之sys模块

    sys模块的功能 sys是python中较为常用的一个模块,他提供了对python脚本运行时的环境的操作. sys功能: 1  sys.argv     #将python脚本运行时的脚本名以及参数作为 ...

  7. 小白的Python之路 day5 os,sys模块详解

    os模块详解 1.作用: 提供对操作系统调用的接口 2.常用方法: os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径os.chdir("dirname" ...

  8. 【python基础语法】OS模块处理文件绝对路径,内置的异常类型、捕获、处理(第9天课堂笔记)

    import os """ 通过文件的路径去打开文件 相对路径:相对当前的工作路径去定位文件位置 .:代表当前路径 ..:代表上一级路径(父级路径) 绝对路径:相对于电脑 ...

  9. Python基础之datetime、sys模块

    1.datetime模块 1)datetime.datetime.now(),返回各当前时间.日期类型. datetime.datetime.now(),返回当前日期. import datetime ...

随机推荐

  1. 12、Grafan 4.3升级到Grafana 5.0

    Upgrading Grafana 升级Grafana We recommend everyone to upgrade Grafana often to stay up to date with t ...

  2. javascript数组去重 String字符串去掉两端空格 javascript Array二分法排序 比较 javascript 求和

    通过原形添加方法: ==================数组去重(对象去重法)======================= Array.prototype.unique=function(){ va ...

  3. Java Mybatis实现主从同步

    import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; public class DynamicDat ...

  4. Redis实战 - 1.String和计数器

    在.NET Core 项目中操练String 使用 StackExchange.Redis 访问 Redis static void Main(string[] args) { using (Conn ...

  5. BZOJ4827 [Hnoi2017]礼物 多项式 FFT

    原文链接http://www.cnblogs.com/zhouzhendong/p/8823962.html 题目传送门 - BZOJ4827 题意 有两个长为$n$的序列$x$和$y$,序列$x,y ...

  6. Mapreduce概述和WordCount程序

    一.Mapreduce概述 Mapreduce是分布式程序编程框架,也是分布式计算框架,它简化了开发! Mapreduce将用户编写的业务逻辑代码和自带默认组合整合成一个完整的分布式运算程序,并发的运 ...

  7. 如何写一个Js上传图片插件。

    项目里面需要一个上传图片的插件,找了半天没有找到满意的,算了 不找了,自己写一个吧,顺便复习一下js方面的知识.完成之后效果还不错,当然还要继续优化,源码在最后. 介绍一种常见的js插件的写法 ; ( ...

  8. Git Sever搭建与相关错误处理

    搭建 安装git: sudo apt-get install git 创建一个git用户,用来运行git服务:(用自己的用户也可以,其实) sudo adduser git 创建证书登录: 收集所有需 ...

  9. spring集成rabbitmq

    https://www.cnblogs.com/nizuimeiabc1/p/9608763.html

  10. js 类数组对象arguments

    function Add() { for (var i = 0; i < arguments.length; i++) { console.log(arguments[i]); } } Add( ...