os、sys、序列化模块

一、os模块

OS:Operation System (操作系统)
os模块是与操作系统交互的一个接口
os

函数名使用方法
getcwd()返回当前工作目录
chdir(path)改变工作目录
listdir(path=’.’)列举指定目录中的文件名(’.‘表示当前目录,’…'表示上一级目录)
mkdir(path)创建单层目录,如该目录已存在抛出异常
makedirs(path)递归创建多层目录,如该目录已存在抛出异常,注意:'E:\a\b’和’E:\a\c’并不会冲突
remove(path)删除文件
rmdir(path)删除单层目录,如该目录非空则抛出异常
removedirs(path)递归删除目录,从子目录到父目录逐层尝试删除,遇到目录非空则抛出异常
rename(old, new)将文件old重命名为new
system(command)运行系统的shell命令
walk(top)遍历top路径以下所有的子目录,返回一个三元组:(路径, [包含目录], [包含文件])
--------以下是支持路径操作中常用到的一些定义,支持所有平台
os.curdir指代当前目录(’.’)
os.pardir指代上一级目录(’…’)
os.sep输出操作系统特定的路径分隔符(Win下为’\’,Linux下为’/’)
os.linesep当前平台使用的行终止符(Win下为’\r\n’,Linux下为’\n’)
os.name指代当前使用的操作系统(包括:‘posix’, ‘nt’, ‘mac’, ‘os2’, ‘ce’, ‘java’)

os.path

函数名使用方法
basename(path)去掉目录路径,单独返回文件名
dirname(path)去掉文件名,单独返回目录路径
join(path1[, path2[, …]])将path1, path2各部分组合成一个路径名
split(path)分割文件名与路径,返回(f_path, f_name)元组。如果完全使用目录,它也会将最后一个目录作为文件名分离,且不会判断文件或者目录是否存在
splitext(path)分离文件名与扩展名,返回(f_name, f_extension)元组
getsize(file)返回指定文件的尺寸,单位是字节
getatime(file)返回指定文件最近的访问时间(浮点型秒数,可用time模块的gmtime()或localtime()函数换算)
getctime(file)返回指定文件的创建时间(浮点型秒数,可用time模块的gmtime()或localtime()函数换算)
getmtime(file)返回指定文件最新的修改时间(浮点型秒数,可用time模块的gmtime()或localtime()函数换算)
-------以下为函数返回 True 或 False
exists(path)判断指定路径(目录或文件)是否存在
isabs(path)判断指定路径是否为绝对路径
isdir(path)判断指定路径是否存在且是一个目录
isfile(path)判断指定路径是否存在且是一个文件
islink(path)判断指定路径是否存在且是一个符号链接
ismount(path)判断指定路径是否存在且是一个挂载点
samefile(path1, paht2)判断path1和path2两个路径是否指向同一个文件

注意:os.stat(‘path/filename’) 获取文件/目录信息 的结构说明
stat结构

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模块的属性

os.sep    输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep    输出当前平台使用的行终止符,win下为"\r\n",Linux下为"\n"
os.pathsep    输出用于分割文件路径的字符串 win下为;,Linux下为:
os.name    输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
二、sys模块

sys模块是与python解释器交互的一个接口

sys.argv 命令行参数List,第一个元素是程序本身路径
sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1)
sys.version 获取Python解释程序的版本信息
sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform 返回操作系统平台名称

sys.agrv 或许可以用来部署项目

import sys

ret = sys.argv
user_name = ret[1]
user_pwd = ret[2]
if user_name == 'jacky' and user_pwd == 'jacky123':
    print('log in successful!')
else:
    print('log on failed!')
    sys.exit()  # 直接退出程序

# 进入到这里表示成功
print('hello jacky!')

直接运行带argv的程序会报错
在这里插入图片描述
在命令行运行时可以加入参数
在这里插入图片描述
异常处理和status

import sys
try:
    sys.exit(1)
except SystemExit as e:
    print(e)
三、序列化模块

序列化:将原本的字典、列表等内容转换成一个字符串的过程就叫做序列化
序列化的目的

  1. 以某种存储形式使自定义对象持久化。
  2. 将对象从一个地方传递到另一个地方。
  3. 使程序更具维护性。
json

json模块提供了四个功能:dumps、loads、dump、load
loadsdumps

import json
my_dic = {'name': 'jacky', 'age': 20}
str_my_dic = json.dumps(my_dic)  # 序列化,将一个字典转换成一个字符串
print(type(str_my_dic), str_my_dic)  # <class 'str'> {"name": "jacky", "age": 20}
# 注意,json转换完的字符串类型的字典中的字符串是由""表示的

my_dic2 = json.loads(str_my_dic)  # 反序列化:将一个字符串格式的字典转换成一个字典
print(type(my_dic2), my_dic2)  # <class 'dict'> {'name': 'jacky', 'age': 20}

loaddump

import json
f = open('json_file', 'w', encoding='utf-8')
my_dic = {'name': 'jacky', 'age': 20}
json.dump(my_dic, f)  # dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件
f.close()

f = open('json_file', 'r', encoding='utf-8')
my_dic_loaded = json.load(f)  # load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回
f.close()
print(type(my_dic_loaded), my_dic_loaded)  # <class 'dict'> {'name': 'jacky', 'age': 20}

在这里插入图片描述
ensure_ascii关键字参数

import json
f = open('file', 'w')
json.dump({'name': '小杰'}, f)
ret = json.dumps({'name': '小杰'})
f.write(ret+'\n')

json.dump({'name': '小城'}, f, ensure_ascii=False)  # 返回值可以包含非ascii码
ret = json.dumps({'name': '小城'}, ensure_ascii=False)
f.write(ret+'\n')
f.close()

在这里插入图片描述
在这里插入图片描述
其他参数说明

Serialize obj to a JSON formatted str.(字符串表示的json对象)
Skipkeys:默认值是False,如果dict的keys内的数据不是python的基本类型(str,unicode,int,long,float,bool,None),设置为False时,就会报TypeError的错误。此时设置成True,则会跳过这类key
ensure_ascii:,当它为True的时候,所有非ASCII码字符显示为\uXXXX序列,只需在dump时将ensure_ascii设置为False即可,此时存入json的中文即可正常显示。)
If check_circular is false, then the circular reference check for container types will be skipped and a circular reference will result in an OverflowError (or worse).
If allow_nan is false, then it will be a ValueError to serialize out of range float values (nan, inf, -inf) in strict compliance of the JSON specification, instead of using the JavaScript equivalents (NaN, Infinity, -Infinity).
indent:应该是一个非负的整型,如果是0就是顶格分行显示,如果为空就是一行最紧凑显示,否则会换行且按照indent的数值显示前面的空白分行显示,这样打印出来的json数据也叫pretty-printed json
separators:分隔符,实际上是(item_separator, dict_separator)的一个元组,默认的就是(‘,’,’:’);这表示dictionary内keys之间用“,”隔开,而KEY和value之间用“:”隔开。
default(obj) is a function that should return a serializable version of obj or raise TypeError. The default simply raises TypeError.
sort_keys:将数据根据keys的值进行排序。
To use a custom JSONEncoder subclass (e.g. one that overrides the .default() method to serialize additional types), specify it with the cls kwarg; otherwise JSONEncoder is used.

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)

# output
{
  "age":16,
  "sex":"male",
  "username":[
    "李华",
    "二愣子"
  ]
}
pickle

pickle模块提供了四个功能:dumps、loads、dump(序列化存)、load(不仅可以序列化字典、列表… 可以把python中任意的数据类型序列化

import pickle
my_dic = {'name': 'jacky', 'age': 20}
str_dict = pickle.dumps(my_dic)
print(str_dict)  # b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x05\x00\x00\x00jackyq\x02X\x03\x00\x00\x00ageq\x03K\x14u.'

my_dic2 = pickle.loads(str_dict)
print(my_dic2)  # {'name': 'jacky', 'age': 20}

import time
struct_time = time.localtime(2000000000)
print(struct_time)  # time.struct_time(tm_year=2033, tm_mon=5, tm_mday=18, tm_hour=11, tm_min=33, tm_sec=20, tm_wday=2, tm_yday=138, tm_isdst=0)

# 使用pickle.dump()导入python任何东西到文件时,习惯文件.pkl后缀,并且用wb模式写
f = open('pickle_file.pkl', 'wb')
pickle.dump(struct_time, f)
f.close()

f = open('pickle_file.pkl', 'rb')
my_struct_time = pickle.load(f)
print(my_struct_time.tm_year)  # 2033
shelve 提供python的持久化操作

https://www.cnblogs.com/ipython-201806/p/9964565.html

序列化模块总结:
使用场合:数据存储、在网络上传输的时候

从数据类型 --> 字符串的过程 序列化
从字符串 --> 数据类型的过程 反序列化

json *****
pickle ****
shelve ***

json
1. 数字 字符串 列表 字典 元组
2. 通用的序列化格式
3. 只有很少的一部分数据类型能够通过json转化成字符串

pickle
1. 所有的python中的数据类型都可以转化成字符串形式
2. pickle序列化的内容只有python能理解
3. 且部分反序列化依赖python代码
4.
shelve
1. 序列化句柄
2. 使用句柄直接操作,非常方便

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值