python基础之 序列化,os,sys,random,hashlib_dengyu7227的博客-程序员宅基地

技术标签: python  shell  json  

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('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运维相关
#和文件夹相关
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('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'
注释: 
1、文件打开方式一定要是二进制方式,既打开文件时使用b模式,否则Hash计算是基于文本的那将得到错误的文件Hash(网上看到有人说遇到Python的Hash计算错误在大多是由于这个原因造成的)。
2、对于MD5如果需要16位(bytes)的值那么调用对象的digest()而hexdigest()默认是32位(bytes),同理Sha1的digest()和hexdigest()分别产生20位(bytes)和40位(bytes)的hash值

 

 

 

返回系列

转载于:https://www.cnblogs.com/p0st/p/10559462.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/dengyu7227/article/details/101587985

智能推荐

ServiceMesh企业应用分析_zzp12的博客-程序员宅基地

服务网格+云原生的核心价值从业务开发团队,运维团队,基础设施团队的接耦,接耦后提高了各团队的工作效率和质量。耦合情况举例:业务团队内部耦合:对于巨大的单体应用,业务团队内部不同的人和子团队之间在开发和部署上存在相互依赖。通过微服务化,接耦。业务团队和运维团队的耦合:业务扩容,需由运维团队提供数据,业务团队设计方案(每个服务扩容多少,数据层怎么扩容,缓存层)。扩容的方案,要借助服务发现机制或修改配置文件,由运维团队执行。服务治理相关的内容,因为属于服务化SDK的配置,SDK配置

zlib库下载、编译、示例、文档_kanguolaikanguolaik的博客-程序员宅基地_zlibaraly官网

一、boost库下载:官网下载地址:http://www.zlib.net/ 二、boost库编译:程序员宅基地上的编译:http://blog.csdn.net/kanguolaikanguolaik/article/details/9203981三、boost库简单示例:官网示例代码:http://

Android Path进阶之Path路径实现QQ拖拽气泡效果_Android Coder的博客-程序员宅基地_path 气泡

先上效果图先将这个过程分状态(阶段): 1.静止状态,小球的默认状态,由红色的气泡和中间的文本组成; 2.连接状态(拖拽半径短),拖拽过程中由随着手指一定的气泡和中间不断缩小的小气泡组成; 3.分离状态(拖拽半径长),中间的小气泡消失,连接的中间线也消失; 4.回弹或隐藏状态,当从连接状态松手,移动的气泡会回弹到中心,从分离状态松手,移动的气泡爆炸,...

Python pickle模块(1) -- > 多次dump问题_李彦辛SPERL的博客-程序员宅基地_pickle.dump 追加数据 覆盖原有数据

大家在调用pickle模块的时候应该有遇到这个问题,当你多次pickle.dump 对象,写入到文件中,然后再pickle.load的时候,却只会load出来一个第一个数据,有木有?eg: 测试pickle模块的时候发现dump进去数据可说倒不出来。。。 但你发现这个文件数据变大了,肯定是吃进去了。那我们用winhex瞅瞅: 肚子都大了,咋生不出来呢? solution:import o

爆牙齿的世界杯日记(忆)。_weixin_34124939的博客-程序员宅基地

开幕前的下午,为了酝酿情绪,打开《意大利之夏》现场视频,多年再没响过的经典旋律瞬间就把我拉入状态之中,而当南尼尼的花拳,充满力量挥起之时,我眼泪一下就滚了出来。1990年,我的第一届世界杯,意大利之夏是那么的完美,占据了我之后所有世界杯记忆的60%+吧。1986年,马拉多纳横扫全球的时候,我8岁尚不知足球为何物。一年后我9岁,三年级,参加完少年宫四川围...

python怎么处理中英文符号网名_python 过滤中文、英文标点特殊符号_weixin_39843698的博客-程序员宅基地

在工作中经常遇到很多特殊的标点符号,像中文标点符号,英文标点符号。英文的标点符号比较容易过滤,而过滤中文的标点符号较麻烦。下面是从邮件中过滤特殊符号的方式供参考。下面是一封垃圾邮件的过滤实例:"想做/ 兼_职/学生_/ 的 、加,我Q: 1 5. 8 0. !!?? 8 6 。0. 2。 3 有,惊,喜,哦"邮件中的“!?。、”都是中文的,而“/.”是英文的下面是过滤方式:#-*-...

随便推点

MATLAB中squeeze函数的作用_what_lei的博客-程序员宅基地_squeeze matlab

squeeze:  除去size为1的维度B = squeeze(A)描述:B = squeeze(A),B与A有相同元素,但所有只有一行或一列的维度(a singleton dimension)被去除掉了。二维阵列不受squeeze影响; 例如:src=rand(4,1,3)产生一个均匀分布的阵列,共3页,每页4行1列,经过squeeze后,1列的那个维度就没有了,只剩下

python 读excel每行替换_Python读写改Excel的方法_weixin_39602560的博客-程序员宅基地

一.读Excel表(xlrd模块)import xlrd #导入模块data = xlrd.open_workbook('./report/result.xls') #打开exceltable = data.sheets()[0] #读sheet1# table = data.sheet_by_name(u'Sheet1') #或通过sheet名获...

修改MFC程序的图标_mfc修改应用程序图标_sanqiuai的博客-程序员宅基地

1.在项目的资源文件夹下,找到vs的默认的ico图标文件并移除掉(也可以不移除 强迫症)2.右键项目文件夹,点击添加,选择资源,选中Icon,点击导入,将自己的ico图标添加到项目中3.在以上操作之后,点击后缀名为rc的文件,会在该文件中找到我们添加进去的ico图标资源和之前残留的默认ico资源(仍然删除掉它)可以右键该文件,选择属性,修改该文件的ID为我们想要的名字4.此时编译会出错dwad是默认的ico图标的id名,在MFC工程的代码中使用了这个ID,但现在ID已经被删除了,找到这

5.29ajax传值为乱码的问题_kuaidi8的博客-程序员宅基地

======================================================注:重要!程序员如何有效的放松身心!下班后做什么?======================================================5.29ajax传值为乱码的问题最简单的方法就是在web.config中加入就能解决url乱码的问题。因为

Mari 毛孔处理_喜欢挤牙膏的博客-程序员宅基地

调整paint buffer:开启Edge Mask:可以看到,这里效果并不好:切换到Flat显示:添加AO程序纹理层:

推荐文章

热门文章

相关标签