pyhon路径操作

路径操作模块

path.join

拼接路径

path.exists

判断路径是否存在

# os模块常用函数 os.path模块
from os import path

p = path.join('/etc', 'sysconfig', 'network')  # 拼接
print(type(p), p)
print(path.exists(p))  # 存在
"""
结果
<class 'str'> /etc\sysconfig\network
False
"""

path.split

对路径进行切割,得出一个路径和基名组成的元组

path.dirname

路径

path.basename

基名

print(path.split(p))  # 分割
print(path.dirname(p), path.basename(p))  # 路径和基名
"""
结果
('/etc\\sysconfig', 'network')
/etc\sysconfig network
"""

path.abspath

输出绝对路径

print(path.abspath(''), path.abspath('.'))  # 绝对路径

"""
结果
C:\Users\Administrator\Desktop\学习笔记\Python\代码 C:\Users\Administrator\Desktop\学习笔记\Python\代码
"""

path.splitdrive

输出磁盘和路径组成的元组

print(path.splitdrive('o:/temp/test'))  # windows方法
"""
结果
('o:', '/temp/test')
"""
#打印父目录
p1 = path.abspath(__file__)
print(p1)
while p1 != path.dirname(p1):
    p1 = path.dirname(p1)
    print(p1)
"""
结果
C:\Users\Administrator\Desktop\学习笔记\Python\代码\test.py
C:\Users\Administrator\Desktop\学习笔记\Python\代码
C:\Users\Administrator\Desktop\学习笔记\Python
C:\Users\Administrator\Desktop\学习笔记
C:\Users\Administrator\Desktop
C:\Users\Administrator
C:\Users
C:\
"""

Path类

from pathlib import Path

p = Path()
#WindowsPath('.')
p = Path('a', 'b', 'c/d')
#a\b\c\d
p = Path('/etc', Path('sysconfig'), 'network/ifcfg')
#\etc\sysconfig\network\ifcfg

路径拼接

操作符/

​ Path对象 / Path对象

​ Path对象 / 字符串

​ 字符串 / Path对象

p = Path()
p = p/'a'
p1 = 'b'/p
p2 = Path('c')
p3 = p2 / p1
print(p1, p2, p3)
print(p3.joinpath('d', 'e/f', Path('g/h')))
"""
结果
b\a c c\b\a
c\b\a\d\e\f\g\h
"""

分解

parts属性,会返回目录各部分的元组

p = Path('/a/b/c/d')
print(p.parts)
"""
结果
('\\', 'a', 'b', 'c', 'd')
"""

获取路径

str 获取路径字符串

bytes 获取路径字符串的bytes

p = Path('/etc')
print(str(p), bytes(p))
"""
结果
\etc b'\\etc'
"""

父目录

parent 目录的逻辑父目录

parents 父目录惰性可迭代对象,索引0是直接的父

from pathlib import Path

a = Path().absolute()
print(a)
print(a.parent)
for i in a.parents:
    print(i)
"""
结果

C:\Users\Administrator\Desktop\学习笔记\Python\代码
C:\Users\Administrator\Desktop\学习笔记\Python
C:\Users\Administrator\Desktop\学习笔记\Python
C:\Users\Administrator\Desktop\学习笔记
C:\Users\Administrator\Desktop
C:\Users\Administrator
C:\Users
C:\
"""

也可以通过cwd来获取当前父目录

Path.cwd()
Out[21]: WindowsPath('C:/Users/Administrator/Desktop/学习笔记/Python/代码')
print(a.parents[0])
"""
结果
C:/Users/Administrator/Desktop/学习笔记/Python
"""

目录组成部分

namestemsuffixsuffixeswith_suffix(suffix)with_name(name)

name 目录的最后一个部分

suffix 目录中最后一个部分的扩展名

stem 目录最后一个部分,没有后缀

name = stem + suffix

suffixes 返回多个扩展名列表

with_suffix(suffix) 有扩展名则替换,无则补充扩展名

with_name(name) 替换目录最后一个部分并返回一个新的路径

name路径的最后一部分
from pathlib import Path

a = Path('C:/Users/Administrator/Desktop/学习笔记/Python/代码/test.abc.py.zip')
print(a)
print(a.name)
"""
结果
C:\Users\Administrator\Desktop\学习笔记\Python\代码\test.abc.py.zip
test.abc.py.zip
"""
suffix路径最后一部分的后缀
print(a)
print(a.suffix)
"""
结果
C:\Users\Administrator\Desktop\学习笔记\Python\代码\test.abc.py.zip
.zip
"""
stem路径最后一部分除了后缀部分
print(a)
print(a.stem)
"""
结果
C:\Users\Administrator\Desktop\学习笔记\Python\代码\test.abc.py.zip
test.abc.py
"""
name = stem + suffix
print(a)
print(a.stem+a.suffix)

"""
结果
C:\Users\Administrator\Desktop\学习笔记\Python\代码\test.abc.py.zip
test.abc.py.zip
"""
suffixes将路径最后一部分所有的扩展名分解开
print(a)
print(a.suffixes)
"""
结果
C:/Users/Administrator/Desktop/学习笔记/Python/代码/test.abc.py.zip
['.abc', '.py', '.zip']
"""
with_suffix(suffix) 修改扩展名,返回新路径
print(a)
print(a.with_suffix('.pdf'))
"""
结果
C:\Users\Administrator\Desktop\学习笔记\Python\代码\test.abc.py.zip
C:\Users\Administrator\Desktop\学习笔记\Python\代码\test.abc.py.pdf
"""
with_name(name)修改路径最后一部分,返回新路径
print(a)
print(a.with_name('haha'))
"""
结果
C:\Users\Administrator\Desktop\学习笔记\Python\代码\test.abc.py.zip
C:\Users\Administrator\Desktop\学习笔记\Python\代码\haha
"""

全局方法

cwd() 返回当前工作目录

home() 返回当前家目录

from pathlib import Path

p = Path('/magedu/mysql/install/mysql.tar.gz')
print(p.cwd(), Path.cwd())
print(p.home(), Path.home())
"""
结果
C:\Users\Administrator\Desktop\学习笔记\Python\代码 C:\Users\Administrator\Desktop\学习笔记\Python\代码
C:\Users\Administrator C:\Users\Administrator
"""

当前工作目录和家目录不会随路径对象的变化而变化

判断方法

exists() 目录或文件是否存在

is_dir() 是否是目录,目录存在返回True

is_file() 是否是普通文件,文件存在返回True

is_symlink() 是否是软链接

is_socket() 是否是socket文件

is_block_device() 是否是块设备

is_char_device() 是否是字符设备

is_absolute() 是否是绝对路径

其它操作

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时,路径存在,抛出FileExistsError;True时,FileExistsError被忽略

iterdir() 迭代当前目录,不递归


iterdir()会将文件夹中的所有目录生成一个惰性可遍历对象

from pathlib import Path

p = Path('C:/Users/Administrator/Desktop/学习笔记/Python/代码/a')
print(p)
print(list(p.iterdir()))
"""
结果
C:\Users\Administrator\Desktop\学习笔记\Python\代码\a
[]
"""

mkdir新建文件夹

p = Path('C:/Users/Administrator/Desktop/学习笔记/Python/代码/a')
(p/'tset').mkdir()
print(list(p.iterdir()))
"""
结果

[WindowsPath('C:/Users/Administrator/Desktop/学习笔记/Python/代码/a/tset')]
"""

rmdir删除文件夹

p = Path('C:/Users/Administrator/Desktop/学习笔记/Python/代码/a')
(p/'tset').rmdir()
print(list(p.iterdir()))
"""
结果
[]
"""

as_uri将路径以uri的形式返回

p = Path('C:/Users/Administrator/Desktop/学习笔记/Python/代码/a')
print(p.as_uri())
"""
结果
file:///C:/Users/Administrator/Desktop/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/Python/%E4%BB%A3%E7%A0%81/a
"""

touch创建新文件

p = Path('C:/Users/Administrator/Desktop/学习笔记/Python/代码/a')
(p/'tset').touch()
print(list(p.iterdir()))
"""
结果
[WindowsPath('C:/Users/Administrator/Desktop/学习笔记/Python/代码/a/tset')]
"""

通配符

glob(pattern) 通配给定的模式,返回生成器对象

rglob(pattern) 通配给定的模式,递归目录,返回生成器对象

? 代表一个字符

*表示任意个字符

[abc][a-z] 表示一个字符

list(p.glob('test*'))  # 返回当前目录对象下的test开头的文件
list(p.glob('**/*.py'))  # 递归所有目录,等同rglob
list(p.glob('**/*'))
g = p.rglob('*.py')  # 生成器,递归
next(g)
list(p.rglob('*.???'))  # 匹配扩展名为3个字符的文件
list(p1.rglob('[a-z]*.???'))  # 匹配字母开头的且扩展名是3个字符的文件

文件操作

Path.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None)

使用方法类似内建函数open。返回一个文件对象

from pathlib import Path

p=Path('C:/Users/Administrator/Desktop/学习笔记/Python/代码/1')
print(p.open())
"""
结果
<_io.TextIOWrapper name='C:\\Users\\Administrator\\Desktop\\学习笔记\\Python\\代码\\1' mode='r' encoding='cp936'>
"""

Path.read_bytes()

以'rb'读取路径对应文件,并返回二进制流。看源码

Path.read_text(encoding=None, errors=None)

以'rt'方式读取路径对应文件,返回文本。

Path.write_bytes(data)

以'wb'方式写入数据到路径对应文件。

Path.write_text(data, encoding=None, errors=None)

以'wt'方式写入字符串到路径对应文件

from pathlib import Path

p=Path('C:/Users/Administrator/Desktop/学习笔记/Python/代码/1')
print(p.read_text())
#***123哈哈a

print(p.read_bytes())
#b'***123\xe5\x93\x88\xe5\x93\x88a'

print(p.write_text('123456'))
#6

with p.open() as f:
    print(f.read())
#123456

OS模块

命令 描述
os.name win是nt,linux是posix
os.uname() *nix支持
sys.platform windows显示win32,linux显示linux
os.sep 显示系统路径分隔符
os.getenv(环境变量名称) 读取环境变量
os.getcmd() 获取当前的路径
os.mkdir() 创建空目录
os.rmdir() 删除空目录,不为空无法删除
os.makedirs(dirname) 生成多层递归目录,如果目录全部存在,则创建失败
os.removedirs(dirname) 删除多层递归的空目录,若有文件则无法删除
os.chdir() 改变当前目录,到指定目录
os.rename() 重命名目录或者文件名,重命名的文件已存在则创建失败
os.path.exists(path) 判断文件或者目录是否存在
os.path.isfile(path) 判断是否为文件
os.path.isdir(path) 判断是否为目录
os.path.basename(path) 返回文件名
os.path.dirname(path) 返回文件路径
os.path.getsize(name) 获取文件大小
os.path.abspath(name) 获取绝对路径
os.path.join(path,name) 链接目录与文件名或者目录

os.listdir('o:/temp')

返回指定目录内容列表,不递归

os也有open、read、write等方法,但是太底层,建议使用内建函数open、read、write,使用方式相似

posted @ 2022-06-17 23:45  厚礼蝎  阅读(26)  评论(0编辑  收藏  举报