1 文件路径名操作
对于文件路径名的操作在编程中是必不可少的,比如说,有时候要列举一个路径下的文件,那么首先就要获取一个路径,再就是路径名的一个拼接问题,通过字符串的拼接就可以得到一个路径名。Python中3.4版本前使用os.path模块中的函数来操作路径名;3.4版本开始提供pathlib模块,使用Path对象来对目录和文件进行操作。
2 os.path模块
from os import path p = path.join('/etc', 'sysconfig', 'network') # 根据不同的系统,将每个字符串组合成路径形式 print(type(p), p) print(path.exists(p)) # 判断路径在当前系统中是否存在 print(path.split(p)) # (head, tail)将路径中的最后一个目录或者文件与前面的路径分开 print(path.abspath('.')) # 返回当前工作路径,'.'代表当前路径 p = path.join('o:/', p, 'test.txt') print(path.dirname(p)) # 取目录名 print(path.basename(p)) # 取基名 print(path.splitdrive(p)) # 将盘符名和文件路径名分开(对于windows有盘符之分,在Linux中没有盘符) p1 = path.abspath(__file__) # 取当前文件所在的路径 print(p1, path.basename(p1)) while p1 != path.dirname(p1): # 每次取上级目录中的基名 p1 = path.dirname(p1) print(p1, path.basename(p1))
3 pathlib模块
3.1 目录操作
3.1.1 路径拼接和分解
操作符"/"对路径拼接
“/”操作符可以对两个Path对象进行拼接、字符串和Path对象或者Path对象和字符串进行拼接
parts属性
parts属性,可以返回路径中的每一个部分
joinpath
joinpath(*other)连接多个字符串到Path对象中
from pathlib import Path p = Path() # 返回当前目录 p = Path('a', 'b', 'c/d') # 当前目录下的a/b/c/d p = Path('/etc') # 返回根下的etc目录 p = Path() p = p / 'a' p1 = 'b' / p p2 = Path('c') p3 = p2 / p1 print(p3.parts) p3.joinpath('etc', 'init.d', Path('httpd'))
3.1.2 获取路径
- str获取路径字符串
- bytes获取路径字符串的bytes
p = Path('/etc') print(str(p), bytes(p))
3.1.3 获取路径中的父目录
- parent属性返回目录的逻辑父目录
- parents属性返回父目录序列,索引0是直接的父目录
p = Path('/a/b/c/d') print(p.parent.parent) # 返回当前路径的父目录的父目录即/a/b for x in p.parents: # 将当前路径的每一级的父目录序列化 print(x)
3.1.4 其他属性及方法
属性 含义 name 目录的最后一个部分 stem 目录最后一个部分,不包含后缀 suffix 目录中最后一个部分的扩展名 suffixes 返回多个扩展名列表
和以上四个属性相关的方法:
- with_suffix(suffix)补充扩展名到路径尾部,返回新的路径,扩展名存在则修改之
- with_name(name)替换目录最后一个部分并返回一个新的路径
p = Path('/viktor/mysqlinstall/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('mysql-5.tgz')) # /viktor/mysqlinstall/mysql-5.tgz p = Path('README') print(p.with_suffix('.txt')) # README.txt
和文件类型相关的方法:
方法 功能 is_dir() 是否是目录,目录存在返回True is_file() 是否是普通文件,文件存在返回True is_symlink() 是否软链接 is_socket() 是否是socket文件 is_block_device() 是否是块设备 is_char_device() 是否是字符设备 is_absolute() 是否是绝对路径
其他几种方法:
方法 功能 cwd() 返回当前工作目录 home() 返回当前家目录 resolve()
返回一个新的路径,这个新路径就是当前Path对象的绝对路径。
如果是软链接则直接被解析
absolute() 也可以获取绝对路径,但是推荐使用resolve() exists() 判断目录或文件是否存在 rmdir() 删除空目录。没有提供判断目录为空的方法touch(mode=0o666,
exist_ok=True)
创建一个文件 as_url() 将路径返回成URL,例如'file:///etc/passwd'mkdir(mode=0o777,
parents=False,
exists_ok=False)
parents参数是判断是否创建父目录,True等同于mkdir -p;
False时,父目录不存在,则抛出FileNotFoundError
exist_ok参数,在3.5版本加入。False时,路径存在,
抛出FileExistsError;True时,FileExistsError被忽略
iterdir() 迭代当前目录p = Path() p /= 'a/b/c/d' p.exists() # True # 创建目录 p.mkdir() # 如果p对象的路径存在抛出FileExistsError,否则抛出FileNotFoundError p.mkdir(parents=True) p.exists() # True p.mkdir(parents=Ture) # 抛出FileExistsError p.mkdir(parents=True, exist_ok=True) # 忽略FileExistsError p /= 'readme.txt' p.parent.rmdir() # 删除readme.txt的父目录,此时真实目录中已经不存在d目录 p.parent.exists() # False 'a/b/c' p.mkdir() # FileNotFoundError p.mkdir(parent=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 'Empty', sep='\t') elif x.is_file(): print('file') else: print('other file')
3.2 文件操作
pathlib中的Path还提供open(mode='r', buffering=-1, encoding=None, errors=None, newline=None)
方法打开文件,其使用方法类似内建函数open,返回一个文件对象。Ptyhon3.5后pathlib模块新增加了一些方法,如下所示:
方法 功能 read_bytes() 以‘rb'读取路径对应文件,并返回二进制流
read_text(encoding=None,
errors=None)
以'rt'方式读取路径对应文件,返回文本 Path.write_bytes(data) 以'wb'方式写入数据到路径对应文件write_text(data, encoding=None,
errors=None)
以'wt'方式写入字符串到路径对应文件p = Path("my_binary_file") p.write_bytes(b'Binary file contents') # 以'wb'形式向p路径对象写入数据 p.read_bytes() p = Path("my_text_file") p.write_text('Text file contents') # 以'wt'形式向p路径对象写入数据 p.read_text() with p.open() as f: print(f.read(5))
总结
以上所述是小编给大家介绍的Python文件路径名的操作方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- 雨林唱片《赏》新曲+精选集SACD版[ISO][2.3G]
- 罗大佑与OK男女合唱团.1995-再会吧!素兰【音乐工厂】【WAV+CUE】
- 草蜢.1993-宝贝对不起(国)【宝丽金】【WAV+CUE】
- 杨培安.2009-抒·情(EP)【擎天娱乐】【WAV+CUE】
- 周慧敏《EndlessDream》[WAV+CUE]
- 彭芳《纯色角3》2007[WAV+CUE]
- 江志丰2008-今生为你[豪记][WAV+CUE]
- 罗大佑1994《恋曲2000》音乐工厂[WAV+CUE][1G]
- 群星《一首歌一个故事》赵英俊某些作品重唱企划[FLAC分轨][1G]
- 群星《网易云英文歌曲播放量TOP100》[MP3][1G]
- 方大同.2024-梦想家TheDreamer【赋音乐】【FLAC分轨】
- 李慧珍.2007-爱死了【华谊兄弟】【WAV+CUE】
- 王大文.2019-国际太空站【环球】【FLAC分轨】
- 群星《2022超好听的十倍音质网络歌曲(163)》U盘音乐[WAV分轨][1.1G]
- 童丽《啼笑姻缘》头版限量编号24K金碟[低速原抓WAV+CUE][1.1G]