Python -路径操作

路径操作模块

3.4版本之前

os.path模块

from os import path
p = path.join('/etc', 'sysconfig', 'network') # 拼接
pring(type(p), p)
print(path.exists(p)) # 存在

print(path.split(p)) # 分割
print(path.dirname(p), path.basename(p)) #路径和基名

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

print(path.spltdrive('d:/temp/test')) # windows方法

p1 = path.abspath(__file__)
print(p1)
while p1 !=path.dirname(p1):
	dirname = path.ditname(p1)
	print(ditname)
	p1 = dirname

3.4版本开始

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

pathlib模块

  • from pathlib import Path

目录操作

初始化
p = Path() # 当前目录, Path()、Path('.')、Path('')
p = Path('a', 'b', 'c/d') # 当前目录下的a/b/c/d
p = Path('/etc') # 根下的etc目录
路径拼接和分解
  • 操作符 /
    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) # ('c', 'b', 'a')
p4 = p3.joinpath('etc', 'init.d', Path('httpd')) # c\b\a\etc\init.d\httpd
print(p4)
获取路径
  • str 获取路径字符串
  • bytes 获取路径字符串的bytes
from pathlib import Path

p = Path('/etc')
print(str(p)) # \etc
print(bytes(p)) # b'\\etc'
父目录
  • parent目录的逻辑父目录
  • parents父目录序列,可迭代对象,索引0是直接的父
from pathlib import Path

p = Path('a/b/c/d')
print(p.parent)  # a\b\c
print(p.parent.parent) # a\b
for x in p.parents:
	print(x)
# print(x)执行结果
# a\b\c
# a\b
# a
# .
目录组成部分
  • name、stem、suffix、suffixes、with_suffix(suffix)、whit_name(name)
name 目录的最后一个部分
suffix 目录中最后一个部分的扩展名
stem 目录最后一个部分,没有后缀
name = stem + suffix
suffixes 返回多个扩展名列表
with_suffix(suffix) 有扩展名则替换,无则补充扩展名
whit_name(name) 替换目录最后一个部分并返回一个新的路径
from pathlib import Path

p = Path('/etc/python/mysql.tar.gz')
print(p.name) # mysql.tar.gz
print(p.suffix) # .gz
print(p.suffixes) # ['.tar', '.gz']
print(p.stem) # mysql.tar
print(p.with_name('python-5.tgz')) # \etc\python\python-5.tgz
print(p.with_suffix('.png')) # \etc\python\mysql.tar.png
p = Path('README')
print(p.with_suffix('.txt')) # README.txt
全局方法
  • cwd() 返回当前工作目录
  • home()返回当前家目录
判断方法
  • exists() 目录或者文件是否存在
  • is_dir() 是否是目录,目录存在返回True
  • is_file() 是否是普通文件,文件存在返回True
  • is_symlink() 是否是软链接
  • is_socket() 是否是socket文件
  • is_block_device() 是否是块设备
  • is_char_device() 是否是字符设备
  • is_absolute() 是否是绝对路径
绝对路径
  • resolve() 非Windows,返回一个新的路径,这个新路径就是当前Path对象的绝对路径,如果是软链接则直接被解析
  • absolute() 获取绝对路径
  • rmdir() 删除空目录。没有提供判断目录为空的方法
  • touch(mode=0o666, exist_ok=True) 创建一个文件
  • as_uri() 将路径返回成URI,例如’file:///etc/passwd’
  • mkdir(mode=0o777, parents=False, exist_ok=False)
  • parents,是否创建父目录,True等同于mkdie -p。False时,父目录不存在,则抛出FileNotFoundError
  • exist_ok参数,在3.5版本加入,False时,路径存在。抛出FileExistsError;True时,FileExistsError被忽略
  • iterdir()迭代当前目录,不递归
from pathlib import Path

p = Path()
p /= 'a/b/c/d'
p.exists() # True

#创建目录
p.mkdir() # FileNotFoundError
p.mkdir(parents=True)
p.exists() # True
p.mkdir(parents=True)
p.mkdir(parents=True,exist_ok=True)
p /= 'readme.txt'
p.parent.exists() # False 'a/b/c'
p.mkdir() # FileNotFoundError
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

		print('dir', 'Not Empty' if flag else 'Empyt',sep='\t')
	elif x.is_file():
		print('file')
	else:
		print('other file')
通配符
  • 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个字符的文件
匹配
  • match(pattern)
  • 模式匹配,成功返回True
from pathlib import Path

Path('a/b.py').match('*.py') # True
Path('/a/b/c.py').match('b/*.py') # True
Path('/a/b/c.py').match('a/*.py') # False
Path('/a/b/c.py').match('a/*/*.py') # True
Path('/a/b/c.py').match('a/**/*.py') # True
Path('/a/b/c.py').match('**/*.py') # True
  • stat()相当于stat命令
  • lstat()同stat(),但如果是符号链接,则显示符号链接本身的文件信息
# ln -s test t

from pathlib import Path
p = Path('test')
p.stat()
p1 = Path('t')
p1.stat()
p1.lstat()

文件操作

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

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

  • 3.5增加的新函数
Path.read_bytes()

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

Path.read_test(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('my_binary_file')
p.write_bytes(b'Binary file contents')
p.read_bytes() # b'Binary file contents'

p = Path('my_text_file')
p.write_text('Text file contents')
p.read_text() # 'Text file contents'

with p.open() ad f:
	print(f.read(5))

os 模块

  • 操作系统平台
    在这里插入图片描述
  • os.listdie(‘o:/temp’)
    返回指定目录内容列表,不递归
    os也有open、read、write等方法,但是太底层,建议使用内建函数open、read、write,使用方法相似
# 建立一个软链接
$ ln -s test t1
  • os.stat(path, *, dir_fd=None,follow_symlinks=True)
  • 本质上调用Linux系统的stat
  • path:路径的string或者bytes,或者fd文件描述符
  • follow_symlinks True返回文件本身信息,False且如果是软链接则显示软链接本身。可以使用os.lstat方法
os.stat('o:/test.txt')
os.stat_result(st_mode=33206, st_ino=281474976710698, st_dev=389224164, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1508808249,  st_mtime=1508808249, st_crtime=1508808249)
st_mode=33206 => 100666
os.stat('test')
os.stat_result(st_mode=33204, st_ino=3407875, st_dev=64768, st_nlink=1, st_uid=500, st_gid=500, st_size=3, st_atime=1508690220,  st_mtime=1508690177, st_crtime=1508690177)
  • os.chmod(path, mode, *, dit_fd=None, follow_symlinks=True)

  • os.chmod(‘test’,0o777)

  • os.chown(path,uid,gid)
    改变文件的属主、属组,但需要足够的权限

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值