1 文件路径名操作

对于文件路径名的操作在编程中是必不可少的,比如说,有时候要列举一个路径下的文件,那么首先就要获取一个路径,再就是路径名的一个拼接问题,通过字符串的拼接就可以得到一个路径名。Python中3.4版本前使用os.path模块中的函数来操作路径名;3.4版本开始提供pathlib模块,使用Path对象来对目录和文件进行操作。

2 os.path模块

python文件名命名 规范 python中文件名_字符串

python文件名命名 规范 python中文件名_python中文件重命名_02

1 from os importpath2
3 p = path.join('/etc', 'sysconfig', 'network') #根据不同的系统,将每个字符串组合成路径形式
4 print(type(p), p)5 print(path.exists(p)) #判断路径在当前系统中是否存在
6 print(path.split(p)) #(head, tail)将路径中的最后一个目录或者文件与前面的路径分开
7 print(path.abspath('.')) #返回当前工作路径,'.'代表当前路径
8 p = path.join('o:/', p, 'test.txt')9 print(path.dirname(p)) #取目录名
10 print(path.basename(p)) #取基名
11 print(path.splitdrive(p)) #将盘符名和文件路径名分开(对于windows有盘符之分,在Linux中没有盘符)
12
13 p1 = path.abspath(__file__) #取当前文件所在的路径
14 print(p1, path.basename(p1))15 while p1 != path.dirname(p1): #每次取上级目录中的基名
16 p1 =path.dirname(p1)17 print(p1, path.basename(p1))

View Code

3 pathlib模块

3.1 目录操作

3.1.1 路径拼接和分解

操作符"/"对路径拼接

“/”操作符可以对两个Path对象进行拼接、字符串和Path对象或者Path对象和字符串进行拼接

parts属性

parts属性,可以返回路径中的每一个部分

joinpath

joinpath(*other)连接多个字符串到Path对象中

python文件名命名 规范 python中文件名_字符串

python文件名命名 规范 python中文件名_python中文件重命名_02

1 from pathlib importPath2
3 p = Path() #返回当前目录
4 p = Path('a', 'b', 'c/d') #当前目录下的a/b/c/d
5 p = Path('/etc') #返回根下的etc目录
6
7 p =Path()8 p = p / 'a'
9 p1 = 'b' /p10 p2 = Path('c')11 p3 = p2 /p112 print(p3.parts)13 p3.joinpath('etc', 'init.d', Path('httpd'))

View Code

3.1.2 获取路径

str获取路径字符串

bytes获取路径字符串的bytes

python文件名命名 规范 python中文件名_字符串

python文件名命名 规范 python中文件名_python中文件重命名_02

1 p = Path('/etc')2 print(str(p), bytes(p))

View Code

3.1.3 获取路径中的父目录

parent属性返回目录的逻辑父目录

parents属性返回父目录序列,索引0是直接的父目录

python文件名命名 规范 python中文件名_字符串

python文件名命名 规范 python中文件名_python中文件重命名_02

1 p = Path('/a/b/c/d')2 print(p.parent.parent) #返回当前路径的父目录的父目录即/a/b
3 for x in p.parents: #将当前路径的每一级的父目录序列化
4 print(x)

View Code

3.1.4 其他属性及方法

属性

含义

name

目录的最后一个部分

stem

目录最后一个部分,不包含后缀

suffix

目录中最后一个部分的扩展名

suffixes

返回多个扩展名列表

和以上四个属性相关的方法:

with_suffix(suffix)补充扩展名到路径尾部,返回新的路径,扩展名存在则修改之

with_name(name)替换目录最后一个部分并返回一个新的路径

python文件名命名 规范 python中文件名_字符串

python文件名命名 规范 python中文件名_python中文件重命名_02

1 p = Path('/viktor/mysqlinstall/mysql.tar.gz')2 print(p.name) #mysql.tar.gz
3 print(p.suffix) #.gz
4 print(p.suffixes) #['.tar', '.gz']
5 print(p.stem) #mysql.tar
6 print(p.with_name('mysql-5.tgz')) #/viktor/mysqlinstall/mysql-5.tgz
7 p = Path('README')8 print(p.with_suffix('.txt')) #README.txt

View Code

和文件类型相关的方法:

方法

功能

is_dir()

是否是目录,目录存在返回True

is_file()

是否是普通文件,文件存在返回True

is_symlink()

是否软链接

is_socket()

是否是socket文件

is_block_device()

是否是块设备

is_char_device()

是否是字符设备

is_absolute()

是否是绝对路径

其他几种方法:

方法

功能

cwd()

返回当前工作目录

home()

返回当前家目录

resolve()

返回一个新的路径,这个新路径就是当前Path对象的绝对路径。

如果是软链接则直接被解析

absolute()

也可以获取绝对路径,但是推荐使用resolve()

exists()

判断目录或文件是否存在

rmdir()

删除空目录。没有提供判断目录为空的方法

touch(mode=0o666,

exist_ok=True)

创建一个文件

as_url()

将路径返回成URL,例如'file:///etc/passwd'

mkdir(mode=0o777,

parents=False,

exists_ok=False)

parents参数是判断是否创建父目录,True等同于mkdir -p;

False时,父目录不存在,则抛出FileNotFoundError

exist_ok参数,在3.5版本加入。False时,路径存在,

抛出FileExistsError;True时,FileExistsError被忽略

iterdir()

迭代当前目录

python文件名命名 规范 python中文件名_字符串

python文件名命名 规范 python中文件名_python中文件重命名_02

1 p =Path()2 p /= 'a/b/c/d'
3 p.exists() #True
4
5 #创建目录
6 p.mkdir() #如果p对象的路径存在抛出FileExistsError,否则抛出FileNotFoundError
7 p.mkdir(parents=True)8 p.exists() #True
9 p.mkdir(parents=Ture) #抛出FileExistsError
10 p.mkdir(parents=True, exist_ok=True) #忽略FileExistsError
11 p /= 'readme.txt'
12 p.parent.rmdir() #删除readme.txt的父目录,此时真实目录中已经不存在d目录
13 p.parent.exists() #False 'a/b/c'
14 p.mkdir() #FileNotFoundError
15 p.mkdir(parent=True) #成功

View Code

实现遍历,并判断文件类型,如果是目录是否可以判断其是否为空的代码:

python文件名命名 规范 python中文件名_字符串

python文件名命名 规范 python中文件名_python中文件重命名_02

1 for x in p.parents[len(p.parents)-1].iterdir():2 print(x, end='\t')3 ifx.is_dir():4 flag =False5 for _ inx.iterdir():6 flag =True7 break
8 print('dir','Not Empty' if flag else 'Empty', sep='\t')9 elifx.is_file():10 print('file')11 else:12 print('other file')

View Code

3.2 文件操作

pathlib中的Path还提供open(mode='r', buffering=-1, encoding=None, errors=None, newline=None)方法打开文件,其使用方法类似内建函数open,返回一个文件对象。Ptyhon3.5后pathlib模块新增加了一些方法,如下所示:

方法

功能

read_bytes()

以‘rb’读取路径对应文件,并返回二进制流

read_text(encoding=None,

errors=None)

以'rt'方式读取路径对应文件,返回文本

Path.write_bytes(data)

以'wb'方式写入数据到路径对应文件

write_text(data, encoding=None,

errors=None)

以'wt'方式写入字符串到路径对应文件

python文件名命名 规范 python中文件名_字符串

python文件名命名 规范 python中文件名_python中文件重命名_02

1 p = Path("my_binary_file")2 p.write_bytes(b'Binary file contents') #以'wb'形式向p路径对象写入数据
3 p.read_bytes()4
5 p = Path("my_text_file")6 p.write_text('Text file contents') #以'wt'形式向p路径对象写入数据
7 p.read_text()8
9 with p.open() as f:10 print(f.read(5))

View Code