一、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)
三、序列化模块
序列化:将原本的字典、列表等内容转换成一个字符串的过程就叫做序列化。
序列化的目的
- 以某种存储形式使自定义对象持久化。
- 将对象从一个地方传递到另一个地方。
- 使程序更具维护性。
json
json模块提供了四个功能:dumps、loads、dump、load
loads和dumps
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}
load和dump
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. 使用句柄直接操作,非常方便