python中常用的内置模块

1. time模块

(1)功能汇总

在Python中,通常有这3种方式来表示时间:

  1. 时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们运行“type(time.time())”,返回的是float类型。通常用于时间间隔的计算

  1. 格式化的时间字符串(Format String)(按照某种格式显示的)例如‘1999-12-06’。通常用于格式化显示时间
符号说明
%y两位数的年份表示(00-99)
%Y四位数的年份表示(000-9999)
%m月份(01-12)
%d月内中的一天(0-31)
%H24小时制小时数(0-23)
%I12小时制小时数(01-12)
%M分钟数(00=59)
%S秒(00-59)
%a本地简化星期名称
%A本地完整星期名称
%b本地简化的月份名称
%B本地完整的月份名称
%c本地相应的日期表示和时间表示
%j年内的一天(001-366)
%p本地A.M.或P.M.的等价符
%U一年中的星期数(00-53)星期天为星期的开始
%w星期(0-6),星期天为星期的开始
%W一年中的星期数(00-53)星期一为星期的开始
%x本地相应的日期表示
%X本地相应的时间表示
%Z当前时区的名称
%%%号本身

  1. 结构化时间(struct_time) :struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天等)
索引(Index)属性(Attribute)值(Values)
0tm_year(年)比如2011
1tm_mon(月)1 - 12
2tm_mday(日)1 - 31
3tm_hour(时)0 - 23
4tm_min(分)0 - 59
5tm_sec(秒)0 - 60
6tm_wday(weekday)0 - 6(0表示周一)
7tm_yday(一年中的第几天)1 - 366
8tm_isdst(是否是夏令时)默认为0

(2)程序解释

  • 3种类型的时间举例
import time
print('--------------时间戳-------------')
time1 = time.time() #时间戳,float类型
time2 = time.time()
diff_time = time2 - time1
print('时间间隔:{0} s'.format(diff_time))

print('--------------时间字符串-------------')
str1 = time.strftime("%Y-%m-%d %X")
print(str1)

print('--------------结构化时间(struct_time) -------------')
loc_time_1 = time.localtime()#本地时区的struct_time
loc_time_2 = time.gmtime() #UTC时区的struct_time
print(loc_time_1)
print(loc_time_2)

输出:

--------------时间戳-------------
时间间隔:4.76837158203125e-07 s
--------------时间字符串-------------
2021-11-13 22:29:37
--------------结构化时间(struct_time) -------------
time.struct_time(tm_year=2021, tm_mon=11, tm_mday=13, tm_hour=22, tm_min=29, tm_sec=37, tm_wday=5, tm_yday=317, tm_isdst=0)
time.struct_time(tm_year=2021, tm_mon=11, tm_mday=13, tm_hour=14, tm_min=29, tm_sec=37, tm_wday=5, tm_yday=317, tm_isdst=0)
  • 3种类型的时间转换

在这里插入图片描述

import time
print('--------------时间戳《==》时间字符串-------------')
t = time.time()
st = time.localtime(t) #时间戳 ---> 结构化时间
ft = time.strftime('%Y/%m/%d %H:%M:%S',st) # 结构化时间 ---> 格式化时间
print(st)
print(ft)

print('--------------结构化时间(struct_time)《==》时间字符串 -------------')
st = time.strftime('%Y/%m/%d %H:%M:%S')
ft = time.strptime(st,'%Y/%m/%d %H:%M:%S') # 时间字符串 ---> 格式化时间
st= time.strftime('%Y/%m/%d %H:%M:%S',ft) # 格式化时间 ---> 时间字符串
print(st)
print(ft)

输出:

--------------时间戳《==》时间字符串-------------
time.struct_time(tm_year=2021, tm_mon=11, tm_mday=13, tm_hour=22, tm_min=45, tm_sec=50, tm_wday=5, tm_yday=317, tm_isdst=0)
2021/11/13 22:45:50
--------------结构化时间(struct_time)==》时间字符串 -------------
2021/11/13 22:45:50
time.struct_time(tm_year=2021, tm_mon=11, tm_mday=13, tm_hour=22, tm_min=45, tm_sec=50, tm_wday=5, tm_yday=317, tm_isdst=-1)

在这里插入图片描述

import time
print('--------------时间戳》》时间字符串-------------')
#time.ctime(时间戳)  如果不传参数,直接返回当前时间的格式化串
time1 = time.time() #时间戳,float类型
str_time = time.ctime(time1)
print(str_time)

print('--------------结构化时间(struct_time)》》时间字符串 -------------')
#time.asctime(结构化时间) 如果不传参数,直接返回当前时间的格式化串
loc_time = time.localtime()#本地时区的struct_time
print(time.asctime(loc_time))

输出:

--------------时间戳》》时间字符串-------------
Sat Nov 13 22:36:19 2021
--------------结构化时间(struct_time)》》时间字符串 -------------
Sat Nov 13 22:36:19 2021

2. datetime模块

(1)功能汇总

datetime模块中包含如下类:

类名功能说明
date日期对象,常用的属性有year, month, day
time时间对象
datetime日期时间对象,常用的属性有hour, minute, second, microsecond
datetime_CAPI日期时间对象C语言接口
timedelta时间间隔,即两个时间点之间的长度
tzinfo时区信息对象

datetime模块中包含的常量:

常量功能说明用法返回值
MAXYEAR返回能表示的最大年份datetime.MAXYEAR9999
MINYEAR返回能表示的最小年份datetime.MINYEAR1

(2)程序解释

import datetime
now_time = datetime.datetime.now()  # 现在的时间
# 只能调整的字段:weeks days hours minutes seconds
print(datetime.datetime.now() + datetime.timedelta(weeks=3)) # 三周后
print(datetime.datetime.now() + datetime.timedelta(weeks=-3)) # 三周前
print(datetime.datetime.now() + datetime.timedelta(days=-3)) # 三天前
print(datetime.datetime.now() + datetime.timedelta(days=3)) # 三天后
print(datetime.datetime.now() + datetime.timedelta(hours=5)) # 5小时后
print(datetime.datetime.now() + datetime.timedelta(hours=-5)) # 5小时前
print(datetime.datetime.now() + datetime.timedelta(minutes=-15)) # 15分钟前
print(datetime.datetime.now() + datetime.timedelta(minutes=15)) # 15分钟后
print(datetime.datetime.now() + datetime.timedelta(seconds=-70)) # 70秒前
print(datetime.datetime.now() + datetime.timedelta(seconds=70)) # 70秒后

current_time = datetime.datetime.now()
# 可直接调整到指定的 年 月 日 时 分 秒 等

print(current_time.replace(year=1977))  # 直接调整到1977年
print(current_time.replace(month=1))  # 直接调整到1月份
print(current_time.replace(year=1989,month=4,day=25))  # 1989-04-25 18:49:05.898601

# 将时间戳转化成时间
print(datetime.date.fromtimestamp(1232132131))  # 2009-01-17

print(datetime.date.today()) #2021-11-13

3. calendar模块

(1)功能汇总

  1. calendar.calendar(year,w=2,l=1,c=6,m=3),返回一个字符串格式的年历。
  • year接收一个年份数字,可以是过去现在或未来,比如我这里打印的是1千年以后的3019年。
  • w表示个位天数相邻两天之间的间隔宽度(字符空格数),默认是2.
  • l表示每一个周占用的行数,默认是1。
  • c表示并排的两个月之间的间隔宽度,默认是6。但是c不小于w。即当c值小于w时,c等于w。
  • m表示并排展示多少个月。默认是3,显示一排3个月,会显示4排。
  1. calendar.prcal(year,w=2,l=1,c=6, m=3)也是打印一年的年历,相当于print(calendar.calendar(year,w,l,c))。
  2. calendar.month(2019, 10, w=0, l=0),打印某一个月的日历。
  3. calendar.timegm(tupletime)接受一个时间元组,返回时间戳,时间元组的值依次表示年、月、日、时、分、秒。
  4. calendar.weekday(year,month,day)返回传入的日期是星期几。
  5. calendar.isleap(year)返回传入的年是不是闰年,是返回True,否则为false。如2020年是闰年。
  6. calendar.leapdays(start, end)返回start,end之间有多少个闰年,左闭右开区间。

(2)程序解释

import calendar

print("month: \n", calendar.month(2019, 10, w=0, l=0))
#print("month: \n", calendar.prmonth(2019, 10, w=0, l=0))

print("monthcalendar: ", calendar.monthcalendar(2019, 11))#2019年11月的日历
print("monthrange: ", calendar.monthrange(2019, 10))#2019年11月日历的范围

输出:

month: 
     October 2019
Mo Tu We Th Fr Sa Su
    1  2  3  4  5  6
 7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

monthcalendar:  [[0, 0, 0, 0, 1, 2, 3], [4, 5, 6, 7, 8, 9, 10], [11, 12, 13, 14, 15, 16, 17], [18, 19, 20, 21, 22, 23, 24], [25, 26, 27, 28, 29, 30, 0]]
monthrange:  (1, 31)

4. sys模块

Python的sys模块提供访问由解释器使用或维护的变量的接口,并提供了一些函数用来和解释器进行交互,操控Python的运行时环境。

(1)功能汇总

方法说明
sys.argv传递给程序的命令行参数列表
sys.path模块的搜索路径;sys.path[0] 表示当前脚本所在目录
sys.exit(n)通过引发SystemExit异常来退出当前程序。n为0表示正常,非零表示异常。
sys.modules已加载的模块的字典
sys.exc_info()获取正在处理的异常的相关信息
sys.builtin_module_names当前解释器所有内置模块的名称
sys.copyright包含解释器版权相关信息的字符串
sys.exec_prefix用于查找特定于当前机器的python库的路径前缀
sys.executablePython解释器可执行文件的绝对路径
sys.float_info包含有关浮点数实现的信息的结构序列
sys.float_repr_style表示浮点数的repr()方法的输出样式的字符串
sys.hash_info包含哈希算法相关信息的结构序列
sys.hexversion对sys.version_info中包含的版本信息进行编码后使用十六进制表示的整数
sys.implementation包含有关Python实现的相关信息
sys.int_info包含有关整形实现的信息的结构序列
sys.maxsize返回字符串、列表、字典和其他内置类型的最大长度
sys.maxunicode返回能够表示的最大Unicode码点的整数值
sys.platform返回平台标识符字符串
sys.prefix返回安装平台无关Python文件的目录
sys.thread_info包含有关线程实现的信息的结构序列
sys.version表示当前解释器版本的字符串
sys.version_info当前解释器版本的命名元组
sys.byteorder本机的字节排序方式,little表示小尾,big表示大尾
sys.api_version返回表示Python解释器的C语言版本API的整数
sys.getsizeof()获取对象占用的内存大小(用字节表示

(2)程序解释

  • sys.argv

传递给程序的命令行参数列表,其中argv[0]是传入的脚本名字,其它为传入的参数名字,且为str类型。

import sys
# filename:sys_test.py
for i in range(len(sys.argv)):
      print('argv{0}: type is {1}, value is {2}'.format(i, type(sys.argv[i]), sys.argv[i]))

然后执行代码python argv_test.py 1 a 2 b。运行结果如下:

argv0: type is <class 'str'>, value is sys_test.py
argv1: type is <class 'str'>, value is 1
argv2: type is <class 'str'>, value is a
argv3: type is <class 'str'>, value is 2
argv4: type is <class 'str'>, value is b
  • sys.path

表示模块的搜索路径,其中sys.path[0]表示脚本当前目录

import sys
print(sys.path[0])

输出:

/home/xxx/workspace/python/python_tutorials
  • sys.getsizeof()

获取对象占用的内存大小(用字节表示)

import sys

for obj in [int(), float(), list(), tuple(), set(), dict(), object]:
    print(str(obj.__class__).ljust(20), sys.getsizeof(obj))

输出:

<class 'int'>        24
<class 'float'>      24
<class 'list'>       56
<class 'tuple'>      40
<class 'set'>        216
<class 'dict'>       232
<class 'type'>       408

5. os模块

os模块是与操作系统交互的一个接口。

(1)功能汇总

方法说明
os.getcwd()获取当前工作目录,Current working directory
os.chdir("dirname")改变当前脚本工作目录;相当于shell下cd
os.curdir返回当前目录: ('.')
os.pardir获取当前目录的父目录字符串名:('..')
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下为"\t\n",Linux下为"\n"
os.pathsep输出用于分割文件路径的字符串 win下为;,Linux下为:
os.name输出字符串指示当前使用平台。win->‘nt’; Linux->‘posix’
os.system("bash command")运行shell命令,直接显示
os.environ获取系统环境变量
os.path.abspath(path)返回path规范化的绝对路径
os.path.split(path)将path分割成目录和文件名二元组返回
os.path.join()路径拼接
os.path.dirname(path)返回path的目录。其实就是os.path.split(path)的第一个元素
os.path.basename(path)返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
os.path.exists(path)path是否存在,可以是文件或者文件夹路径
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(文件或文件夹)的大小,字节

(2)程序解释

  • 进入空间操作
import os
print(os.getcwd()) #当前工作目录
os.chdir('..') #返回上一层目录
print(os.curdir) #当前目录
print(os.getcwd())#当前工作目录
print(os.pardir)#当前目录的上一层

输出:

/home/liqiang/workspace/python/python_tutorials
.
/home/liqiang/workspace/python
..

(3)一些功能备份

  • 去掉隐藏文件
list_dir = [f for f in os.listdir(cwd) if not f.startswith(('.'))]

6. pathlib模块

pathlib 库从 python3.4 开始,到 python3.6 已经比较成熟。如果你的新项目可以直接用 3.6 以上,建议用 pathlib。相比于老式的 os.path 有几个优势:

  • 老的路径操作函数管理比较混乱,有的是导入 os, 有的又是在 os.path 当中,而新的用法统一可以用 pathlib 管理。
  • 老用法在处理不同操作系统 win,mac 以及 linux 之间很吃力。换了操作系统常常要改代码,还经常需要进行一些额外操作。
  • 老用法主要是函数形式,返回的数据类型通常是字符串但是路径和字符串并不等价,所以在使用 os 操作路径的时候常常还要引入其他类库协助操作。新用法是面向对象,处理起来更灵活方便。
  • pathlib 简化了很多操作,用起来更轻松。

有两大类一个是纯路径不带I/0操作,另一个可以进行I/0的类。pathlib各个类的继承关系如下图:
在这里插入图片描述

(1)功能汇总

Path获得的路径为对象类型,可以使用str方法转化为字符串。同样可以使用Path()方法将字符串转化path对象

下面假设:

  • file = Path(‘archive/demo.txt’)
方法说明
pathlib.Path.cwd()获得当前路径
pathlib.Path.home()获得home目录
file.state().st_size获得文件大小
file.stat().st_ctime文件创建时间
file.stat().st_mtime文件修改时间
file.name文件名,包含后缀名,如果是目录则获取目录名。
file.stem文件名,不包含后缀。
file.suffix后缀,比如 .txt, .png
p.suffixs路径的所有后缀
file.parent父级目录,相当于 cd …
p.parents所有父目录
file.anchor锚,目录前面的部分 C:\ 或者 /。
file.resolve()获得绝对路径
dir_path.iterdir()可以扫描某个目录下的所有路径(文件和子目录), 打印的会是处理过的绝对路径。
dir_path.glob(‘*.txt’)匹配路径下的所有.txt文件
file.match(‘*.txt’)检查路径是否符合规则
Path.home() / ‘dir’ / ‘file.txt’可以使用/方法拼接路径,同Path.home().joinpath(‘dir’, ‘file.txt’)
file.is_file()检查路径是否为文件
file.is_dir()检查路径是否为目录
file.exists检查路径是否存在
path.mkdir()创建单级路径,如果是多级别则报错
path.mkdir(parents=True)创建多级目录
path.rmdir()删除目录
path.unlink删除文件
txt_path.replace(‘new_demo.txt’)移动文件,txt_path目录下的 demo.txt 文件移动到当前工作目录,并重命名为 new_demo.txt。如果移动的目录不存在,则会报错,可以使用exists方法查询是否存在。
txt_path.with_name(‘new.txt’)重命名文件
txt_path.with_suffix(‘.json’)修改文件后缀名

常用的 pathlib 和 os 对比图:

操作os and os.pathpathlib
绝对路径os.path.abspathPath.resolve
修改权限os.chmodPath.chmod
创建目录os.mkdirPath.mkdir
重命名os.renamePath.rename
移动os.replacePath.replace
删除目录os.rmdirPath.rmdir
删除文件os.remove, os.unlinkPath.unlink
工作目录os.getcwdPath.cwd
是否存在os.path.existsPath.exists
用户目录os.path.expanduserPath.expanduser and Path.home
是否为目录os.path.isdirPath.is_dir
是否为文件os.path.isfilePath.is_file
是否为连接os.path.islinkPath.is_symlink
文件属性os.statPath.stat, Path.owner, Path.group
是否为绝对路径os.path.isabsPurePath.is_absolute
路径拼接os.path.joinPurePath.joinpath
文件名os.path.basenamePurePath.name
上级目录os.path.dirnamePurePath.parent
同名文件os.path.samefilePath.samefile
后缀os.path.splitextPurePath.suffix

(2)程序解释

from pathlib import Path

#获取当前路径
v = Path.cwd()

# 创建 project/test目录
Path('project/test').mkdir(parents=True, exist_ok=True)

# 将test.txt 重命名为 project/tests.txt
Path('test.txt').rename('project/test.txt')

# 拼接目录
paths = ["test","test.txt"]
Path.cwd().parent.joinpath(*paths)

# 获取上上层目录
print(Path.cwd().parent.parent) 

#迭代器访问的所有文件、文件夹路径的迭代器
p = Path.cwd()
for i in p.iterdir():
  print(i) #i为Path类型,linux下为pathlib.PosixPath类型

#*******************其它操作*************************
path = Path.cwd()

path.parents  # 返回所有上级目录的列表

path.parts  # 分割路径 类似os.path.split(), 不过返回元组

path.root  # 返回路径的根目录

path.is_dir()  # 判断是否是目录

path.is_dir()  # 是否是文件

path.exists()  # 判断路径是否存在

path.open()  # 打开文件(支持with)

path.resolve()  # 返回绝对路径

path.cwd()  # 返回当前目录

path.iterdir()  # 遍历目录的子目录或者文件

path.mkdir()  # 创建目录

path.rename()  # 重命名路径

path.unlink()  # 删除文件或目录(目录非空触发异常)

path.joinpath()  # 拼接路径

7. shutil模块

shutil模块提供了许多关于文件和文件集合的高级操作,特别提供了支持文件复制和删除的功能。

(1)功能汇总

方法说明
copyfileobj(fsrc, fdst, length=16*1024)将fsrc文件内容复制至fdst文件,length为fsrc每次读取的长度,用做缓冲区大小
copyfile(src, dst)将src文件内容复制至dst文件,如果dst没有则创建一份
copymode(src, dst)将src文件权限复制至dst文件。文件内容,所有者和组不受影响
copystat(src, dst)将权限,上次访问时间,上次修改时间以及src的标志复制到dst。文件内容,所有者和组不受影响
copy(src, dst)将文件src复制至dst。dst可以是个目录,会在该目录下创建与src同名的文件,若该目录下存在同名文件,将会报错提示已经存在同名文件。权限会被一并复制。本质是先后调用了copyfile与copymode
copy2(src, dst)将文件src复制至dst。dst可以是个目录,会在该目录下创建与src同名的文件,若该目录下存在同名文件,将会报错提示已经存在同名文件。权限、上次访问时间、上次修改时间和src的标志会一并复制至dst。本质是先后调用了copyfile与copystat方法
ignore_patterns(*patterns)忽略模式,用于配合copytree()方法,传递文件将会被忽略,不会被拷贝
copytree(src, dst, symlinks=False, ignore=None)拷贝文档树,将src文件夹里的所有内容拷贝至dst文件夹
rmtree(path, ignore_errors=False, onerror=None)移除文档树,将文件夹目录删除,如果没有则会报错
move(src, dst)将src移动至dst目录下。若dst目录不存在,则效果等同于src改名为dst。若dst目录存在,将会把src文件夹的所有内容移动至该目录下面
disk_usage(path)获取当前目录所在硬盘使用情况。
chown(path, user=None, group=None)修改路径指向的文件或文件夹的所有者或分组。
which(cmd, mode=os.F_OKos.X_OK, path=None)
make_archive(base_name, format, root_dir, …)生成压缩文件
get_archive_formats()获取支持的压缩文件格式。目前支持的有:tar、zip、gztar、bztar。在Python3还多支持一种格式xztar
unpack_archive(filename, extract_dir=None, format=None)解压操作。
get_unpack_formats()获取支持的解压文件格式。目前支持的有:tar、zip、gztar、bztar和xztar。Python3新增方法

(2)程序解释

  • copyfileobj
import shutil
f1 = open("file.txt","r")#内容:11
f2 = open("file_copy.txt","a+") #内容:22,追加的方式读写
shutil.copyfileobj(f1,f2,length=1024) # f2变为:2211
  • copyfile
import shutil
shutil.copyfile("file.txt","file_copy_1.txt")#会生成一个新的文件file_copy_1.txt
  • copytree

将aaa中的所有内容,复制到bbb/ccc中(如果不存在,则自动创建)

import shutil,os
folder1 = os.path.join(os.getcwd(),"aaa")
folder2 = os.path.join(os.getcwd(),"bbb","ccc")# bbb与ccc文件夹都可以不存在,会自动创建
print(folder1)
print(folder2)
# 将"abc.txt","bcd.txt"忽略,不复制
shutil.copytree(folder1,folder2,ignore=shutil.ignore_patterns("abc.txt","bcd.txt"))
  • rmtree

删除的文件树必须存在

import shutil,os
folder1 = os.path.join(os.getcwd(),"aaa")
shutil.rmtree(folder1)

8. random模块

random模块用于生成随机数

(1)功能汇总

方法说明
random.random()0,1之间时间生成的浮点数 float
random.randint(1,10)产生 1 到 10 的一个整数型随机数 ,包含10.
random.uniform(1.1,5.4)产生 1.1 到 5.4 之间的随机浮点数float,区间可以不是整数
random.randrange(1,100,2)生成从1到100的间隔为2的随机整数,不包括100
random.choice(‘tomorrow’)从序列中随机选取一个元素
random.choice([‘剪刀’, ‘石头’, ‘布’])随机选择元素
random.sample(‘zyxwvutsrqponmlkjihgfedcba’,5)随机选择5个元素,生成一个新的列表
random.shuffle(items)对items打乱排序

(2)程序解释

import random

print( random.randint(1,10) )        # 产生 1 到 10 的一个整数型随机数  
print( random.random() )             # 产生 0 到 1 之间的随机浮点数
print( random.uniform(1.1,5.4) )     # 产生  1.1 到 5.4 之间的随机浮点数,区间可以不是整数
print( random.choice('tomorrow') )   # 从序列中随机选取一个元素
print(random.choice(['剪刀', '石头', '布']))  #随机选择元素
print( random.randrange(1,100,2) )   # 生成从1到100的间隔为2的随机整数,不包括100
print(random.sample('zyxwvutsrqponmlkjihgfedcba',5)) #随机选择5个元素,生成一个新的列表

#打乱排序
items = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
random.shuffle(items)
print(items) # [4, 3, 8, 2, 5, 9, 6, 1, 0, 7]

9. json模块

JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。Python3 中可以使用 json 模块来对 JSON 数据进行编解码,它主要提供了四个方法: dumps、dump、loads、load

  • dump和dumps对python对象进行序列化。将一个Python对象进行JSON格式的编码。
  • load和loads反序列化方法,将json格式数据解码为python对象。

python 原始类型向 json 类型的转化对照表

PythonJSON
dictobject
list, tuplearray
str, unicodestring
int, long, floatnumber
Truetrue
Falsefalse
Nonenull

(1)功能汇总

方法说明
json.dumps将 Python 对象编码成 JSON 字符串
json.loads将已编码的 JSON 字符串解码为 Python 对象

函数以及参数说明:

  1. dump和dumps介绍:
  • dump函数形式:json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
  • dumps函数形式:json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
参数说明
obj表示是要序列化的对象
fpdump与dumps的唯一区别,dumps没有该参数,文件描述符,将序列化的str保存到文件中。json模块总是生成str对象,而不是字节对象;因此,fp.write()必须支持str输入。
skipkeys默认为False,如果skipkeysTrue,(默认值:False),则将跳过不是基本类型(str,int,float,bool,None)的dict键,不会引发TypeError。
ensure_ascii默认值为True,能将所有传入的非ASCII字符转义输出。如果ensure_ascii为False,则这些字符将按原样输出。
check_circular默认值为True,如果check_circular为False,则将跳过对容器类型的循环引用检查,循环引用将导致OverflowError。
allow_nan默认值为True,如果allow_nan为False,则严格遵守JSON规范,序列化超出范围的浮点值(nan,inf,-inf)会引发ValueError。 如果allow_nan为True,则将使用它们的JavaScript等效项(NaN,Infinity,-Infinity)。
indent设置缩进格式,默认值为None,选择的是最紧凑的表示。如果indent是非负整数或字符串,那么JSON数组元素和对象成员将使用该缩进级别进行输入;indent为0,负数或“”仅插入换行符;indent使用正整数缩进多个空格;如果indent是一个字符串(例如“\t”),则该字符串用于缩进每个级别。
separators去除分隔符后面的空格,默认值为None,如果指定,则分隔符应为(item_separator,key_separator)元组。如果缩进为None,则默认为(’,’,’:’);要获得最紧凑的JSON表示,可以指定(’,’,’:’)以消除空格。
default默认值为None,如果指定,则default应该是为无法以其他方式序列化的对象调用的函数。它应返回对象的JSON可编码版本或引发TypeError。如果未指定,则引发TypeError。
sort_keys默认值为False,如果sort_keys为True,则字典的输出将按键值排序。

  1. load与loads介绍
  • load函数形式:json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
参数说明
fp文件描述符,将fp(.read()支持包含JSON文档的文本文件或二进制文件)反序列化为Python对象。
object_hook默认值为None,object_hook是一个可选函数,此功能可用于实现自定义解码器。指定一个函数,该函数负责把反序列化后的基本类型对象转换成自定义类型的对象。
parse_float默认值为None,如果指定了parse_float,用来对JSON float字符串进行解码,这可用于为JSON浮点数使用另一种数据类型或解析器。
parse_int默认值为None,如果指定了parse_int,用来对JSON int字符串进行解码,这可以用于为JSON整数使用另一种数据类型或解析器。
parse_constant默认值为None,如果指定了parse_constant,对-Infinity,Infinity,NaN字符串进行调用。如果遇到了无效的JSON符号,会引发异常。

  • loads函数形式:json.loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
参数说明
s将s(包含JSON文档的str,bytes或bytearray实例)反序列化为Python对象。
encoding指定一个编码的格式。

loads也不需要文件描述符,其他参数的含义和load函数的一致

(2)程序解释

dump和dumps

import json

# dumps可以格式化所有的基本数据类型为字符串
data1 = json.dumps([1,2,3,4])         # 列表
print(data1, type(data1))
data2 = json.dumps(100)          # 数字
print(data2, type(data2))
data3 = json.dumps('qlee')        # 字符串
print(data3, type(data3))
dict = {"name": "Tom", "age": 23}   # 字典
data4 = json.dumps(dict)
print(data4, type(data4))

with open("test.json", "w", encoding='utf-8') as f:
    # indent,表示空格数,默认为None,小于0为零个空格
    f.write(json.dumps(dict, indent=4)) #保存到f中
    #json.dump(dict, f, indent=4)  # 保存到f中

输出:

[1, 2, 3, 4] <class 'str'>
100 <class 'str'>
"qlee" <class 'str'>
{"name": "Tom", "age": 23} <class 'str'>

最后保存的test.json内容为:

{
    "name": "Tom",
    "age": 23
}
import json

dict = '{"name": "Tom", "age": 23}'   # 将字符串还原为dict
data1 = json.loads(dict)
print(data1, type(data1))

with open("test.json", "r", encoding='utf-8') as f:
    data2 = json.loads(f.read())    # 加载方式一:load的传入参数为字符串类型
    print(data2, type(data2))
    f.seek(0)                       # 将文件游标移动到文件开头位置
    data3 = json.load(f)# 加载方式二
    print(data3, type(data3))

输出:

{'name': 'Tom', 'age': 23} <class 'dict'>
{'name': 'Tom', 'age': 23} <class 'dict'>
{'name': 'Tom', 'age': 23} <class 'dict'>

10. pickle模块

pickle模块实现了用于序列化和反序列化Python对象结构的二进制协议。pickle模块只能在Python中使用,python中几乎所有的数据类型(列表,字典,集合,类等)都可以用pickle来序列化,pickle序列化后的数据,可读性差,人一般无法识别。

pickle协议和JSON(JavaScript Object Notation)的区别 :

  1. JSON是一种文本序列化格式(它输出unicode文本,虽然大部分时间它被编码utf-8),而pickle是二进制序列化格式;
  2. JSON是人类可读的,而pickle则不是;
  3. JSON是可互操作的,并且在Python生态系统之外广泛使用,而pickle是特定于Python的;

(1)功能汇总

方法说明
pickle.dump(obj, file, protocol=None,*,fix_imports=True)将序列化后的对象obj以二进制形式写入文件file中,效等同于Pickler(file, protocol).dump(obj)
pickle.dumps(obj, protocol=None,*,fix_imports=True)pickle.dumps()方法不需要写入文件中,它是直接返回一个序列化的bytes对象。
pickle.Pickler(file, protocol=None,*,fix_imports=True)实现的功能跟 pickle.dump() 是一样的。
pickle.load(file, *,fix_imports=True, encoding=”ASCII”. errors=”strict”)将序列化的对象从文件file中读取出来。它的功能等同于 Unpickler(file).load()。
pickle.loads(bytes_object, *,fix_imports=True, encoding=”ASCII”. errors=”strict”)pickle.loads()方法是直接从bytes对象中读取序列化的信息,而非从文件中读取。
pickle.Unpickler(file, *,fix_imports=True, encoding=“ASCII”. errors=“strict”)Unpickler(file).load() 实现的功能跟 pickle.load() 是一样的。

(2)程序解释

import pickle

path = 'test' #保存路径
f = open(path, 'wb')
data = {'a':123, 'b':'ads', 'c':[[1,2],[3,4]]}
pickle.dump(data, f) #保存
f.close()

f1 = open(path, 'rb')
data1 = pickle.load(f1) #解析
print(data1)

输出:

{'a': 123, 'b': 'ads', 'c': [[1, 2], [3, 4]]}

11. logging模块

logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比print,具备如下优点:

  1. 可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息;
  2. print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据;logging则可以由开发者决定将信息输出到什么地方,以及怎么输出;

(1)基本使用

只有级别大于或等于日志记录器指定级别的日志记录才会被输出,小于该级别的日志记录将会被丢弃。级别排序:CRITICAL > ERROR > WARNING > INFO > DEBUG。

import logging
#logging的级别为DEBUG,所以全部输出
logging.basicConfig(level = logging.DEBUG,format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s')

logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')

输出:

2021-11-14 16:42:56,718 - root - DEBUG - debug message
2021-11-14 16:42:56,718 - root - INFO - info message
2021-11-14 16:42:56,718 - root - WARNING - warning message
2021-11-14 16:42:56,718 - root - ERROR - error message
2021-11-14 16:42:56,718 - root - CRITICAL - critical message

我们将logger的级别改为ERROR,再观察一下输出结果:

2021-11-14 16:44:33,998 - root - ERROR - error message
2021-11-14 16:44:33,998 - root - CRITICAL - critical message

logging.basicConfig函数各参数说明:

参数说明
filename指定日志文件名;
filemode和file函数意义相同,指定日志文件的打开模式,‘w’或者’a’;
format指定输出的格式和内容,format可以输出很多有用的信息
datefmt指定时间格式,同time.strftime();
level设置日志级别,默认为logging.WARNNING;
stream指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略.

format中输出的格式个内容:

>参数说明
%(levelno)s打印日志级别的数值
%(levelname)s打印日志级别的名称
%(pathname)s打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s打印当前执行程序名
%(funcName)s打印日志的当前函数
%(lineno)d打印日志的当前行号
%(asctime)s打印日志的时间
%(thread)d打印线程ID
%(threadName)s打印线程名称
%(process)d打印进程ID
%(message)s打印日志信息

(2)将日志输出到文件

import logging
logger = logging.getLogger(__name__)
logger.setLevel(level = logging.DEBUG)

handler = logging.FileHandler("log.txt")#日志输出到log.txt中
handler.setLevel(logging.WARNING) #只输出hander和logger的setLeverl级别更高的一级
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)

logger.debug('debug message')
logger.info('info message')
logger.warning('warning message')
logger.error('error message')
logger.critical('critical message')
logger.info("Finish")

log.tx内容为:

2021-11-14 17:05:48,407 - __main__ - WARNING - warning message
2021-11-14 17:05:48,407 - __main__ - ERROR - error message
2021-11-14 17:05:48,407 - __main__ - CRITICAL - critical message

(3)使用json文件配置

使用JSON配置文件:

{
    "version":1,
    "disable_existing_loggers":false,
    "formatters":{
        "simple":{
            "format":"%(asctime)s - %(name)s - %(levelname)s - %(message)s"
        }
    },
    "handlers":{
        "console":{
            "class":"logging.StreamHandler",
            "level":"DEBUG",
            "formatter":"simple",
            "stream":"ext://sys.stdout"
        },
        "info_file_handler":{
            "class":"logging.handlers.RotatingFileHandler",
            "level":"INFO",
            "formatter":"simple",
            "filename":"info.log",
            "maxBytes":"10485760",
            "backupCount":20,
            "encoding":"utf8"
        },
        "error_file_handler":{
            "class":"logging.handlers.RotatingFileHandler",
            "level":"ERROR",
            "formatter":"simple",
            "filename":"errors.log",
            "maxBytes":10485760,
            "backupCount":20,
            "encoding":"utf8"
        }
    },
    "loggers":{
        "my_module":{
            "level":"ERROR",
            "handlers":["info_file_handler"],
            "propagate":"no"
        }
    },
    "root":{
        "level":"INFO",
        "handlers":["console","info_file_handler","error_file_handler"]
    }
}

使用程序如下:

import json
import logging.config
import os
 
def setup_logging(default_path = "logging.json",default_level = logging.INFO,env_key = "LOG_CFG"):
    path = default_path
    value = os.getenv(env_key,None)
    if value:
        path = value
    if os.path.exists(path):
        with open(path,"r") as f:
            config = json.load(f)
            logging.config.dictConfig(config)
    else:
        logging.basicConfig(level = default_level)
 
def func():
    logging.info("start func")
 
    logging.info("exec func")
 
    logging.info("end func")
 
if __name__ == "__main__":
    setup_logging(default_path = "logging.json")
    func()

(4)通过YAML文件配置

使用YAML文件进行配置:

version: 1
disable_existing_loggers: False
formatters:
        simple:
            format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
handlers:
    console:
            class: logging.StreamHandler
            level: DEBUG
            formatter: simple
            stream: ext://sys.stdout
    info_file_handler:
            class: logging.handlers.RotatingFileHandler
            level: INFO
            formatter: simple
            filename: info.log
            maxBytes: 10485760
            backupCount: 20
            encoding: utf8
    error_file_handler:
            class: logging.handlers.RotatingFileHandler
            level: ERROR
            formatter: simple
            filename: errors.log
            maxBytes: 10485760
            backupCount: 20
            encoding: utf8
loggers:
    my_module:
            level: ERROR
            handlers: [info_file_handler]
            propagate: no
root:
    level: INFO
    handlers: [console,info_file_handler,error_file_handler]

使用程序如下:

import yaml
import logging.config
import os
 
def setup_logging(default_path = "logging.yaml",default_level = logging.INFO,env_key = "LOG_CFG"):
    path = default_path
    value = os.getenv(env_key,None)
    if value:
        path = value
    if os.path.exists(path):
        with open(path,"r") as f:
            config = yaml.load(f)
            logging.config.dictConfig(config)
    else:
        logging.basicConfig(level = default_level)
 
def func():
    logging.info("start func")
 
    logging.info("exec func")
 
    logging.info("end func")
 
if __name__ == "__main__":
    setup_logging(default_path = "logging.yaml")
    func()

参考:
time:https://www.cnblogs.com/tkqasn/p/6001134.html
logging:https://blog.csdn.net/pansaky/article/details/90710751#t0
pathlib:https://www.cnblogs.com/heniu/p/12872604.html

  • 8
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 要用 Python 实现一个数据管理系统,你需要做以下几件事情: 1. 安装 Python 环境,并选择合适的库和工具。你可以使用 Python内置库,也可以使用第三方库,比如 Pandas 和 NumPy。 2. 定义你的数据模型。你需要确定你的数据结构,比如你想要管理的数据是什么类型的,以及它们之间的关系。 3. 实现数据的存储和获取。你可以使用 Python内置数据类型,比如字典和列表来存储数据。也可以使用文件或者数据库来存储数据。 4. 实现数据的操作。你需要写代码来实现数据的增加、删除、修改和查询等操作。 5. 实现用户界面。你可以使用 Python 的 GUI 库,比如 tkinter 或者 PyQt,来为用户提供友好的界面。也可以使用命令行或者网页界面。 6. 测试你的程序。你需要写测试代码来确保你的程序能够正常工作。 总之,要用 Python 实现一个数据管理系统,你需要熟练掌握 Python 编程语言,并了解常用的数据类型和数据存储方式。 ### 回答2: 数据管理系统是指用来管理和处理各种数据的软件系统。Python作为一种高级编程语言,具有简单易学、功能丰富和广泛应用等优点,非常适合用于实现一个数据管理系统。 首先,利用Python的各种数据结构和库,我们可以定义适合存储和组织各种数据的数据结构。例如,可以使用字典、列表、集合等数据结构来存储和管理数据。此外,可以根据不同的需求,利用Python的特性和优势来自定义一些数据结构,如树、图等。 其次,Python提供了丰富的库和模块,可以用于数据的读取、存储和操作。例如,可以使用Pandas库读取和处理各种数据文件,如CSV、Excel等。还可以使用NumPy库进行数据的数值计算和处理。同时,Python还提供了SQLite库,可以方便地操作数据库,进行数据的增删改查等操作。 另外,Python还可以通过网络编程支持数据的远程访问和管理。可以使用Python的网络编程库(如Socket)实现数据的远程传输和交互。也可以借助Python的Web框架(如Django、Flask)构建数据管理系统的前端和后端,实现用户的访问和管理。 最后,Python还提供了友好的用户界面和交互式环境。可以使用Python的GUI库(如Tkinter、PyQt)构建用户界面,方便用户对数据进行管理和操作。此外,Python的交互式环境(如IPython、Jupyter Notebook)还可以用于数据的可视化和分析,帮助用户更好地理解和使用数据。 综上所述,利用Python的强大功能和丰富的库,我们可以实现一个功能强大的数据管理系统。无论是数据的存储、组织、操作,还是数据的访问、分析和可视化,Python都为我们提供了很多强大的工具和方法。 ### 回答3: 用Python实现一个数据管理系统可以使用Python的数据库操作模块来实现。具体实现步骤如下: 1. 首先,导入Python的数据库操作模块,在Python常用的数据库操作模块有MySQLdb、psycopg2等,根据需要选择其一个进行操作。 2. 创建与数据库的连接,连接数据库需要提供数据库地址、用户名、密码等信息。 3. 在数据库创建表,表的字段根据需要定义,可以使用SQL语句来创建表。 4. 实现数据的增删改查功能。通过执行SQL语句,可以实现向数据库添加数据、删除数据、更新数据以及查询数据的功能。 5. 设计用户界面,可以使用Python的GUI库如Tkinter、PyQt等,也可以使用Web框架如Flask、Django等来实现。 6. 提供用户输入接口,可以使用GUI来提供用户输入框、按钮等控件,使用户可以方便地输入操作指令。 7. 根据用户的操作指令,调用相应的数据库操作功能实现数据的管理。 8. 最后,关闭数据库连接,释放资源。 通过以上步骤,可以实现一个基本的数据管理系统。当然,根据具体需求,可以进一步完善系统的功能,如数据校验、权限管理等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

非晚非晚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值