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

 

 

 

 

 

 

 

 
 

posted on 2019-12-12 22:39  xpc199151  阅读(587)  评论(0编辑  收藏  举报

导航