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(正则 Time datatime os sys random json pickle模块)

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

  4. python模块 os&amp;sys&amp;subprocess&amp;hashlib模块

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

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

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

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

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

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

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

  8. Python基础之datetime、sys模块

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

  9. python基础之序列化 time random os

    序列化与反序列化 json  pickle 1.什么是序列化与反序列化? 序列化就是将内存中的数据结构转成一种中间格式储存到硬盘或者基于网络传输 反序列化是网络,硬盘将被序列化的对象重新读到内存 2. ...

随机推荐

  1. atitit.闭包的概念与理解attilax总结v2 qb18.doc

    atitit.闭包的概念与理解attilax总结v2 qb18.doc 1.1. 闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数.1 2. #---- ...

  2. 生成Kindle可读的mobi和PDF电子书

    购买kindle之后,自然欣喜万分,不来自于工具本身,而来自于发现自己能够静下心来阅读长篇和复杂的文字了,可喜可贺.更重要的是,kindle减轻了我眼睛的莫大的压力.但马上就出现几个问题: 不是所有的 ...

  3. 用python+selenium抓取知乎今日最热和本月最热的前三个问题及每个问题的首个回答并保存至html文件

    抓取知乎今日最热和本月最热的前三个问题及每个问题的首个回答,保存至html文件,该html文件的文件名应该是20160228_zhihu_today_hot.html,也就是日期+zhihu_toda ...

  4. BP算法笔记

  5. 关于HTTP的几种

    301.404.200.304等HTTP状态,代表什么意思? 如果某项请求发送到您的服务器要求显示您网站上的某个网页(例如,用户通过浏览器访问您的网页或 Googlebot 抓取网页时),服务器将会返 ...

  6. Windows共享内存示例

    共享内存主要是通过映射机制实现的. Windows 下进程的地址空间在逻辑上是相互隔离的,但在物理上却是重叠的.所谓的重叠是指同一块内存区域可能被多个进程同时使用.当调用 CreateFileMapp ...

  7. Legolas工业自动化平台入门(三)交互事件响应动作

    在上一篇Legolas工业自动化平台入门(二)数据响应动作 一文中,我们介绍了"动作"相关内容,了解到"动作"分为多种,各种动作的添加方式相同,但是应用方式各自 ...

  8. Lua笔记(1)

    今天开始学习Lua,下面把一些重点记下来: 单行注释-- ,多行注释 --[[  .......  --]] Lua中false和nil表示条件判断的假,其余的,包括空字符串,0,都表示真. Lua没 ...

  9. leetcode 238 Product of Array Except Self

    这题看似简单,不过两个要求很有意思: 1.不准用除法:最开始我想到的做法是全部乘起来,一项项除,可是中间要是有个0,这做法死得很惨. 2.空间复杂度O(1):题目说明了返回的那个数组不算进复杂度分析里 ...

  10. iphone编程,使用代码结束程序

    (ios 4环境) 1.使用代码可以结束自己只有一种方式,而且apple不建议这样用,就是调用exit()函数.在2.0以前uiapplication类中有一个方法可以调用,但是现在已经没有了,而且如 ...