Python实用用法

Python实用用法

路径操作:

​ Python中常用路径操作库包括os.pathpathlib.Path,都是 Python 中用于处理文件和目录路径的模块,但它们的设计哲学和使用方式存在显著区别:

  1. os.path
    • 是一个基于字符串的操作库,提供了许多函数来处理路径名,如连接路径、拆分路径、判断是否为绝对路径、获取目录/文件名等
    • 以过程式风格编写,所有操作返回的是字符串类型结果,需要手动拼接和管理路径对象,不支持跨平台的路径操作
  2. pathlib.Path
    • 是 Python 3.4 起引入的一个面向对象的库,提供了 Path 类,你可以创建 Path 对象表示文件或目录路径,通过类的方法进行各种路径操作
    • Path 对象可以方便地进行链式调用,比如 Path("/root").joinpath("dir", "file.txt"),这在代码可读性和简洁性上优于 os.path
    • 内置了对不同操作系统的支持,可以自动处理路径分隔符(Windows 上的反斜杠 \ 或 Unix-like 系统上的正斜杠 /

总之pathlib.Path的风格更加偏向 Pythonic,是更加推荐的一种方法

Pathlib的常用用法:

  • Path(path_string):这是最常用的,用于初始化一个Path对象

  • .joinpath(*other)/ 运算符:连接路径组件形成新的路径

  • .absolute():获取绝对路径版本

  • .parent.name.stem.suffix:用于获取路径的组成部分

  • .exists():判断路径指向的文件或目录是否存在

  • .is_file().is_dir():分别判断是否为文件或目录

  • .read_text(encoding=None, errors=None):以文本模式读取文件内容

  • .write_text(text, encoding=None, errors=None):将文本内容写入文件

  • .mkdir():创建目录

  • .iterdir():遍历当前目录中的所有子目录和文件

关于对象的常用操作:

  • dir():返回一个包含对象所有属性名(包括方法)的列表。这对于查看一个对象的所有可用属性非常有用

  • setattr(obj, name, value):设置对象obj中名为name的属性为value

  • delattr(obj, name):删除对象obj中名为name的属性

  • hasattr():检查对象是否具有指定名称的属性

  • id():返回对象的唯一标识符(内存地址),通常用来比较两个对象是否是同一个实例

  • vars() 返回对象的属性和属性值的字典表示。 当传入一个对象作为参数时,vars(obj) 会返回该对象的 __dict__ 属性,如果不提供参数调用则返回当前作用域局部变量和全局变量组成的字典

  • type() :返回对象的类型(即类)

Python 动态导入对象

importlib.import_module() 是 Python 标准库 importlib 模块中提供的一个函数,它用于在运行时动态地导入模块。这个函数允许你根据字符串参数来加载模块,而无需在程序开始时就静态地使用 import 语句导入。

函数签名如下:

1
importlib.import_module(name, package=None)
  • name:必填参数,是一个字符串,指定了要导入的模块的名称。它可以是绝对模块名(例如 'os')或相对模块名(例如 'package.submodule'),如果提供了 package 参数,则可以是相对于该包的模块名
  • package:可选参数,默认为 None,如果提供了该参数,那么 name 将被解释为相对于 package 指定包的相对模块名

当需要在运行时根据条件或用户输入动态决定导入哪个模块时,importlib.import_module() 非常有用。函数返回的是所导入模块的实际对象,这样就可以直接访问和调用模块中的属性和函数了

注:导入的搜索域是由 sys.path 表示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 导入 importlib 模块
import importlib

# 假设我们有一个模块名为 'my_package.my_submodule',并且该模块中定义了一个函数 `greeting`
# my_package/my_submodule.py 文件内容如下:
# def greeting(name):
# return f"Hello, {name}!"

# 动态导入 'my_package.my_submodule' 模块
module_name = "my_package.my_submodule"
module = importlib.import_module(module_name)

# 现在我们可以调用模块中的函数
result = module.greeting("World")
print(result) # 输出: Hello, World!

# 注意:通常情况下,如果 'my_package' 是一个包含子模块的包,那么在导入 'my_package' 包时它应该具有 __init__.py 文件。