TOC

路径操作

    os.path是Python对操作系统的文件系统操作的一个模块,比如常见的创建、删除、修改文件夹或者文件,基本可以都可以使用os.path来进行管理,有如下使用方法;
os.path.abspath(path):返回绝对路径;
os.path.basename(path):返回文件名;
os.path.commonprefix(list):返回list(多个路径)中,所有path共有的最长的路径;
os.path.dirname(path):返回文件路径;
os.path.exists(path):路径存在则返回True,路径损坏返回False;
os.path.lexists: 路径存在则返回True,路径损坏也返回True;
os.path.expanduser(path):把path中包含的"~"和"~user"转换成用户目录;
os.path.expandvars(path):根据环境变量的值替换path中包含的"$name"和"${name}";
os.path.getatime(path):返回最近访问时间(浮点型秒数);
os.path.getmtime(path):返回最近文件修改时间;
os.path.getctime(path):返回文件 path 创建时间;
os.path.getsize(path):返回文件大小,如果文件不存在就返回错误;
os.path.isabs(path): 判断是否为绝对路径;
os.path.isfile(path):判断路径是否为文件;
os.path.isdir(path): 判断路径是否为目录;
os.path.islink(path):判断路径是否为链接;
os.path.ismount(path):判断路径是否为挂载点;
os.path.join(path1[, path2[, ...]]) 把目录和文件名合成一个路径;
os.path.normcase(path):转换path的大小写和斜杠;
os.path.normpath(path):规范path字符串形式;
os.path.realpath(path):返回path的真实路径;
os.path.relpath(path[, start]):从start开始计算相对路径;
os.path.samefile(path1, path2):判断目录或文件是否相同;
os.path.sameopenfile(fp1, fp2):判断fp1和fp2是否指向同一文件;
os.path.samestat(stat1, stat2):判断stat tuple stat1和stat2是否指向同一个文件;
os.path.split(path) :把路径分割成 dirname 和 basename,返回一个元组;
os.path.splitdrive(path):一般用在 windows 下,返回驱动器名和路径组成的元组;
os.path.splitext(path):分割路径中的文件名与拓展名;
os.path.splitunc(path):把路径分割为加载点与文件;
os.path.walk(path, visit, arg):遍历path,进入每个目录都调用visit函数,visit函数必须有3个参数(arg, dirname, names),dirname表示当前目录的目录名,names代表当前目录下的所有文件名,args则为walk的第三个参数;
os.path.supports_unicode_filenames:设置是否支持unicode路径名;

面向对象路径操作

    从Python3.4开始,推荐使用另一个路径操作模块,pathlib 它提供了一个专门的路径处理类,即Path,这个类就可以帮助我们构建一个所谓的路径对象,再也不需要提供各种字符串作为路径了;
    使用Path()默认会初始化一个为当前路径的对象,即".",想要知道这个"."代表的绝对路径也可以使用absolute获取,如下;
is_file:判断该路径是否是文件;
is_socket:判断该路径是否是套接字文件;
is_dir:判断该路径是否是文件夹;
is_char_device:判断path是否是字符设备
is_block_device:判断path是否块设备;
is_symlink:判断path是否是链接;
is_absolute:判断path是否是绝对路径;
is_fifo:判断path是否是管道;
touch:创建文件;
rmdir:删除目录;
rename:修改名称;
read_text:读取路径文件内容;
write_text:对路径文件写入数据;
mkdir:创建路径目录;
chmod:修改路径的权限;
glob:查找文件,支持通配符;
rglob:递归查找文件,支持通配符;
stat:路径文件/文件夹信息;
lstat:和stat一样,但是如果路径指向符号链接,则是返回符号链接而不是目标的信息;
unlink:删除连接;
exists:判断路径是否存在;
symlink_to:创建软连接;
parents:可迭代对象,为上级目录、上上级目录集合;
with_name:更换基名;
with_suffix:更换后缀名;
group:取出当前路径的组名;
parent:取出当前路径的父目录;
lchmod:更改当前路径权限;
stem:获取文件名不包含拓展名;
absolute:取出绝对路径;
owner:取出路径的属主;
open:打开路径文件;
home:拿到当前用户的家目录路径;
joinpath:连接路径;
cwd:取出当前执行脚本路径的basename;
name:取出路径基名;
read_bytes:以bytes读取路径文件;
root:取出根目录路径;
as_uri:将路径转换为file:///形式;
drive:返回驱动器名称,主要面向 Windows 系统;
samefile:返回此目录是否指向与可能是字符串或者另一个路径对象的 other_path 相同的文件;
suffix:取出后缀名;
as_posix:打印出posix格式路径;
suffixes:打印出所有的后缀名,如cce.tar.gz那么结果就是.tar和.gz;
resolve:将路径绝对化,解析任何符号链接。返回新的路径对象;
anchor:获取顶级目录;
replace:将文件名目录重命名为给定的 target,并返回一个新的指向 target 的 Path 实例。 如果 target 指向一个现有文件或目录,则它将被无条件地替换;
iterdir:当路径指向一个目录时,产生该路径下的对象的路径,返回一个迭代器,内容为目录下的文件绝对路径;
parts:将路径各部分进行分解;
match:将此路径与提供的通配符风格的模式匹配,如果匹配成功则返回True,否则返回False;
relative_to:计算相对路径;
expanduser:展开~返回完整路径对象;
实例
    下面就结合上述的方法,来举出一些案例,如下;
from pathlib import Path
# 路径拼接
p=Path('/etc','networks','cce.tar.gz')
print(p) # /etc/networks/cce.tar.gz
# 递归创建目录
p=Path('/tmp/etc/sysconfig/networks')
p.mkdir(parents=True)
# 递归创建目录
p=Path('/tmp/etc/sysconfig/networks/cce.tar.gz')
p.parent.mkdir(parents=True)
# 直接打开文件
p=Path('/tmp/cce')
f=p.open(encoding='utf-8')
print(f.readline())
f.close()
# 直接打开文件
with p.open("r+") as f:
    print(f.readline())

shutil模块

    shutil高级文件操作模块主要用于拷贝文件,使用打开两个文件对象读取源文件内容,然后写入目标文件中来完成拷贝过程,但这样丢失了stat权限等信息,因为根本就没有复制这些信息过去;
copyfileobj:复制源文件对象到目标文件对象,是文件对象,并非文件本身,可以使用open创建一个文件对象,注意指针问题;
copyfile:复制源文件到目标文件;
copymode:复制权限信息;
copystat:复制元数据信息,也包括权限信息;
copy:复制源文件到目的文件,同时复制权限;
copy:复制源文件到目的文件,同时元数据信息,包括权限;
copytree:递归复制目录,src和dst必须都是目录,src必须存在,dst必须不存在;
rmtree:递归删除;
move:改名或移动文件,其实内部原理就是复制然后删除源文件;
chown:修改文件的属主和属组;
which:在Path环境变量下寻找指定的二进制文件;
copyfileobj方法
    copyfileobj拷贝的是文件对象,并非文件本身,我们如果在使用open打开文件时,一般都是源文件只读,目的文件可写的形式,copyfileobj也是这样,如下;
import shutil

f1=open('test','rb')  # 这里以二进制打开的原因是二进制打开文件,无需关心其编码等问题;
f2=open('test1','wb')
shutil.copyfileobj(f1,f2)
f1.close()
f2.close()
copytree方法
    copytree有一点用的比较好,就是其ignore参数,这个参数,根据源码解读来看,它接受一个两参函数,这个函数需要返回一个可迭代对象,但是不能是迭代器,源码里面是一个set,因为我们通过copytree的源码可以看到,使用了in语法,如果使用了迭代器,迭代器里面的元素会随着for循环的次数依次减少,因为迭代器不可逆;
def ignore_func(src, names):
    return {name for name in names if name.startswith('a')} # 使用集合解析式来实现,如果文件名称是以a开头,那么就作为集合元素
shutil.copytree('/tmp/cai', '/tmp/cfj', ignore=ignore_func)
# [cce@doorta ~] tree /tmp/cai
# └── chang
#     └── en
#         ├── age.txt
#         └── name.txt
# [cce@doorta ~] tree /tmp/cfj
# └── chang
#     └── en
#         └── name.txt

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注