python路径操作
路径操作模块
3.4版本之前
os.path模块
from os import path p = path.join("/xpc","sysconfig","network")#构建一个目录,它和存在不存在是两回事。 print(type(p),p) print(path.exists(p)) print(path.split(p))#(head,tail) print(path.abspath("."))#绝对路径,点代表当前路径 p = path.join("f:/",p,"test.txt") print(path.dirname(p)) print(path.basename(p)) print(path.splitdrive(p)) p1 = path.abspath(__file__) print(p1,path.basename(p1)) while p1!=path.dirname(p1): p1=path.dirname(p1) print(p1,path.basename(p1)) 结果为: <class 'str'> /xpc\sysconfig\network False ('/xpc\\sysconfig', 'network') C:\Users\Administrator\PycharmProjects\studytset\xpc1 f:/xpc\sysconfig\network test.txt ('f:', '/xpc\\sysconfig\\network\\test.txt') C:\Users\Administrator\PycharmProjects\studytset\xpc1\test2.py test2.py C:\Users\Administrator\PycharmProjects\studytset\xpc1 xpc1 C:\Users\Administrator\PycharmProjects\studytset studytset C:\Users\Administrator\PycharmProjects PycharmProjects C:\Users\Administrator Administrator C:\Users Users C:\
3.4版本开始
建议使用pathlib模块,提供path对象来操作。包括目录和文件。
pathlib模块
from pathlib import Path(首字母大写)
目录操作
初始化
from pathlib import Path p = Path()#当前目录 print(p) p = Path("a","b","c/d")#当前目录下的a/b/c/d print(p) p = Path("/xpc")#跟下的xpc目录 print(p) 结果为: . a\b\c\d \xpc
from pathlib import Path p = Path()#当前目录 print(p,type(p))#window和Linux不一样 print(p.absolute())#绝对路径 print(p.joinpath("a","b"))#a/b,它创建了一个新的,所以要用需要创建一个新的对象接着 p = Path("a","b","c/d")#当前目录下的a/b/c/d print(p,p.absolute()) p=p/"e"/"f"#不带p会出错。需要带个对象。 print(p) p/="g" print(p) p = Path("/xpc")#跟下的xpc目录 print(p,p.absolute()) 结果为: . <class 'pathlib.WindowsPath'> C:\Users\Administrator\PycharmProjects\studytset\xpc1 a\b a\b\c\d C:\Users\Administrator\PycharmProjects\studytset\xpc1\a\b\c\d a\b\c\d\e\f a\b\c\d\e\f\g \xpc C:\xpc
路径拼接和分解
操作符/
path对象/path对象
path对象/字符串 或者 字符串/path对象
分解
parts属性,可以返回路径中的每一个部分
joinpath
joinpath(*other)连接对个字符串到Path对象中。
from pathlib import Path p = Path()#当前目录 p = p/"a" p1 = "b"/p p2 = Path("c") p3 = p2/p1 print(p3.parts) p4 = p3.joinpath("etc","init.d",Path("httpd")) print(p4) 结果为: ('c', 'b', 'a') c\b\a\etc\init.d\httpd
获取路径
str获取路径字符串
bytes获取路径字符串的bytes
from pathlib import Path p = Path("/xpc") print(str(p),bytes(p)) 结果为: \xpc b'\\xpc'
父目录
parent目录的逻辑父目录
parents父目录序列,索引0是直接的父。
from pathlib import Path p = Path("/a/b/c/d") print(p.parent) print(p.parent.parent) for x in p.parents: print(x) 结果为: \a\b\c \a\b \a\b\c \a\b \a \
from pathlib import Path p = Path("/a/b/c/d") print(p.parent.parent) for x in p.parents:#可迭代对象 print(x) 结果为: \a\b \a\b\c \a\b \a \
name、stem、suffix、suffixes、with_suffix(suffix)、with_name(name)
name目录的最后一个部分
suffix目录中最后一个部分的扩展名
stem 目录最后一个部分,没有后缀。
suffixes返回多个扩展名列表
with_suffix(suffix)补充扩展名到路径尾部,返回新的路径,扩展名存在则无效。
with_name(name)替换目录最后一个部分并返回一个新的路径。
from pathlib import Path p = Path("/xpc/mysqlubstkk/mysql.tar.gz") print(p.name) print(p.suffix) print(p.suffixes) print(p.stem) print(p.with_name("mysql-5.tgz")) p = Path("README") print(p.with_suffix(".txt")) 结果为: mysql.tar.gz .gz ['.tar', '.gz'] mysql.tar \xpc\mysqlubstkk\mysql-5.tgz README.txt
from pathlib import Path p = Path("/xpc/mysqlubstkk/mysql.tar.gz") print(p.name) print(p.suffix) print(p.suffixes) print(p.stem) print(p.with_name("mysql-5.tgz")) p = Path("README") print(p.with_suffix(".txt"))#变成了新路径 结果为: mysql.tar.gz .gz ['.tar', '.gz'] mysql.tar \xpc\mysqlubstkk\mysql-5.tgz README.txt
cwd()返回当前工作目录
home()返回当前家目录
is_dir()是否是目录,目录存在返回True。
is_file()是否是普通文件,文件存在返回True。
is_symlink()是否是软链接
is_socket()是否是socket文件。
is_block_device()是否是块设备
is_char_device()是否是字符设备
is_abslolute()是否是绝对路径
resolve()返回一个新的路径,这个新路径就是当前Path对象的绝对路径,如果是软链接则直接被解析。
absolute()也可以获取绝对路径,但是推荐使用resolve()
exists()目录或文件是否存在。
rmdir()删除空目录,没有提供判断目录为空的方法。
touch(mode = 0o666,exist_ok = True)创建一个文件
as_uri()将路径返回成URI,例如“file:///etc/passwd”
mkdir(mode = 0o777,parents = False,exist_ok = False)
parents,是否创建父目录,True等同于mkdir -p;False时,父目录不存在,则抛出FileNotFoundError。
exist_ok参数,在3.5版本加入。False时,路径存在,抛出FileExitsError;True时,FileExistError被忽略。
iterdir()迭代当前目录,返回一个生成器对象。
from pathlib import Path p = Path() p /="a/b/c/d" print(p.exists()) #创建目录 #p.mkdir()#FileNotFoundError: [WinError 3] 系统找不到指定的路径。: 'a\\b\\c\\d' p.mkdir(parents=True) print(p.exists()) p.mkdir(parents=True) p.mkdir(parents=True,exist_ok=True) P /= "readme.txt" p.parent.rmdir() p.parent.exists() p.mkdir() p.mkdir(parents=True) #遍历,并判断文件类型,如果是目录是否可以判断其是否为空? for x in p.parents[len(p.parents)-1].iterdir(): print(x,end="\t") if x.is_dir(): flag = False for _ in x.iterdir(): flag = True break #for循环是否可以使用else子句 print("dir","not empty" if flag else "empty",sep="\t") elif x.is_file(): print("file") else: print("other file")
通配符
glob(pattern)通配给定的模式,返回一个生成器。
rglob(pattern)通配给定的模式,递归目录
返回一个生成器。
from pathlib import Path p = Path() print(p) print(p.cwd())#当前工作目录 print(p.home()) print(p.is_dir())#是否是目录 print(p.is_file()) print(p.is_absolute()) print(p.absolute()) print(p.resolve())#要求对应的路径要存在 print(p.exists()) print(list(Path().glob("t*"))) print(list(Path().glob("*.py"))) print(list(Path().glob("**/*..py")))#相对当前路径,里面所有的。py文件。和rglob等价、 print(Path("a/b.py").match("*.py")) print(Path("a/b/c.py").match("*.py")) 结果为: . F:\project C:\Users\xpc True False False F:\project F:\project True [WindowsPath('test.py'), WindowsPath('test1.py')] [WindowsPath('test.py'), WindowsPath('test1.py'), WindowsPath('xyz.py')] [] True True
匹配
match(pattern)
模式匹配
from pathlib import Path print(Path("a/b.py").match("*.py")) print(Path("a/b/c.py").match("b/*.py")) print(Path("a/b/c.py").match("a/*.py")) print(Path("a/b/c.py").match("a/*/*.py")) print(Path("a/b/c.py").match("a/**/*.py")) print(Path("a/b/c.py").match("**/*.py")) 结果为: True True False True True True
start()相当于start命令。
lstat()同stat(),但如果是符号链接,则显示符号链接本身的文件信息。
from pathlib import Path p = Path("test.py") print(p.stat()) #p1 = Path("t") #p1.stat() print(p.lstat()) 结果为: os.stat_result(st_mode=33206, st_ino=844424930132020, st_dev=870516, st_nlink=1, st_uid=0, st_gid=0, st_size=111, st_atime=1575817742, st_mtime=1576161010, st_ctime=1575817742) os.stat_result(st_mode=33206, st_ino=844424930132020, st_dev=870516, st_nlink=1, st_uid=0, st_gid=0, st_size=111, st_atime=1575817742, st_mtime=1576161010, st_ctime=1575817742)
文件操作
以“wt”方式写入字符串大路径对应文件。
上面的方法使用应该注意,建议使用内建open方法。
from pathlib import Path p = Path("my_binary_file") p.write_bytes(b"binary file conents") print(p.read_bytes()) P = Path("my_test_file") p.write_text("xpc") print(p.read_text()) p = Path("f:/test.py") p.write_text("hello python") print(p.read_text()) with p.open() as f: print(f.read(5)) 结果为: b'binary file conents' xpc hello python hello