Python学习之 ---文件路径操作+os.path +pathlib

路径操作

路径操作模块

from  os import path
p = path.join('/etc','sysconfig','notework')  # 创建路径 
p,type(p)
>>>   '/etc\\sysconfig\\notework', str   
###########
path.split(p)   # 拆分路径
>>> '/etc\\sysconfig', 'notework'  # 拆分的部分分为最后一个的基名和dir 路径 
path.dirname(p)   # 得到路径
>>> '/etc\\sysconfig'
path.basename(p)# 得到文件的名称
>>> 'notework'
print(path.abspath(''), path.abspath('.')) #绝对路径
>>> C:\Users\Administrator C:\Users\Administrator
print(path.splitdrive('o:/temp/test')) # windows方法,分割路径
>>>('o:', '/temp/test')  

python 3.4 版本以后 ,路径管理工具 pathlib

from pathlib import Path
p1= Path()
p1
>>>   .   # .  表示当前路径
pwd
>>>'C:\\Users\\Administrator'   # pwd 查看当前路径是什么
p1.absolute() 
>>>WindowsPath('C:/Users/Administrator')  # 返回绝对路径,是一个路径对象
p2 = Path('/etc/','sysconfig','network')  # 直接将字符串拼接
>>> WindowsPath('/etc/sysconfig/network')
p3 = Path('a/b','c','e/d')   # 含路径的字符串
>>> WindowsPath('a/b/c/e/d')
p4 =Path(p2,p3)   # 将两个路径拼接在一起
>>> WindowsPath('/etc/sysconfig/network/a/b/c/e/d')
p4 / 'f'/'gh'/'123.tar.zg' 
>>> WindowsPath('/etc/sysconfig/network/a/b/c/e/d/f/gh/123.tar.zg')
p3 /'f'/ Path('g','f','12zip')  #字符串与Path组合使用
>>>WindowsPath('a/b/c/e/d/f/g/f/12zip')
# 总结: 
path  + str ==> path 
str + path  ==> path
path + path ==> path
path 的路径可以由以上三种方法得到.
#得到路径的详细
p4.parts
>>> ('\\', 'etc', 'sysconfig', 'network', 'a', 'b', 'c', 'e', 'd')# 返回结果是一个元组
p4.parts[-1]
>>> d  # 得到最后一个名 与path.dirname(p4)一致

若想得到一个目录的每一层路径,该怎么做呢?

p4.parents   # 得到的是一个可迭代对象
next(iter(p4.parents))  ===>
for x in p4.parents:
    print x  # 输出的都是一个路径对象,千万记住输出的不是一个字符串
def parent():
    yield from p7.parents
for i in parent():
    print(i)
>>> # 会得到除了最后一层的其他每一层的目录,一直到根目录
\etc\sysconfig\network\a\b\c\e
\etc\sysconfig\network\a\b\c
\etc\sysconfig\network\a\b
\etc\sysconfig\network\a
\etc\sysconfig\network
\etc\sysconfig
\etc
\
p4.parents[1] # 只支持正向索引,不支持负数
>>> \etc\sysconfig\network\a\b\c

如何取一个文件的名,扩展名,和后缀名 呢?

path.name 得到基名

path.stem 得到除后缀外

path.suffix 得到后缀

#假设P5 = '/etc/sysconfig/network/a/b/c/e/d/123.tar.zip'
#现在要取出123.tar.zip  123.tar  zip   
p5.name , p5.stem, p5.suffix    #
>>> ('123.tar.zip', '123.tar', '.zip')
p5.suffixs 
>>>'.tar','.gz'

替换后缀名

# p5  = '/etc/sysconfig/network/a/b/c/e/d/123.tar.zip'
p5.with_name('1234')  #有扩展名则替换,无则补充扩展名,返回一个新的路径
>>>WindowsPath('/etc/sysconfig/network/a/b/c/e/d/1234')
# 相等于 p5.parent /'1234'
p5.with_suffix('.gz')  #替换目录最后一个部分(后缀名)并返回一个新的路径
WindowsPath('/etc/sysconfig/network/a/b/c/e/d/123.tar.gz')
             

检查目录是否存在

p8.exists()
>>> False   #所以上面的路径在物理磁盘上目前还是不存在的 

操作 描述
exists() 目录或文件是否存在
is_file() 是否是普通文件,文件存在返回True
is_symlink() 是否是软链接
is_socket() 是否是socket文件
is_block_device() 是否是块设备
is_char_device() 是否是字符设备
is_absolute() 是否是绝对路径
is_dir 是否是目录
iterdir() 返回下所有文件名的路径

练习:

在当前目录下有多个文件,判断这个文件是文件还是目录,如果是目录判断是否是空目录:

for i in Path.cwd().iterdir():
#     print(i,type(i))
    if i.is_file():
        print('file\t',i.name)
    elif i.is_dir():
        print('dir\t',i.name)
        for x in i.iterdir():
            flag = True
            break
          print('not empty'if flag else 'empty')

已知路径创建文件夹和文件

# p1 = 'etc/sysconfig/neteork/a/b/123.zip.tar'

p1.mkdir(parents= True) # 直接用mkdir创建文件时是会发生报错,所以需要将其父目录设置为True才能继续创建文件目录 
#上面创建的文件目录会将基名同样创建为目录,不是我们想要的结果
# 可以先创建好基名的上一层目录,然后在创建文件(不先创建目录会提示母目录不存在)
p1.parent.mkdir(parents=True) 
p1.touch()
#同样还可以继续在此路径下创建文件 
p1.with_name('123.txt').touch() # touch前面是创建一个新的路径,后缀名为'123.txt'
# 
#创建文件总结:
p1 = Path('etc/sysconfig/neteork/a/b/123.zip.tar')
p1.mkdir(parents = True,exist_ok =True)#  先创建目标路径的文件夹
p1.touch()  # 创建p1路径的文件名结尾的文件,但这样只能创建一个文件
# 要继续创建怎么办?
path+str = newpath
p2= p1.patent /'578.txt'  # 创建新的路径
p2.touch()  # 新建文件
# 或者:
p2.with_nanme('4555.txt').touch()  #  用with_ name  替换末尾的文件名,同时生成的是新的文件名.所以可以替换

在目录下查找文件

p3 = Path('C:\\Users\\Administrator\\etc')
p3.glob('*.py') #生成的是一个可迭代对象
list(p3.glob('*.py'))  #在p3路径下匹配py文件
>>>[WindowsPath('C:/Users/Administrator/etc/b.py')] 
list(p3.glob('*/*.py')) # p3路径下走一层匹配
>>>[WindowsPath('C:/Users/Administrator/etc/sysconfig/a.py')]  
list(p3.glob('**/*.py'))# p3路径下任意层匹配.py文件
>>>
[WindowsPath('C:/Users/Administrator/etc/b.py'),
 WindowsPath('C:/Users/Administrator/etc/sysconfig/a.py'),
 WindowsPath('C:/Users/Administrator/etc/sysconfig/neteork/a/b/abc.py')]
list(p3.glob('**/?.py'))# 查找任意层,形如a.py的文件,.py前面只有一个字母 几个问号表示几个字母
list(p3.glob('**/a*.py'))#a开头的文件
list(p3.glob('**/[a-z].py'))#a-z开头 


list(p3.rglob('*.py')) # 表示递归寻找
list(p3.rglob("*"))# 找出所有目录所有文件 

glob操作

import glob 
glob.glob('o:/etc/*')# etc下所有的文件 
glob.glob('o:/etc/**/*')# 匹配任意

glob.glob('o:/etc/**/*',recursive =True)  # 与rglob操作类似,将会进行 递归  

匹配

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_text(encoding=None, errors=None)
以’rt’方式读取路径对应文件,返回文本。
Path.write_bytes(data)
以’wb’方式写入数据到路径对应文件。
Path.write_text(data, encoding=None, errors=None)
以’wt’方式写入字符串到路径对应文件。

上面的都是一次性操作,打开一次,写入之后变会关闭.所以建议使用with语法.

猜你喜欢

转载自blog.csdn.net/qq_40498551/article/details/89873754