对于目录操作想类似面向对象的方式,python在3.4之后提供了pathlib模块
会根据当前操作系统来创建目录类型,.点表示当前路径,这就是一个创建对象的过程
跟创建一个列表 l=list()一个道理
得到路径对象就可以进行操作
这个就相当于当前路径,前面是什么类型才能调用什么类型的方法,比如f。read,f.write
没有跟代表相对的
分隔符给你纠正回来了
如果在前面加上斜杠,相当于当前路径的a目录下的b,但是在linux就是从根目录开始
这样创建起来很方便,连join都省去了
刚才无参代表当前路径,这样也代表当前路径
刚才无参代表当前路径,这样也代表当前路径,.点空字符串,什么都不写都是当前路径
p代表路径/‘c’,这样看起来像除法,这个叫运算符的重载,原来是除法,p是个路径类path类,用/做运算符重载,让它变成路径拼接
用/来跟字符串进行拼接
**后面加个括号就可以避免,后面的字符串和路径对象+在一起还是返回的路径对象
**
按照从左至右的规律,字符串除法是不存在的
=
这种是生成一个新的,再赋值
相当于就地直接修改
以前可能比较老,用os.path模块,用path里面的一系列方法去处理,但是如果要用3.0,一般都是3。5以上的版本,就可以使用这种方式 了(2.7应该也有,因为好用的都更新到2.7了)
建议使用pathlib
分解成两个元组
是path对象就可以追加,返回的依然是个路径对象,操作起来非常方便
这就是面向对象操作的好处,比os.path.操作起来方便很多
join.path是一个可变参数
pathlib本质上是调用的os.path,但是更加方便
强类型,语言,不同类型的不能相加
一个按照bytes方式表达,一个按照string方式表达
如果不是用的bytes,用的是string,就需要+r来转义
print打印等于在里面进行了强制类型转换,转成str 了
os.path.dirname父路径的问题
没有了,因为是相对路径来走的
用绝对路径试试
依然是windows的路径类型
返回的是一个可迭代对象,是有顺序的,由近及远,相对路径到点为止
这个东西就不是列表
用parents就可以获得所有的父路径
目录的组成部分
name就是基名,
stem主干就是去除尾部的扩展名.gz,
suffix后缀
**有多级的扩展名可以用suffixes
stem+suffix=name,name=basename
parent就是这个文件的父路径
**
把目录全拿到,等于parts,一个元组
所谓的with_name是在做名称的替换
parent是b,等于把b换成abc了
是把一个路径的基名换掉
相当于把扩展名换掉
p3没有扩展名就就加上,没有就加上,有就替换
等于把p3下的test替换成xyz了
这样的话,知道父目录换后面的文件比较容易
还提供了一些东西,这个方法跟当前的路径对象没关系,但是属于路径对象才能够调用的方法
当前path是创建路径对象的类,这个方法是属于类型
(讲datetime的时候,有些方法是属于datetime创建的对象的,比如datetime.now是datetime类的方法,用时间类创建一个时间对象才能处理时间戳stamp)
当前工作路径跟你具体哪个路径没有关系,所以这种方法属于类的,但是在python中,类的方法在所有创建的对象都可以调用
还有个home,家目录在哪
linux是遵守posix协议的
linux可以感觉家目录跟当前目录是两个不同的东西
是不是目录,是不是文件
p1这个目录实际是不存在
如果这个路径所对应的文件不存在,判断就都失败了,要看存在不存在
linux下就能告诉你文件是什么类型,磁盘是块设备b
s是socket文件
返回一个包含绝对路径的对象
会返回解析之后d得到的路径
是个软链接,绝对路径,软链接类似windows快捷方式,但是毕竟是软链接文件,
absolute看到的是软链接本身位置
resolve如果发现自己是软链接,就解析,就是跟踪不跟踪软链接
不存在就不知道是什么类型,不存在一定没有类型
创建一个文件,是以当前用户身份创建的
创建文件无非就是read和write,用open方法即可,open方法打开就用w
open方法不操作路径只管文件打开的读写,pathlib路径操作的就必然用到
touch如果文件在的话,就把时间戳修改一下
两斜杠代表协议头后面从根文件路径/tmp/test1
windows需要这么写
找不到abcd这个目录
mkdir -p(指的是父目录)指的是缺什么祖先目录都创建出来
这时候目录就创建好了
再次执行,表示此目录已存在
exist_ok代表这个东西存在就ok了,不告诉你了,这个参数是在3.5之后才有的
目录也可以叫.txt
只要你有权限,touch,mkdir,只要你的权限够,因为这个文件目录不允许你写入,你就创建不了,因为你没权限去写入,权限允许才创建成功,权限不允许是创建不成功的
告诉你权限拒绝,跟操作系统的文件系统打交道一定要跟权限有关,所以部署的时候,你的服务你自己管,注意属主属组,windows一般上来就是admin权限
linux就不是
parents这个参数就类似mkdir -p,exist_ok,看存在的时候是否会报错
返回的是生成器generator,代表惰性求值
上面d下面没什么文件,当然不可以迭代
先构建一个tmp/a这个对象,然后就可以开始迭代了
当你这个路径指向一个目录的时候,yield(代表生成器),生成一个path对象of它的内容
iterdir把你指定的路径,如果是个目录,可以把一个目录里面的所有内容迭代出来 ,. …点和点点是特殊的目录
.隐藏的文件也可以被打印出来
不是目录告诉你迭代什么
迭代目录很重要,找到目录,就有可能遍历目录中的所有内容,只把当前目录扫一遍,不递归,不往里面去
递归要函数,这里没用到递归,函数自己调用自己,或者间接调用叫递归,
parent-1,拿祖先是由近及远 的,这么拿返回的还是文件对象,这个文件对象去迭代
取绝对路径的parents,这就是个集合,这个长度减-1,是支持的
但是直接给-1就不支持,内部实现就是类似一个可迭代对象,可迭代对象不支持负索引,没有实现
如果索引小于0则抛出index异常
绝对路径在linux里面最祖先都是跟/
拿到这个路径的跟之后进行迭代
如果是个相对路径,它的parents是.
当前路径tmp里面所有都打印出来了
不是所有的可迭代对象都支持,不是都支持负索引,因为还没算完,要一个给一个
不是什么可迭代对象都一定可以知道长度的,也不是所有的可迭代对象都支持负索引的
如果是目录就做事,是文件就打印是文件,如果是什么socket文件,就打印其他文件
目录进来就表示非空,就打印非空,进不来就是空
这个就是如何去判断是个目录还是个普通文件,遍历的时候发现目录就可以做一些事情,比如封装成函数递归调用