python3常用标准库趁着有时间,把一些我用过的常用标准库进行整理和复习。 time
常用时间占位符
![]() time库各方法关系 datetime虽然python库中已经有了time库,但time库不支持对时间的加减等操作,因此就有了datetime库。
有了以上几个方法,我们就可以对时间进行加减操作,并可以在time和datetime之间进行转换。
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可以生成伪随机数。
生成验证码例子: 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 res print(make_code(9)) syssys模块提供了一些与解释器相关的变量和函数。
os一般用于对文件和目录进性操作的模块。 路径相关
文件/目录操作
输出符号
pathpath是os库中的一个模块,里面有很多实用的函数。
shutilshutil模块提供了一系列对文件和文件集合的高阶操作。 特别是提供了一些支持文件拷贝和删除的函数。 拷贝操作
删除操作
移动操作
jsonjson模块可以把python基本数据类型与json数据进行转换。
扩展json
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 pickle dic = {'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']) shelveshelve" 是一种持久化的类似字典的对象,只有open方法,比pickle简单。 import shelve d = 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 d print(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'] = temp print(d["data"]) # [1, 2, 3, 4]# close掉,可以使用上下文管理协议d.close() xmlxml也是一个可以跨语言的数据交换协议,但使用起来没有json简单,由于xml诞生的时间比json早,所以至今还有一些公司正在使用。 生成xml步骤:
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文件进行操作,用的是 import xml.etree.ElementTree as ET tree = ET.parse("./test.xml") root = tree.getroot()
查看
遍历/查找
修改
删除
struct此模块可以执行 Python 值和以 Python bytes 对象表示的 C 结构之间的转换。 这可以被用来处理存储在文件中或是从网络连接等其他来源获取的二进制数据。
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'>
re正则表达式是用来描述字符或字符串的特殊符号,在python中用re模块实现,正则表达式模式被编译成一系列的字节码,用 C 编写的匹配引擎执行。 元字符正则表达式语言由两种基本字符类型组成:原义(正常)文本字符和元字符,元字符实质上就是有特殊含义的字符。
方法查找
分割
替换
匹配对象(
去括号优先级 import re res = re.findall(r"(abc)+", "abcabcabc") print(res) # ['abc'] 其匹配结果是["abc"],而非["abcabcabc"],这是因为括号的优先级高,假如要括号与后面的元字符相结合的化可以使用以下方法: import re res = re.findall(r"(?:abc)+", "abcabcabc") print(res) # ['abcabcabc'] 匹配原理 logging关于日志管理的基本教程,请点击这里 关于使用日志的流程,大约有以下步骤:
注意 打印到终端打印到终端是开发过程中的一个实用的方法。 import logging logging.basicConfig() logging.debug("debug messages") logging.info("info messages") logging.warning("warning messages") logging.error("error messages") logging.critical("critical messages") 由于默认日志级别为WARNING,所以只在终端显示了后三行信息 写入文件为 import logging logging.basicConfig(filename="test.log") logging.debug("debug messages") logging.info("info messages") logging.warning("warning messages") logging.error("error messages") logging.critical("critical messages")
多模块使用在多个模块中 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 修改日志级别日志级别从低到高:
修改日志级别要用到 CRITICAL = 50FATAL = CRITICAL ERROR = 40WARNING = 30WARN = WARNING INFO = 20DEBUG = 10NOTSET = 0 例子: import logging logging.basicConfig(level=logging.INFO) logging.warning("start function") 从命令行中接收日志级别使用 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 error ERROR:root:error messages CRITICAL:root:critical messages $ python test.py --log info INFO:root:info messages WARNING:root:warning messages ERROR:root:error messages CRITICAL:root:critical messages configparserconfigparser库是python的配置文件管理模块,其所用结构与 INI 文件的类似。 写步骤:
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()中,可以直接用
删操作
argparseargparse是python推荐的命令行参数解析模块,argparse基于optparse(3.2版中已经被弃用),所以两者用法类似。
创建解析器parser = 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() print(args.x) print(args.a) print(args.f) 完整例子一个计算两个数和的程序 import argparse parser = 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 -h usage: SUM [-h] [-a] [-f {1,2,3}] [-v] x y 计算两个数的和 positional arguments: x 一个数x y 一个数y optional arguments: -h, --help show this help message and exit -a 显示详细过程 -f {1,2,3} 保留小数点位数 -v, --version 显示版本 $ python get_sum.py -v SUM 0.1 $ python get_sum.py 3.14 5.96 9.1 $ python get_sum.py 3.14 5.96 -a 3.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 y SUM: error: the following arguments are required: x, y hashlibhashlib是针对不同的安全哈希和消息摘要算法实现了一个通用的接口。 生成md5 import hashlib md5 = hashlib.md5()# 输入的是字节串md5.update("test message".encode("utf-8")) res = md5.hexdigest() print(res)# c72b9698fa1927e1dd12d3cf26ed84b2 为md5加盐 import hashlib md5 = hashlib.md5()# 输入的是字节md5.update("加盐".encode("utf-8")) md5.update("test message".encode("utf-8")) res = md5.hexdigest() print(res)# 3f5a030db81d9e5e83d2c8e7eba1965c uuid生成uuid4 import uuid print(uuid.uuid4())# f1d50cdd-2f36-4db2-b788-ec4f2f08ce52 subprocesssubprocess 模块允许你生成新的进程,连接它们的输入、输出、错误管道,并且获取它们的返回码。
更加详细内容,请看官方文档 获取返回信息
使用例子 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"))""" 默认服务器: UnKnown Address: 192.168.0.1 > 服务器: UnKnown Address: 192.168.0.1 名称: www.baidu.com Address: 182.61.200.7 > """
|
|