Python实用库记录

本文主要记录一些自己遇到的一些实用的Python库,今日开文,后面会不断积累

关于Python内置知识的记录可点击 Python内置知识记录

random

作用:生成随机数

  • random.randint(a, b)
    生成 [a,b][a, b] 范围内随机的整数
  • random.uniform(a, b)
    随机小数生成,生成[a,b][a,b]范围小数
  • random.random()
    生成一个 [0,1.0)[0,1.0) 范围内的随机浮点数
  • random.choice(sequence)
    从序列中随机获取一个元素,序列可以为 list, tuple, str
  • random.shuffle(list)
    将一个列表中的元素打乱,对列表的改变是永久性的

tqdm

作用:实时显示迭代、循环的执行的进度条

trange(i) 是对tqdm(range(i)) 特殊优化过的实例,是一种简单的写法。

from tqdm import tqdm, trange
ans = 0
for i in tqdm(range(1000)):
	for j in range(20000):
        ans += 1
for i in trange(1000):
    for j in range(20000):
        ans += 1

1 基于迭代对象

from tqdm import tqdm, trange
import time
lst = ['a', 'b', 'c', 'd', 'e']
tqdm_lst = tqdm(lst)
for element in tqdm_lst:
    # 前面添加描述
    tqdm_lst.set_description('Processing ' + element)
    time.sleep(0.2)

2 手动更新

就是自己可以设置进度数

# total表示总的进度数
with tqdm(total=100) as pbar:
    pbar.set_description("Processing ")

    for i in range(10):
        time.sleep(0.1)
        # 每次增加10个进度数
        pbar.update(10)
'''
  0%|          | 0/100 [00:00<?, ?it/s]
Processing :   0%|          | 0/100 [00:00<?, ?it/s]
Processing :  10%|█         | 10/100 [00:00<00:00, 98.22it/s]
Processing :  20%|██        | 20/100 [00:00<00:00, 98.66it/s]
Processing :  30%|███       | 30/100 [00:00<00:00, 98.88it/s]
Processing :  40%|████      | 40/100 [00:00<00:00, 99.09it/s]
Processing :  50%|█████     | 50/100 [00:00<00:00, 99.31it/s]
Processing :  60%|██████    | 60/100 [00:00<00:00, 99.35it/s]
Processing :  70%|███████   | 70/100 [00:00<00:00, 99.28it/s]
Processing :  80%|████████  | 80/100 [00:00<00:00, 99.27it/s]
Processing :  90%|█████████ | 90/100 [00:00<00:00, 99.27it/s]
Processing : 100%|██████████| 100/100 [00:01<00:00, 99.17it/s]
Processing : 100%|██████████| 100/100 [00:01<00:00, 99.15it/s]
'''
# tqdm的参数解析
class tqdm(object):
  def __init__(self, iterable=None, desc=None, total=None, leave=False,
               file=sys.stderr, ncols=None, mininterval=0.1,
               maxinterval=10.0, miniters=None, ascii=None,
               disable=False, unit='it', unit_scale=False,
               dynamic_ncols=False, smoothing=0.3, nested=False,
               bar_format=None, initial=0, gui=False):

iterable :可迭代对象,手动更新时不需要设置
desc: 字符串,左边进度条的描述文字
total:总的项目数
leave:结束后是否保留进度条

# total表示总的进度数
with tqdm(total=100, desc="Processing", leave=True) as bar:
    for i in range(10):
        time.sleep(0.1)
        # 每次增加10个进度数
        bar.update(10)

argparse

作用:命令行参数解析,使用python命令行执行py文件时,可以在命令行传入指定参数,此库就可以进行解析

from argparse import ArgumentParser
parse = ArgumentParser() # 初始化器
# 此形式的命令: python name.py --json_path path
parse.add_argument("--json_path", "-p", dest="json_path", default=None) # 命令行传入的参数
parse.add_argument("--save_path", dest="save_path", default=None) # 可以传入多个参数
args = parse.parse_args()
# 使用相关参数
json_path = args.json_path
save_path = args.save_path

add_argument参数解析:

  • name or flags - 选项字符串的名字或者列表,例如 foo 或者 -f, --foo,我们一般写两个,一个长参数,一个短参数
  • type - 命令行参数应该被转换成的类型
  • default - 不指定参数时的默认值
  • help - 参数的帮助信息
  • action - 命令行遇到参数时的动作
    • store_True,表示赋值为const,如果命令行指定了参数,默认值为True,否则为False
    • append,将遇到的值存储成列表,也就是如果参数重复则会保存多个值
    • append_const,将参数规范中定义的一个值保存到一个列表
    • count,存储遇到的次数

loguru

作用:在程序中打印相关日志信息,有助于调试代码
loguru提供了七层日志层级,或者说七种日志类型。

from loguru import logger
logger.trace("A trace message.")
logger.debug("A debug message.")
logger.info("An info message.")
logger.success("A success message.")
logger.warning("A warning message.")
logger.error("An error message.")
logger.critical("A critical message.")
'''
2022-08-10 11:58:33.224 | DEBUG | __main__:<module>:12 - A debug message.
2022-08-10 11:58:33.224 | INFO | __main__:<module>:13 - An info message.
2022-08-10 11:58:33.225 | SUCCESS | __main__:<module>:14 - A success message.
2022-08-10 11:58:33.226 | WARNING | __main__:<module>:15 - A warning message.
2022-08-10 11:58:33.226 | ERROR | __main__:<module>:16 - An error message.
2022-08-10 11:58:33.227 | CRITICAL | __main__:<module>:17 - A critical message.
'''

TRACE (5): 用于记录程序执行路径的细节信息,以进行诊断。
DEBUG (10): 开发人员使用该工具记录调试信息。
INFO (20): 用于记录描述程序正常操作的信息消息。
SUCCESS (25): 类似于INFO,用于指示操作成功的情况。
WARNING (30): 警告类型,用于指示可能需要进一步调查的不寻常事件。
ERROR (40): 错误类型,用于记录影响特定操作的错误条件。
CRITICAL (50): 严重类型,用于记录阻止核心功能正常工作的错误条件。

from loguru import logger

for id in range(5):
    logger.info(f"id: {id}")
''' 结果
2024-02-01 09:54:01.537 | INFO     | __main__:<module>:4 - id: 0
2024-02-01 09:54:01.537 | INFO     | __main__:<module>:4 - id: 1
2024-02-01 09:54:01.537 | INFO     | __main__:<module>:4 - id: 2
2024-02-01 09:54:01.538 | INFO     | __main__:<module>:4 - id: 3
2024-02-01 09:54:01.538 | INFO     | __main__:<module>:4 - id: 4
'''

typing

参考: typing详解

1 基础类型注解

作用:用于元素类型的注解,为python程序提供静态类型检查。

# 下面的函数定义就代表第一个参数是str类型,第二个参数为int类型,返回值为str类型
def func(p1: str, p2: int) -> str:
	pass

2 其他注解

常见的注解还有 List, Tuple, Dict, Sequenct 等,分别代表列表、元组、字典、序列

# 对象a为列表,列表中元素类型可以为int或者float
a: List[int or float] = [1, 2.5]
# 对象b为元组,元组对应的类型分别为str,int,float
b: Tuple[str, int, float] = ('name', 18, 1.80)

2.1 Dict, Mappint

Dict、字典,是 dict 的泛型;Mapping,映射,是 collections.abc.Mapping 的泛型。
根据官方文档,Dict 推荐用于注解返回类型,Mapping 推荐用于注解参数。它们的使用方法都是一样的,其后跟一个中括号,中括号内分别声明键名、键值的类型。

def size(rect: Mapping[str, int]) -> Dict[str, int]:
    return {'width': rect['width'] + 100, 'height': rect['width'] + 100}

2.2 Set, AbstractSet

Set、集合,是 set 的泛型;AbstractSet、是 collections.abc.Set 的泛型。根据官方文档,Set 推荐用于注解返回类型,AbstractSet 用于注解参数。

2.3 Sequence

Sequence,是 collections.abc.Sequence 的泛型,在某些情况下,我们可能并不需要严格区分一个变量或参数到底是列表 list 类型还是元组 tuple 类型,我们可以使用一个更为泛化的类型,叫做 Sequence,其用法类似于 List

2.4 Union

联合类型,Union[X, Y] 代表要么是 X 类型,要么是 Y 类型。
联合类型的联合类型等价于展平后的类型:

Union[Union[int, str], float] == Union[int, str, float]

pathlib

作用:处理路径相关的操作,系统内置标准库,老版本是用的 os.path,问题较多,直接用新的 pathlib,具有诸多优势。

from pathlib import Path

1 常见方法

Path 指的是 Path实例化之后的对象

方法 作用
Path.cwd() 获取当前工作目录
Path.home() 获取当前用户目录
Path.rename() 重命名操作
Path.mkdir() 创建目录操作
Path.exists() 判断是否存在
Path.is_dir() 判断是否为目录
Path.is_file() 判断是否为文件
Path.is_symlink() 判断是否为链接

2 一些常用的文件属性

from pathlib import Path
p = Path(__file__)  # 当前文件路径
print(p.absolute()) # 获取绝对路径
print(p.resolve())  # 获取绝对路径
print(p.name)       # 获取文件名称 '1.py'
print(p.stem)       # 只要文件名,不要后缀 '1'
print(p.suffix)     # 获取文件后缀 '.py'
print(p.suffixes)   # 文件所有的后缀 ['.py']
print(p.parts)      # 拆分路径返回元组,('C:\\', 'Users', 'dell', 'Desktop', '1.py')
print(p.parent)     # 返回上层目录 C:\Users\dell\Desktop
print(p.parent.parent)  # C:\Users\dell
print(p.parents)    # 所有的父级 <WindowsPath.parents>
print(p.anchor)     # 锚,目录前面的部分 C:\ 或者 /

3 目录拼接

  • 使用 / 拼接
from pathlib import Path
p = Path('./') # 当前文件路径
path = p / 'files' / 'new_file'
  • 使用函数方法
p = Path('./')
print(p.absolute()) # C:\Users\dell\Desktop
# files\new_file
print(p.joinpath('files', 'new_file'))

# C:\Users\dell\Desktop\files\new_file
print(p.joinpath('files', 'new_file').absolute()) 

4 目录遍历

from pathlib import Path
p = Path('./') # 当前工作目录
for path in p.iterdir():
	print(path.absolute())

只获取文件夹

from pathlib import Path

# 当前文件路径
p = Path('./')
print([i for i in p.iterdir() if i.is_dir()]) 

多线程

推荐使用 concurent.futures.ProcessPoolExecutor 替代 multiprocessing.Pool ,前者更容易使用,有更友好的报错提示。

streamlit:快速开发可视化界面


   转载规则


《Python实用库记录》 行码棋 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
Linux知识收集 Linux知识收集
本文记录一些Linux相关的知识点,用来精进自己的Linux操作。 Shell输出输入重定向 默认情况下,总是有三个文件处于打开状态,标准输入(键盘输入)、标准输出(输出到屏幕)、标准错误(也是输出到屏幕),它们分别对应的文件描述符是
2024-01-30 2024-03-08
下一篇 
Hexo踩坑实记 Hexo踩坑实记
Hexo踩坑实记 自从使用了Hexo框架搭建博客,我就经历了诸多苦难,很多需要修改的地方,一步步踩坑过来,今天希望一一进行记录。 主题自定义修改 1 代码块修改 由于我Hexo最近升级到了 7.0 版本,新版本自带了 prismjs
2024-01-12 2024-02-20
  目录