zh_docs: pathlib
如果以前从未使用过此模块或者不确定在项目中使用哪一个类是正确的,则
Path
总是适用的。它在运行代码的平台上实例化为一个 具体路径 ;纯路径对象提供了不实际访问文件系统的路径处理操作, 有三种方式来访问这些类 : pathlib.PurePath, pathlib.PurePosixPath , pathlib.PureWindowsPath,无论当前正运行什么系统,都可以实例化这些类,因为它们提供的操作不做任何系统调用;
具体路径是纯路径的子类。除了后者提供的操作之外,它们还提供了对路径对象进行系统调用的方法。有三种方法可以实例化具体路径: pathlib.Path, pathlib.PosixPath, pathlib.WindowsPath; 只能实例化与当前系统风格相同的类,允许系统调用作用于不兼容的路径风格可能在应用程序中导致缺陷或失败;
常用的方法和属性 | 说明 | |
---|---|---|
PurePath.name | 表示最后一个路径组件的字符串,排除了驱动器与根目录(如果存在) | |
PurePath.suffix | 最后一个组件的文件扩展名(如果存在) | |
PurePath.stem | 最后一个路径组件,除去后缀 | |
PurePath.parent | 此路径的逻辑父路径 | |
PurePath.parents | 提供对路径逻辑祖先的访问的不可变序列 | |
PurePath.is_absolute() | -> boolean 返回此路径是否为绝对路径 | |
PurePath.joinpath(*other) | 调用此方法等同于将每个 other 参数中的项目连接在一起 | |
PurePath.match(pattern) | -> boolean 将此路径与提供的通配符风格的模式匹配 | |
PurePath.with_name(name) | 返回一个新的路径并修改 name 。如果原本路径没有 name,将会引发ValueError |
|
PurePath.with_suffix(suffix) | 返回一个新的路径并修改 suffix 。如果原本的路径没有后缀,新的 suffix 则被追加以代替。如果 suffix 是空字符串,则原本的后缀被移除 |
|
---------------------------------------- | ------------------------------------------------------------------------------------------------ | |
Path.cwd() | 返回一个新的表示当前目录的路径对象(和 os.getcwd() 返回的相同) |
|
Path.home() | 返回一个表示当前用户家目录的新路径对象(和 os.path.expanduser() 构造含 ~ 路径返回的相同) |
|
Path.stat() | 返回此路径的信息(类似于 os.stat() ) |
|
Path.chmod() | 改变文件的模式和权限,和 os.chmod() 一样 |
|
Path.exists() | -> boolean 此路径是否指向一个已存在的文件或目录 | |
Path.iterdir() | 当路径指向一个目录时,产生该路径下的对象的路径,可用于迭代 | |
Path.glob() | -> generator 解析相对于此路径的通配符 pattern,产生所有匹配的文件 | |
Path.rglob() | -> generator 对此目录以及所有子目录递归匹配 | |
Path.is_dir() | -> boolean | |
Path.is_file() | -> boolean | |
Path.mkdir() | 新建给定路径的目录 | |
Path.open() | 打开路径指向的文件,就像内置的 open() 函数所做的一样 |
|
Path.read_text() | 以字符串形式返回路径指向的文件的解码后文本内容 | |
Path.write_text() | 将文件以文本模式打开,写入 data 并关闭 | |
Path.rename() | 使用给定的 target 将文件重命名,target 可以是一个字符串或者另一个路径对象 | |
Path.replace() | 使用给定的 target 重命名文件或目录。如果 target 指向现存的文件或目录,则将被无条件覆盖 | |
Path.resolve() | 将路径绝对化,解析任何符号链接。返回新的路径对象 | |
Path.rmdir() | 移除此目录,此目录必须为空的 | |
Path.unlink() | 移除此文件或符号链接。如果路径指向目录,则用 Path.rmdir() 代替 |
|
Path.touch() | 将给定的路径创建为文件 |
- 遍历目录文件,批量修改文件后缀名:
from pathlib import Path
def unify_ext_with_pathlib(path):
for fpath in Path(path).glob('*.csv'):
fpath.rename(fpath.with_suffix('.txt'))
# -------------------------------------
import os
def unify_ext_with_os(path='.'):
if os.path.exists(path):
files = [file for file in os.listdir(path) if
file.endswith('.txt') and os.path.isfile(os.path.join(path, file))]
for file in files:
portion = os.path.splitext(file) # 分离文件名与扩展名
new_name = portion[0] + '.csv'
os.rename(file, new_name)
2.计算文件中字符串出现的次数,每次读取 8KB内容,接受的参数既可以是文件路径也可以是类文件对象,参照 xml.etree.ElementTree 模块 ElementTree.parse 方法;
def count_nine(source, block_size=8*1024):
close_source = False
# 通过判断 source 是否有 "read" 属性来判定它是不是“类文件对象”
if not hasattr(source,'read'):
source = open(source, mode='r')
close_source = True
count = 0
try:
while True:
chunk = source.read(block_size)
if not chunk: # 当文件没有更多内容时,read 调用将会返回空字符串
break
count += chunk.count('9') # 这一行要写在if之后
finally:
if close_source:
source.close()
return count