python路径操作,,路径操作模块3.4版


路径操作模块

3.4版本之前

os.path模块

from os import pathp = 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\networkFalse(‘/xpc\\sysconfig‘, ‘network‘)C:\Users\Administrator\PycharmProjects\studytset\xpc1f:/xpc\sysconfig\networktest.txt(‘f:‘, ‘/xpc\\sysconfig\\network\\test.txt‘)C:\Users\Administrator\PycharmProjects\studytset\xpc1\test2.py test2.pyC:\Users\Administrator\PycharmProjects\studytset\xpc1 xpc1C:\Users\Administrator\PycharmProjects\studytset studytsetC:\Users\Administrator\PycharmProjects PycharmProjectsC:\Users\Administrator AdministratorC:\Users UsersC:\ 

3.4版本开始

建议使用pathlib模块,提供path对象来操作。包括目录和文件。

pathlib模块

from pathlib import Path(首字母大写

目录操作

初始化

from pathlib import Pathp = Path()#当前目录print(p)p = Path("a","b","c/d")#当前目录下的a/b/c/dprint(p)p = Path("/xpc")#跟下的xpc目录print(p)结果为:.a\b\c\d\xpc
from pathlib import Pathp = 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/dprint(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\xpc1a\ba\b\c\d C:\Users\Administrator\PycharmProjects\studytset\xpc1\a\b\c\da\b\c\d\e\fa\b\c\d\e\f\g\xpc C:\xpc

路径拼接和分解

操作符/

path对象/path对象

path对象/字符串 或者 字符串/path对象

分解

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

joinpath

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

from pathlib import Pathp = Path()#当前目录p = p/"a"p1 = "b"/pp2 = Path("c")p3 = p2/p1print(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 Pathp = Path("/xpc")print(str(p),bytes(p))结果为:\xpc b‘\\xpc‘

父目录

parent目录的逻辑父目录

parents父目录序列,索引0是直接的父。

from pathlib import Pathp = 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 Pathp = 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 Pathp = 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.tgzREADME.txt
from pathlib import Pathp = 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.tgzREADME.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 Pathp = 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 Pathp = 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:\projectC:\Users\xpcTrueFalseFalseF:\projectF:\projectTrue[WindowsPath(‘test.py‘), WindowsPath(‘test1.py‘)][WindowsPath(‘test.py‘), WindowsPath(‘test1.py‘), WindowsPath(‘xyz.py‘)][]TrueTrue

匹配

match(pattern)

模式匹配

from pathlib import Pathprint(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"))结果为:TrueTrueFalseTrueTrueTrue

start()相当于start命令。

lstat()同stat(),但如果是符号链接,则显示符号链接本身的文件信息。

from pathlib import Pathp = 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 Pathp = 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‘xpchello pythonhello

python路径操作

评论关闭