python3常用标准库

python3常用标准库

趁着有时间,把一些我用过的常用标准库进行整理和复习。

time

用法 说明
time.time() 返回时间戳(从1970年1月1日00:00:00开始计算)
time.localtime() 返回当前时间的结构化时间(struct_time)对象,可以用.tm_year等获取年等数据
time.gmtime() 返回世界标准时间的结构化时间(struct_time)对象
time.mktime(struct_time) 结构化时间转化为时间戳
time.strftime("时间格式", struct_time) 结构化时间转化为字符串时间
time.strptime("字符串时间", "时间格式") 字符串时间转化为结构化时间
time.asctime([tuple]) 时间元组转换为字符串。如果时间元组不存在,则使用localtime()返回的当前时间
time.ctime(seconds) 将时间秒数转换为时间字符串,相当于time.asctime(localtime(seconds))。second不存在,则使用localtime()返回的当前时间。

常用时间占位符

  • 年 %Y

  • 月 %m

  • 日 %d

  • 时 %H (24小时制)

  • 分 %M

  • 秒 %S

  • 时分秒 %X ,相当于%H:%M:%S

time库各方法关系

datetime

虽然python库中已经有了time库,但time库不支持对时间的加减等操作,因此就有了datetime库。

用法 说明
datetime.datetime.now() 获取当前时间,返回datetime.datetime对象,有year, month, day, hour, minute, second, microsecond等属性。
datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0 这是一个类,表示两个 date 或者 time 的时间间隔。
datetime.datetime.fromtimestamp(seconds) 将秒数转换为datetime.datetime对象,datetime.datetime.fromtimestamp(time.time())<==>datetime.datetime.now()
datetime.timetuple() 这是datetime.datetime对象的方法,返回结构化时间,time.localtime() 的返回类型相同
datetime.replace(year=self.year, month=.., day=.., hour=.., minute=.., second=.., ...) 一样是datetime.datetime对象的方法,可以替换当前对象的year等属性,详见文档

有了以上几个方法,我们就可以对时间进行加减操作,并可以在time和datetime之间进行转换。

  • datetime.datetime之间可以相减,结果为datetime.timedelta对象,有days和seconds属性

  • datetime.datetime与datetime.timedelta之间可以加减,结果为datetime.datetime对象

  • datetime.timedelta本身可以乘以一个数,以表示不同的时间间隔

import timeimport datetimedef main():    date1_string = "2017/6/8 15:0:0"    # date1_string转换为时间戳# strptime -> mktime -> fromtimestamp ==> datetime.datetime    date1 = datetime.datetime.fromtimestamp(time.mktime(        time.strptime(date1_string, '%Y/%m/%d %H:%M:%S')))    date2 = datetime.datetime.now()# 获取当前时间    # 使用datetime.datetime对象之间 进行操作,结果为datetime.timedelta对象    result1 = date2 - date1# 两个时间过了多久了    print(result1.days, result1.seconds)    # datetime.datetime与datetime.timedelta之间的操作, 结果是datetime.datetime对象    year = datetime.timedelta(days=365)     # 一年时间    result2 = date2 + 2 * year# 当前时间的两年后    print(result2.year, result2.month, result2.day)if __name__ == '__main__':    main()

random

使用random可以生成伪随机数。

用法 说明
random.seek(time.time()) 初始化随机数生成器
random.random() 生成[0.0, 1.0) 范围内的一个随机浮点数
random.uniform(num1, num2) 返回[num1, num2] [1] 中一个随机浮点数
random.randint(num1, num2) 生成[num1, num2] 范围内的一个整数,num1, num2均为int
random.randrange(num1, num2) 生成[num1, num2) 范围内的一个整数,num1, num2均为int
random.choice(iterable_obj) 从可迭代对象中随机取一个元素
random.sample(iterable_obj, n) 从可迭代对象中随机取n个元素组成一个列表返回
random.shuffle(x) 将序列 x 随机打乱位置。不可变的可以用random.sample(x, k=len(x))

生成验证码例子:

import randomdef make_code(n):    res = ''    for i in range(n):        letter = chr(random.randint(65, 90))# 生成A-Z的任意一个字母        number = str(random.randint(0, 9))# 生成0-9的任意一个数        res += random.choice([letter, number])    return resprint(make_code(9))

sys

sys模块提供了一些与解释器相关的变量和函数。

用法 说明
sys.argv 返回一个列表,第一个元素是程序本身路径,其他元素是命令行输入参数
sys.exit(n) 退出程序,实现方式是抛出一个SystemExit异常。正常时n为0,非零值视为“异常终止”。大多数系统要求该值的范围是 0~127。
sys.path 返回模块的搜索路径,其本质上是列表,可以使用append方法添加路径,导入特定模块。
sys.platform 返回平台名称(Linux:'linux',Windows:'win32',Mac OS X:darwin')
sys.stdout.write(" ") 不换行打印
sys.stdout.flush() 刷新

os

一般用于对文件和目录进性操作的模块。

路径相关

os.getcwd() 获取当前工作目录
os.chdir(path) 改变当前工作目录

文件/目录操作

用法 说明
os.mkdir(path) 创建目录
os.makedirs(path) 递归创建目录
os.redir(path) 删除空目录
os.removedirs(path) 递归删除空目录
os.remove(path) 删除文件
os.rename(old_name, new_name) 更改文件或目录名
os.stat(path) 查看文件详情( 'st_atime', 'st_ctime', 'st_mtime', 'st_size'等)

输出符号

用法 说明
os.sep 输出系统分隔符(如:\/
os.linesep 输出行终止符(win:\r\n,linux:\n)
os.pathsep 输出路径分割符(win:;,linux::

path

path是os库中的一个模块,里面有很多实用的函数。

用法 说明
os.path.split(path) 把路径分割为(目录, 文件名)
os.path.abspath(path) 返回path规范化的绝对路径
os.path.normpath(path) 返回path规范化后的结果
os.path.dirname(path) split结果的个第一元素
os.path.basername(path) split结果的个第二元素
os.path.join(path1, path2, path3 ...) 把多个路径拼接成一个,并返回
os.path.exists(path) 判断路径是否存在
os.path.isabs(path) 判断路径是否为绝对路径
os.path.isfile(path) 判断路径是否为文件
os.path.isdir(path) 判断路径是否为目录
os.path.getatime(path) 返回文件/目录的最后访问时间。返回值是一个浮点数,为纪元秒数
os.path.getctime(path) 返回文件/目录的最后修改时间。返回值是一个浮点数,为纪元秒数
os.path.getmtime(path) Unix:返回元数据的最后修改时间,Win:返回创建时间。返回值是一个数,为纪元秒数
os.path.size(path) 返回文件/目录的大小,以字节为单位

shutil

shutil模块提供了一系列对文件和文件集合的高阶操作。 特别是提供了一些支持文件拷贝和删除的函数。

拷贝操作

  1. shutil.copyfileobj(fsrc, fdst[, length])
    将文件类对象 fsrc 的内容拷贝到文件类对象 fdst,length表示缓冲区大小,且默认情况为:1024 * 1024 if WINDOWS else 64 * 1024

    import shutilshutil.copyfileobj(open("./t1/a.txt", "r"), open("t1/b.txt", "w"))

    注意有个fsrc是读,而fdst是写

  2. shutil.copyfile(src, dst)
    将src文件拷贝到dst文件,dst可以不存在

    import shutilshutil.copyfile("./t1/a.txt", "./t1/b.txt")
  3. shutil.copymode(src, dst)
    仅拷贝权限。内容、组、用户均不变,此功能并不是在所有平台上均可用(查看文档,了解更多)

    import shutilshutil.copymode("./t1/a.txt", "./t1/b.txt")
  4. shutil.copystat(src, dst)
    从 src 拷贝权限位、最近访问时间、最近修改时间以及旗标到 dst.

  5. shutil.copy(src, dst)
    拷贝文件和权限

  6. shutil.copy2(src, dst)
    拷贝文件和状态信息

  7. shutil.copytree(src, dst)
    递归拷贝,参数很多,没有详细列出

    import shutilshutil.copytree('folder1', 'folder2',ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))# 目标目录不能存在,注意对folder2目录父级目录要有可写权限,ignore的意思是排除

删除操作

  • shutil.rmtree(path, ignore_errors=False, onerror=None)
    递归删除文件夹。前面说过:空文件夹用os.redir(path),单个文件用os.remove(path);onerror参数可以指定处理程序来处理异常(ignore_errors为False时)

移动操作

  • shutil.move(src, dst)
    递归地将一个文件或目录 (src) 移至另一位置 (dst) 并返回目标位置。同一目录时为重命名,类似于mv命令。

json

json模块可以把python基本数据类型与json数据进行转换。

  • json.dumps(data)
    将基本数据类型格式转换为json数据

    import jsondata = {"name": "lczmx","age": 20,}s = json.dumps(data)print(repr(s))  # '{"name": "lczmx", "age": 20}'
  • json.dump(data, file_obj)
    将基本数据类型转换为json数据并写入到文件中

    import jsondata = {"name": "lczmx","age": 20,}f = open("./res.json", "w", encoding="utf-8")json.dump(data, f)f.close()
  • json.loads(s)
    把json字符串转化为python数据类型

    import jsons = '{"name": "lczmx", "age": 20}'res = json.loads(s)print(res, type(res))# {'name': 'lczmx', 'age': 20} <class 'dict'>
  • json.load(file_obj)
    转换文件对象的json内容。

    import jsonwith open("./res.json", "r", encoding="utf-8") as f:res = json.load(f)print(res, type(res))

扩展json

json模块只支持python基本数据类型,但我们可以自定义JSON编码器,重写default方法,这样我们自己写的类就可以使用json.dumps

import jsonclass Foo:    def __init__(self, name, age):        self.name = name        self.age = age    def data_dict(self):        # 返回的是基本数据类型        return {"name": self.name, "age": self.age}class JsonCustomEncoder(json.JSONEncoder):    # 重写default方法    def default(self, field):        if isinstance(field, Foo):            return field.data_dict()    # 调用自定义的方法        else:            return json.JSONEncoder.default(self, field)f = Foo("lczmx", 21)# 使用时要指定自定义的编码器res = json.dumps(f, cls=JsonCustomEncoder)print(res)# {"name": "lczmx", "age": 21}

pickle

模块 pickle 实现了对一个 Python 对象结构的二进制序列化和反序列化。它只能用于Python,并且可能不同版本的Python彼此都不兼容,因此,只能用Pickle保存那些不重要的数据,不能成功地反序列化也没关系。

注意:pickle 模块并不安全。你只应该对你信任的数据进行unpickle操作.

import pickledic = {'name': 'alvin', 'age': 23, 'sex': 'male'}print(type(dic))  # <class 'dict'>j = pickle.dumps(dic)print(type(j))  # <class 'bytes'>f = open('序列化对象_pickle', 'wb')  # 注意是w是写入str,wb是写入bytes,j是'bytes'f.write(j)  # -------------------等价于pickle.dump(dic,f)f.close()# -------------------------反序列化f = open('序列化对象_pickle', 'rb')data = pickle.loads(f.read())  # 等价于data=pickle.load(f)print(data['age'])

shelve

shelve" 是一种持久化的类似字典的对象,只有open方法,比pickle简单。
由于 shelve 模块需要 pickle 的支持,所以shelve模块也不安全。需要注意是否为信任数据才能使用。

import shelved = shelve.open("持久化文件.txt")# 以 d[key] = data 的形式存储d["name"] = "lczmx"d["age"] = 22d["addr"] = "guangzhou"d["data"] = [1, 2, 3]# 使用中括号取值name = d["name"]print(name)         # lczmx# 使用del删除某个键对应的值del d["age"]# 可以使用 in 判断某个键是否存在flag = "age" in dprint(flag)         # False# .keys()方法 可以列出所有的键 (速度较慢!)klist = list(d.keys())print(klist)        # ['name', 'addr', 'data']# 值即使是引用对象,假如要保存修改后的值,要重新赋值temp = d['data']temp.append(4)print(d["data"])    # [1, 2, 3]d['data'] = tempprint(d["data"])    # [1, 2, 3, 4]# close掉,可以使用上下文管理协议d.close()

xml

xml也是一个可以跨语言的数据交换协议,但使用起来没有json简单,由于xml诞生的时间比json早,所以至今还有一些公司正在使用。

生成xml

步骤:

  1. 创建根节点

  2. 为根节点添加子节点

  3. 为字节点添加内容和属性

  4. 生成文档对象树

  5. 保存到文件等

import xml.etree.ElementTree as ET# 创建根节点new_xml = ET.Element("namelist")# 为跟节点创建字节点name1 = ET.SubElement(new_xml, "name", attrib={"enrolled": "yes"})age1 = ET.SubElement(name1, "age", attrib={"checked": "no"})# 添加内容name1.text = '老王'age1.text = "30"# 同上name2 = ET.SubElement(new_xml, "name", attrib={"enrolled": "no"})age2 = ET.SubElement(name2, "age")name2.text = "隔壁"age2.text = '33'# 生成文档对象et = ET.ElementTree(new_xml)# 写入文件中et.write("test.xml", encoding="utf-8", xml_declaration=True)# 打印生成的格式ET.dump(new_xml)

结果:

<?xml version='1.0' encoding='utf-8'?><namelist>    <name enrolled="yes">老王<age checked="no">30</age></name>    <name enrolled="no">隔壁<age>33</age></name></namelist>

读取xml

对xml文件进行操作,用的是parse方法和getroot方法

import xml.etree.ElementTree as ETtree = ET.parse("./test.xml")root = tree.getroot()

以下都以root即根节点这个对象进行操作
root可以换成任意子节点

查看

  • root.tag 获取标签名

  • root.attrib 获取属性

  • root.text 获取内容

遍历/查找

  • root.iter(tag) 查找子孙节点中的tag标签,以迭代器方式返回

  • root.find(tag) 查找子节点的第一个tag标签

  • root.findall(tag) 找子节点的所有tag标签

修改

  • root.text="xx" 修改内容

  • root.set("属性名", "属性值") 设置属性值

删除

  • root.remove(node) 删除子节点

struct

此模块可以执行 Python 值和以 Python bytes 对象表示的 C 结构之间的转换。 这可以被用来处理存储在文件中或是从网络连接等其他来源获取的二进制数据。
一般使用它的两个函数:

  1. struct.pack("格式", data)

  2. struct.unpack("格式", byte_data)

import struct# 数据 -> bytespi = 3.14159265358res = struct.pack("f", pi)print(res, type(res))  # b'\xdb\x0fI@' <class 'bytes'> # 已经转化为字节类型# bytes -> 原数据data = struct.unpack("f", res)print(data, type(data))  # (3.1415927410125732,) <class 'tuple'>
格式 C 类型 Python 类型 标准大小 注释
x 填充字节
c char 长度为 1 的字节串 1
b signed char 整数 1 (1), (2)
B unsigned char 整数 1 (2)
? _Bool bool 1 (1)
h short 整数 2 (2)
H unsigned short 整数 2 (2)
i int 整数 4 (2)
I unsigned int 整数 4 (2)
l long 整数 4 (2)
L unsigned long 整数 4 (2)
q long long 整数 8 (2)
Q unsigned long long 整数 8 (2)
n ssize_t 整数 (3)
N size_t 整数 (3)
e (6) 浮点数 2 (4)
f float 浮点数 4 (4)
d double 浮点数 8 (4)
s char[] 字节串
p char[] 字节串
P void * 整数 (5)

re

正则表达式是用来描述字符或字符串的特殊符号,在python中用re模块实现,正则表达式模式被编译成一系列的字节码,用 C 编写的匹配引擎执行。

元字符

正则表达式语言由两种基本字符类型组成:原义(正常)文本字符和元字符,元字符实质上就是有特殊含义的字符。
下面列举一些常用的元字符,参考文档给出的元字符

字符 描述 列子
\\ 匹配\
\w 匹配字母、数字、下划线
\W 匹配非字母数字下划线
\s 匹配空白字符
\S 匹配非空白字符
\d 匹配数字
\D 匹配非数字
\n 匹配换行符
\t 匹配制表符
^ 匹配字符串的开头
$ 匹配字符串的结尾
. 匹配除换行符外的所有字符,当re.DOTALL标记被指定时,可以匹配换行符
[] 匹配括号中的每一个字符,如[abc]表示abc
[^] 匹配不在括号中的字符,如[^abc]表示不是ab
* 对它前面的正则式匹配0到任意次重复,如\w*表示0到任意个数字
+ 对它前面的正则式匹配1到任意次重复
? 对它前面的正则式匹配0到1次重复
{n} 对其之前的正则式指定匹配 m 个重复;少于 m 的话就会导致匹配失败,如\w{6}表示6个数字
{n,m} 对正则式进行 n 到 m 次匹配,在 n 和 m 之间取尽量多。
a|b 匹配a或b
() 组合,匹配括号内的表达式

更多可以看这篇文章 linux shell 正则表达式(BREs,EREs,PREs)差异比较
关于(?…)个扩展标记法,可以看官方文档。

方法

查找

使用 说明
re.findall(pattern, string) 匹配所有结果,返回一个列表,空匹配也会包含在结果里
re.finditer(pattern, string) 匹配所有结果,返回由匹配对象(re.Match)构成的迭代器 。 string 从左到右扫描,匹配按顺序排列。空匹配也包含在结果里。
re.search(pattern, string) 匹配第一个结果,返回匹配对象(re.Match),未匹配到时为None
re.match(pattern, string) 字符串开头相当于re.search("^ ...", string)是否匹配pattern,是则返回匹配对象(re.Match),未匹配到时为None

分割

  • re.split(pattern, string, maxsplit=0, flags=0)
    以pattern规则分割string,结果以列表形式返回,maxsplit非零时,表示分割多少次,flags=re.IGNORECASE可以忽略大小写

    import res = "12a21v13xsa15"res = re.split("[a-z]+", s)print(res)      # ['12', '21', '13', '15']

替换

  • re.sub(pattern, repl, string, count=0, flags=0)
    返回通过使用 repl 替换在 string 最左边非重叠出现的 pattern 而获得的字符串。
    可选参数 count 是要替换的最大次数;count 必须是非负整数。如果省略这个参数或设为 0,所有的匹配都会被替换。

    import res = "12a21v13xsa15"res = re.sub("[a-z]+", ", ", s)print(res)  # 12, 21, 13, 15

    假如repl参数是一个函数,那么可以极大扩展替换功能。

    import res = "name=lczmx, age=22"def repl_func(matchobj):age = int(matchobj.group("age"))return str(age + 1)res = re.sub(r"(?P<age>\d+)", repl_func, s)print(res)      # name=lczmx, age=23

匹配对象(re.Match)操作

  • Match.group([group1, ...])
    返回一个或者多个匹配的子组。如果只有一个参数,结果就是一个字符串,如果有多个参数,结果就是一个元组,使用正则表达式使用了(?P<name>…) 语法,可以用Match.group("name")的方式取值。

  • Match.groups(default=None)
    返回一个元组,包含所有匹配的子组

  • Match.groupdict(default=None)¶
    返回一个字典,包含了所有的命名子组。key就是组名

    import res = "abc@example.com,user"res = re.match(r"([a-zA-Z]+)@(\w+\.com)", s)print(res.groups())  # ('abc', 'example.com')print(res.group(0))  # abc@example.comprint(res.group(1))  # abcprint(res.group(2))  # example.comres = re.match(r"(?P<prefix>\w+)@(?P<suffix>\w+\.com)", s)print(res.groups())  # ('abc', 'example.com')print(res.group(0))  # abc@example.comprint(res.group(1))  # abcprint(res.group("prefix"))  # abcprint(res.group(2))  # example.comprint(res.group("suffix"))  # example.comprint(res.groupdict())  # {'prefix': 'abc', 'suffix': 'example.com'}

去括号优先级
假如这样的例子:

import reres = re.findall(r"(abc)+", "abcabcabc")print(res)      # ['abc']

其匹配结果是["abc"],而非["abcabcabc"],这是因为括号的优先级高,假如要括号与后面的元字符相结合的化可以使用以下方法:

import reres = re.findall(r"(?:abc)+", "abcabcabc")print(res)      # ['abcabcabc']

匹配原理
关于正则匹配原理,看此文

logging

关于日志管理的基本教程,请点击这里

关于使用日志的流程,大约有以下步骤:

  1. 调用logging.basicConfig()设置logging,确定日记级别、是否输入到文件、信息格式等参数

  2. 根据需求,调用loggingdebuginfowarningerrorcritical方法

注意
由于logging.basicConfig()只需要定义一次,所以debug等方法应该在其被设置后调用

打印到终端

打印到终端是开发过程中的一个实用的方法。

import logginglogging.basicConfig()logging.debug("debug messages")logging.info("info messages")logging.warning("warning messages")logging.error("error messages")logging.critical("critical messages")

由于默认日志级别为WARNING,所以只在终端显示了后三行信息

写入文件

basicConfig()增加filename参数即可

import logginglogging.basicConfig(filename="test.log")logging.debug("debug messages")logging.info("info messages")logging.warning("warning messages")logging.error("error messages")logging.critical("critical messages")

python 3.9版本的logging.basicConfig() 可以指定encoding参数,之前的以系统默认的编码方式打开。

多模块使用

在多个模块中import logging即可,其操作的是同一个logging对象

import loggingimport mylibdef main():    logging.basicConfig()    logging.warning("start function")    mylib.my_func()    logging.warning("end function")    print(id(logging))# 2248755624272if __name__ == '__main__':    main()

./mylib.py

# ./mylib.pyimport loggingdef my_func():    logging.error("error massage")    print(id(logging))# 2248755624272

修改日志级别

日志级别从低到高:

级别 何时使用
DEBUG 细节信息,仅当诊断问题时适用。
INFO 确认程序按预期运行
WARNING 表明有已经或即将发生的意外(例如:磁盘空间不足)。程序仍按预期进行
ERROR 由于严重的问题,程序的某些功能已经不能正常执行
CRITICAL 严重的错误,表明程序已不能继续执行

默认级别为WARNING

修改日志级别要用到logging.basicConfig()level参数,其传入的值是一个在logging模块中已经被定义好的数:

CRITICAL = 50FATAL = CRITICALERROR = 40WARNING = 30WARN = WARNINGINFO = 20DEBUG = 10NOTSET = 0

例子:

import logginglogging.basicConfig(level=logging.INFO)logging.warning("start function")

从命令行中接收日志级别

使用argparse库接收命令行参数,再使用getattr()方法从logging模块中把对应的日志级别取出来:

import loggingimport argparse# log选项的值只能是level_list的元素level_list = ["debug", "info", "warning", "warn", "error", "fatal", "critical"]level_list.extend(list(map(lambda x: x.upper(), level_list)))# 全大写再加入parser = argparse.ArgumentParser(description="test file")parser.add_argument("--log", default="debug", choices=level_list)args = parser.parse_args()# 拿到级别字符串后要大写level = getattr(logging, args.log.upper())logging.basicConfig(level=level)logging.debug("debug messages")logging.info("info messages")logging.warning("warning messages")logging.error("error messages")logging.critical("critical messages")
$ python test.py --log errorERROR:root:error messagesCRITICAL:root:critical messages$ python test.py --log info INFO:root:info messagesWARNING:root:warning messagesERROR:root:error messagesCRITICAL:root:critical messages

configparser

configparser库是python的配置文件管理模块,其所用结构与 INI 文件的类似。
注意:小节(section)中的键(key)大小写不敏感并且会存储为小写形式

步骤:

  1. 创建对象configparser.ConfigParser()

  2. 在字典中添加数据,用中括号操作,类似字典

  3. 写入文件

import configparser# 1 创建parser对象config = configparser.ConfigParser()# 2 添加数据# 方法一config["DEFAULT"] = {"HOST": "localhost", "PORT": "3306"}# 方法二config["CUSTOM"] = {}config["CUSTOM"]["HOST"] = "192.168.0.1"# 或custom_config = config["CUSTOM"]custom_config["PORT"] = "3333"# 3 写入文件with open("config.ini", "w") as f:    config.write(f)

最外层就是一个字典

config.ini文件:

[DEFAULT]host = localhostport = 3306[CUSTOM]host = 192.168.0.1port = 3333

注意:DEFAULT不在sections()中,可以直接用["DEFAULT"].get(key).get("DEFAULT", key)取值
根据不同的需求可以用以下几个方法:

  • config.read(path) 读取配置文件

  • config.sections() 返回可用节的列表,即[xxx]中的xxx

  • config.options(Section) 返回键构成的元组

  • config.items(Section) 返回列表,元素为键值对组成的元组

  • config.get(Section, key) 等价于 Section.get(key)

  • Section.get(key, default) 类似字典一样取值

    config 还可以通过使用for循环,有.keys(), .values(), .items()

    import configparserconfig = configparser.ConfigParser()config.read("./config.ini")print(config["DEFAULT"].get("host"))    # localhostprint(config.options("CUSTOM"))  # ['host', 'port']print(config.items("CUSTOM"))# [('host', '192.168.0.1'), ('port', '3333')]

删操作

  • config.remove_section(section) 删除块即整个[xxx]

  • config.remove_option(section, key) 删除块下面的键(包括值)

    import configparserconfig = configparser.ConfigParser()config.read("./config.ini")config.remove_section("CUSTOM")config.remove_option("DEFAULT", "host")config.write(open("./config.ini", "w"))

argparse

argparse是python推荐的命令行参数解析模块,argparse基于optparse(3.2版中已经被弃用),所以两者用法类似。
其一般的使用步骤是:

  1. 创建解析器

  2. 添加参数

  3. 解析参数

创建解析器

parser = argparse.ArgumentParser(description="计算两个数的和", prog="SUM")
  • description参数可以指定帮助文档之前显示的描述信息

  • prog 指定程序名,默认sys.argv[0]

添加参数

使用parser.add_argument(name or flags)方法,该方法可以指定位置参数或者是选项,而且它可以接收很多参数,下面列举几个常用的参数:

  • action - 当参数在命令行中出现时使用的动作基本类型。
    它的值列出这几个更多可以看文档

    action值 说明
    store 存储参数的值(默认)
    store_true and store_false 分别用作存储 True 和 False 值的特殊用例
    version 期望有一个 version= 命名参数,version参数可以用%(prog)s的形式使用prog参数
  • default - 设置默认值。

  • type - 命令行参数应当被转换成的类型,即把str转成其他形式。

  • choices - 可用的参数的容器(一般为列表),即参数值只能是里面的元素。

  • required - 此命令行选项是否必需,默认False
    (一般来说选项是可以被省略的,不然换为位置参数更好)。

  • help - 为此选项作用的简单描述,使用-h或--help可以看到。

parser.add_argument("x", type=float, help="一个数x")        # 添加位置参数xparser.add_argument("y", type=float, help="一个数y")        # 添加位置参数y# 添加选项-a, 把值存储为Trueparser.add_argument("-a", action="store_true", help="显示详细过程")# 添加选项-f,它的值知道能是[1, 2, 3]中的元素parser.add_argument("-f", default=1, choices=[1, 2, 3],                    type=int, help="保留小数点位数")# 添加选项-v 或 --version# 使用来自argparse.ArgumentParser的prog参数parser.add_argument("-v", "--version", action="version",                    version="%(prog)s 0.1", help="显示版本")

解析参数

通过parser.parse_args()解析,然后通过.的方式取值(无论位置参数还是选项)

# 解析args = parser.parse_args()print(args.x)print(args.a)print(args.f)

完整例子

一个计算两个数和的程序

import argparseparser = argparse.ArgumentParser(description="计算两个数的和", prog="SUM")parser.add_argument("x", type=float, help="一个数x")        # 添加位置参数xparser.add_argument("y", type=float, help="一个数y")        # 添加位置参数y# 添加选项-a, 把值存储为Trueparser.add_argument("-a", action="store_true", help="显示详细过程")# 添加选项-f,它的值知道能是[1, 2, 3]中的元素parser.add_argument("-f", default=1, choices=[1, 2, 3],                    type=int, help="保留小数点位数")# 添加选项-v 或 --version# 使用来自argparse.ArgumentParser的prog参数parser.add_argument("-v", "--version", action="version",                    version="%(prog)s 0.1", help="显示版本")# 解析args = parser.parse_args()# 计算并保留小数res = round(args.x + args.y, args.f)if args.a:    print("{x} + {y} = {res}".format(x=args.x, y=args.y, res=res))else:    print(res)

在命令行中使用:

$ python get_sum.py -husage: SUM [-h] [-a] [-f {1,2,3}] [-v] x y计算两个数的和positional arguments:  x              一个数x  y              一个数yoptional arguments:  -h, --help     show this help message and exit  -a             显示详细过程  -f {1,2,3}     保留小数点位数  -v, --version  显示版本$ python get_sum.py -vSUM 0.1$ python get_sum.py 3.14 5.969.1$ python get_sum.py 3.14 5.96 -a3.14 + 5.96 = 9.1$ python get_sum.py 3.14159 3.335 -f 3 -a 3.14159 + 3.335 = 6.477$ python get_sum.py usage: SUM [-h] [-a] [-f {1,2,3}] [-v] x ySUM: error: the following arguments are required: x, y

hashlib

hashlib是针对不同的安全哈希和消息摘要算法实现了一个通用的接口。

生成md5

import hashlibmd5 = hashlib.md5()# 输入的是字节串md5.update("test message".encode("utf-8"))res = md5.hexdigest()print(res)# c72b9698fa1927e1dd12d3cf26ed84b2

为md5加盐
所谓加盐就是update其他内容,改变md5的值,防止撞库。

import hashlibmd5 = hashlib.md5()# 输入的是字节md5.update("加盐".encode("utf-8"))md5.update("test message".encode("utf-8"))res = md5.hexdigest()print(res)# 3f5a030db81d9e5e83d2c8e7eba1965c

uuid

生成uuid4

import uuidprint(uuid.uuid4())# f1d50cdd-2f36-4db2-b788-ec4f2f08ce52

subprocess

subprocess 模块允许你生成新的进程,连接它们的输入、输出、错误管道,并且获取它们的返回码。
对于subprocess模块,我们只需要关注底层的Popen接口的使用方法即可。
常用参数:

  • args
    一般来说是命令,推荐使用列表的方式传入(有顺序)

  • shell
    True或False
    在 POSIX,当 shell=True, shell 默认为 /bin/sh
    在 Windows,当 shell=True,环境变量 COMSPEC 指定了默认 shell,执行命令时可以为True,但执行批处理文件或可执行文件时,不需要shell=True

  • stdinstdoutstderr
    分别指定了执行的程序的标准输入、输出和标准错误文件句柄
    它们的合法值一般有:

    1. 其他Popen对象的stdin/stdout/stderr

    2. subprocess.PIPE 表示打开标准流的管道

    3. None

    4. 文件对象

更加详细内容,请看官方文档

获取返回信息

  1. 使用subprocess.PIPE接收

  2. popen_obj.stdout.read().decode("xx") 的方式

当然也可以在stdout中传入文件对象,直接写入文件中

使用例子

import subprocess# 执行没有参数的subprocess.Popen(["dir"], shell=True, stdout=open("dir_res.txt", "w"))# 有参数# get_sum.py为argparse模块最后的例子command = "python get_sum.py 3.47 2.48 -a -f 2"res2 = subprocess.Popen(command.split(" "), shell=True, stdout=subprocess.PIPE)print(res2.stdout.read().decode("gbk"))  # 3.47 + 2.48 = 5.95# stdout作为stdinres3 = subprocess.Popen(["echo", "www.baidu.com"],                        shell=True, stdout=subprocess.PIPE)res4 = subprocess.Popen(["nslookup"], shell=True,                        stdin=res3.stdout, stdout=subprocess.PIPE)print(res4.stdout.read().decode("gbk"))"""默认服务器:  UnKnownAddress:  192.168.0.1> 服务器:  UnKnownAddress:  192.168.0.1名称:    www.baidu.comAddress:  182.61.200.7>"""

我的github
我的博客
我的笔记


  1. num1 > num2时为[num2, num1] ↩

(0)

相关推荐

  • mask rcnn训练自己的数据集

    前言 最近迷上了mask rcnn,也是由于自己工作需要吧,特意研究了其源代码,并基于自己的数据进行训练~ 本博客参考https://blog.csdn.net/disiwei1012/article ...

  • VB.NET 把引用的DLL打包到exe里面,制作绿色软件

    VB.NET 把引用的DLL打包到exe里面,制作绿色软件   今天以大家常用DLL'Newtonsoft.Json'为例给大家做个示范; 1.第一步新建项目 2.第二步,新建项目后,在窗体添加一个按 ...

  • (1条消息) python多进程并发与pool多线程

    一.多进程: 当计算机运行程序时,就会创建包含代码和状态的进程.这些进程会通过计算机的一个或多个CPU执行.不过,同一时刻每个CPU只会执行一个进程,然后不同进程间快速切换,给我们一种错觉,感觉好像多 ...

  • 做动态图表,没有数据?用Python就能获取!

    既然有了Python这个制作动态条形图工具,缺的那便是数据了. 先看一下B站2019年「数据可视化」版块的情况,第一个视频超2百万的播放量,4万+的弹幕. 小F自己在B站上制作的几个视频,也是几十万的 ...

  • C语言常用标准库解读

    有很多工程师喜欢自己封装一些标准库已有的函数,其实自己封装的函数,并不一定比标准库好,有时候反而代码更冗余,且有bug.下面就来分享一下C语言常见的一些标准库.标准头文件包括:<asset.h& ...

  • C语言这些常用的标准库(头文件),你不得不知道...

    有很多工程师喜欢自己封装一些标准库已有的函数,其实自己封装的函数,并不一定比标准库好,有时候反而代码更冗余,且有bug. 下面小编就来分享一下C语言常见的一些标准库. 标准头文件包括: <ass ...

  • Python3标准库:xml.etree.ElementTree XML操纵API

    作者:@小灰灰 本文为作者原创,转载请注明出处:https://www.cnblogs.com/liuhui0308/p/12570390.html 阅读目录(Content) 1. xml.etre ...

  • (8条消息) Python3.x标准模块库目录

    文本 1. string:通用字符串操作 2. re:正则表达式操作 3. difflib:差异计算工具 4. textwrap:文本填充 5. unicodedata:Unicode字符数据库 6. ...

  • 通信工程建设常用标准强制性条文汇编

    通信工程建设常用标准强制性条文汇编

  • 常用标准免费查阅平台汇总

    一.国家标准 1.国家标准全文公开系统  该系统收录现行有效强制性国家标准和推荐性国家标准.其中强制性国家标准中的非采标可在线阅读和下载,采标只可在线阅读:推荐性国家标准中的非采标可在线阅读,采标只提 ...

  • 食品行业常用标准汇总

    主要是食品行业常用标准,包括:通用基础标准:GB 2761-2017 食品安全国家标准 食品中真菌毒素限量.GB 2762-2017 食品安全国家标准 食品中污染物限量等:GB 4789系列食品卫生微 ...

  • 用Python标准库turtle画一头金牛,祝您新年牛气冲天!(附源码)

    今年是牛年,祝大家新年牛气冲天!嗨皮牛Year! 前几天在百度图片里下载了一张金牛的图片,就是封面的这张.想着用Python标准库turtle肯定可以画出这张图,所以说干就干,花两天时间实现了. 画图 ...

  • Python标准库模块之heapq

    该模块提供了堆排序算法的实现.堆是二叉树,最大堆中父节点大于或等于两个子节点,最小堆父节点小于或等于两个子节点. 创建堆 heapq有两种方式创建堆, 一种是使用一个空列表,然后使用heapq.hea ...