对于文件路径名的操做在编程中是必不可少的,好比说,有时候要列举一个路径下的文件,那么首先就要获取一个路径,再就是路径名的一个拼接问题,经过字符串的拼接就能够获得一个路径名。Python中3.4版本前使用os.path模块中的函数来操做路径名;3.4版本开始提供pathlib模块,使用Path对象来对目录和文件进行操做。html
1 from os import path 2 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))
“/”操做符能够对两个Path对象进行拼接、字符串和Path对象或者Path对象和字符串进行拼接mysql
parts属性,能够返回路径中的每个部分sql
joinpath(*other)链接多个字符串到Path对象中编程
1 from pathlib import Path 2 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' / p 10 p2 = Path('c') 11 p3 = p2 / p1 12 print(p3.parts) 13 p3.joinpath('etc', 'init.d', Path('httpd'))
1 p = Path('/etc') 2 print(str(p), bytes(p))
1 p = Path('/a/b/c/d') 2 print(p.parent.parent) # 返回当前路径的父目录的父目录即/a/b 3 for x in p.parents: # 将当前路径的每一级的父目录序列化 4 print(x)
属性 | 含义 |
name | 目录的最后一个部分 |
stem | 目录最后一个部分,不包含后缀 |
suffix | 目录中最后一个部分的扩展名 |
suffixes | 返回多个扩展名列表 |
和以上四个属性相关的方法:windows
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
和文件类型相关的方法:socket
方法 | 功能 |
is_dir() | 是不是目录,目录存在返回True |
is_file() | 是不是普通文件,文件存在返回True |
is_symlink() | 是否软连接 |
is_socket() | 是不是socket文件 |
is_block_device() | 是不是块设备 |
is_char_device() | 是不是字符设备 |
is_absolute() | 是不是绝对路径 |
其余几种方法:ide
方法 | 功能 |
cwd() | 返回当前工做目录 |
home() | 返回当前家目录 |
resolve() | 返回一个新的路径,这个新路径就是当前Path对象的绝对路径。函数 若是是软连接则直接被解析url |
absolute() | 也能够获取绝对路径,可是推荐使用resolve() |
exists() | 判断目录或文件是否存在 |
rmdir() | 删除空目录。没有提供判断目录为空的方法 |
touch(mode=0o666,spa 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() | 迭代当前目录 |
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) # 成功
实现遍历,并判断文件类型,若是是目录是否能够判断其是否为空的代码:
1 for x in p.parents[len(p.parents)-1].iterdir(): 2 print(x, end='\t') 3 if x.is_dir(): 4 flag = False 5 for _ in x.iterdir(): 6 flag = True 7 break 8 print('dir','Not Empty' if flag else 'Empty', sep='\t') 9 elif x.is_file(): 10 print('file') 11 else: 12 print('other file')
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'方式写入字符串到路径对应文件 |
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))
原文出处:https://www.cnblogs.com/dabric/p/11757049.html