python路径操作

Posted xpc199151

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

 

 

 

 

 

 

 
 

以上是关于python路径操作的主要内容,如果未能解决你的问题,请参考以下文章

iOS xcode 代码片段

[未解决问题记录]python asyncio+aiohttp出现Exception ignored:RuntimeError('Event loop is closed')(代码片段

C++ 代码片段(积累)

常用python日期日志获取内容循环的代码片段

python 有用的Python代码片段

Python 向 Postman 请求代码片段