Python中的路径操作

版权声明:qq:1263351411 https://blog.csdn.net/u013008795/article/details/89742486

路径操作

os模块中的path对象(3.4版本之前)

  • path属性os模块,from os import path
常用方法
  • os.path.join(path,*paths)->str #拼接路径
    from os import path
    p = path.join("a","b")
    p2 = path.join("e:/a/b","c")
    print(type(p),p)
    print(type(p2),p2)
    
    path005
  • os.path.exists§->True|False #判断字符串路径或文件是否存在
    • p 字符串路径
  • os.path.split§->(路径,基名) #切割路径字符串,获取路径和基名
  • os.path.dirname§->str路径 #获取路径字符串的路径
  • os.path.basename§->str基名 #获取路径字符串的基名
  • os.path.relpath(p )->str路径 #获取文件路径的相对路径
    • 简单示例:
    from os import path
    path.abspath(""),path.relpath('D:/MyPythonUse/Mypython/a/b')  
    
    path007
  • os.path.abspath§->str # 获取路径字符串的绝对路径
    • os.path.abspath("") 和 os.path.abspath(".") 表示当前路径的绝对路径
  • os.path.splitdrive§->(磁盘名,路径) #windows系统上使用,获取路径所在磁盘的盘符
    • path.splitdrive(“c:/a/b/text.py”) #(‘c:’, ‘/a/b/text.py’)
  • os.path.samefile(src,dst) #判断两个路径是否指向同一个文件
  • os.path.normpath(p )->os.path #正常化路径,取消双斜杠
  • os.path.normcase(p )->os.path #将路径大小写规范。
    • 如果是linux系统或者Mac OS系统,不做处理
    • 如果是windows系统上,将路径全部转换成小写,并将"/“转成”\\"
  • 其他相关方法可以查看python API
    • os.path.getatime(path)
    • os.path.getsize(path) #获取文件大小
    • os.path.isabs(path) #是否是绝对路径
    • os.path.isdir(path) #判断路径是否是当前路径

pathlib模块中的Path对象(3.4版本开始使用)

  • Path路径对象,属于pathlib模块,在python3.4版本后开始提供
    from pathlib import Path
    
    • Path类关系图
      path002
  • Path(*pathsegments)->PosixPath|WindowsPath 根据路径创建Path对象
    • pathsegments 路径字符串
    • PosixPath 在linux下调用会返回PosixPath对象
    • WindowsPath 在windows下调用会返回WindowsPath对象
    • 初始化简单示例
    from pathlib import Path
    p = Path() #当前目录 Path(.) Path("")都是表示当前目录
    p = Path('a','b','c/d') #当前目录下的a/b/c/d
    p = Path("/etc") #表示跟下的etc目录
    
  • 操作符号/
    • 语法:
      • Path对象/Path对象
      • Path对象/字符串 或者 字符串 / Path对象
    • 示例:
    p = Path("c:/a/b")
    p = "d/e" / p/"g" #注意组合后为:WindowsPath('c:/a/b/g') 盘符前的不合法路径会被忽略
    p2 = Path("c/d")
    p2 = "e/f"/ ("g/h"/p2)/"g" #WindowsPath('e/f/g/h/c/d/g') 注意括号和p2的位置
    

注意:WindowsPath和PosixPath的父类都是PurePath

  • 路径的比较: 在windows中文件名称是不区分大小写的,为了方便判断路径是否一致可以使用路径对象Path来进行比较的路径大小
    • PureWindowsPath(“fab”) == PureWindowsPath(“FaB”) #返回True
    • PureWindowsPath(“c:”) < PureWindowsPath(“D:”) #返回True
    • windows下演示
    p1 = Path("c:")
    p2 = Path("D:")
    print(p1<p2)
    
    p3 = Path("c:/","a","b") #注意,使用盘符时,要带上/,或者后面的路径最前面带上/
    p4 = Path("c:/a/b")
    print(p3==p4,p3,p4)
    
    path001
  • linux系统中文件名是区分大小写,所以有:
    • PurePosixPath(“fab”) == PurePosixPath(“FaB”) #返回False
      path003
Path中的全局方法
  • cwd()->Path #获取当前工作路径
from pathlib import Path
p = Path("d:/a/b")
print(Path.cwd(),p.cwd()) #输出结果为:D:\MyPythonUse\Mypython D:\MyPythonUse\Mypython
  • home()->Path #获取当前用户的家目录
Path中的判断方法
  • exists() #目录或文件是否存在
  • is_dir() #是否是目录,目录存在返回True
  • is_file() #是否是普通文件,文件存在返回True。
  • is_fifo() #是否是FiFO文件,如果文件路径是链接文件,链接文件指向FIFO文件,并未断开,则为True,否则为False
  • is_symlink() #是否是软连接
  • is_block_device() #是否是块设备
  • is_char_device() #是否是字符设备
  • is_absolute() #是否是绝对路径
绝对路径
  • resolve() #返回一个新的路径,这个路径就是当前Path对象的绝对路径,如果是软连接则直接被解析。注意无法识别windows的快捷方式。
  • absolute() #获取绝对路径,也无法识别windows的快捷方式
文件信息
  • lstat() #路径所指向的文件状态信息,如果文件时符号链接文件,则返回符号链接文件自己的状态。即不跟进链接文件
  • stat() #路径所指向的文件状态信息,如果文件时符号链接文件,则返回链接文件所指向的文件信息,即跟进链接文件。类似于os.stat()
    • st_size 文件大小
    • st_mode 文件权限
    • st_ino
    • st_dev
    • st_nlink
    • st_uid
    • st_size
    • st_atime
    • st_mtime
    • st_ctime
p = Path("text")
print(p.exists()) #检查文件是否存在
stat = p.stat()
print(stat.st_size)
print(stat)

输出结果为:
path004

  • owner() #获取文件的所有者名称,即uid,如果文件没有uid属性,会出现KeyError异常。
文件操作
  • chmod(mode) #根改路径指向文件的权限,类似于os.chmod()
    • mode int类型,可以使用8进制描述。例如0o775
    • 注意,如果指向的是符号链接文件,这会跟进符号链接文件所指向的文件
  • lchmod(mode) #针对符号链接文件,只改变符号链接文件的权限,而不是跟进符号链接所指向的文件。
  • rmdir() #删除空目录,非空目录会报错。注意,Path对象没有提供判断目录为空的方法
    • 简单示例,判断目录为空的方法
    from pathlib import Path
    def isNoneDir(dirname:Path):
        try:
            stat = dirname.lstat()
        except Exception:
            return Exception
        else:
            if dirname.is_dir():
                for i in dirname.iterdir():
                    break
                else:
                    return True
            return False
    p = Path("")
    for i in p.iterdir():
        print(i.name,"\t\t空目录" if isNoneDir(i) else "")
    
  • mkdir(mode=0o777, parents=False, exist_ok=False) #创建Path路径中的文件或目录
    • mode 权限,默认为777
    • parents 是否创建父目录,
      • True表示父目录不存在就创建。 等同于mkdir -p
      • False表示父目录不存在,则抛出FileNotFoundError
    • exist_ok参数,在3.5版本加入。是否忽略路径存在异常
      • False 路径存在,抛出FileExistsError异常
      • True 忽略路径存在异常FileExistsError
  • rename(target) #重命名文件。将Path文件对象重命名为 target文件路径对象。相当于mv操作。
    • target #目标Path对象,可以是str文件路径
    • 注意:
      • 如果原Path路径指向一个文件夹,则会移动源文夹下所有内容到target对象
      • 如果源文件为一个目录,则会移动整个目录
  • open(mode=‘r’,buffering=-1,encoding=None,errors=None,newline=None)->文件对象 ,类似于open方法。返回一个文件对象
    • mode 打开路径的默认模式,默认为读取模式打开
    • buffering 缓冲区,详细介绍请参考系统的open函数文件操作
    • errors 什么样的编码错误将被捕获。默认值为None
    • newline 文本模式中,换行的转换。默认值为None。可选为None,“空串”,"\r","\n","\r\n" 详细请参考文件操作
  • read_bytes() #以"rb"二进制读取模式读取路径对应文件,并返回二进制流
  • read_text(encoding=None,errors=None) #以"rt"方式读取路径对应文件,返回文本。
    • encoding 编码格式
    • errors 什么样的编码错误将被捕获。默认值为None
      • None表示有编码错误将抛出ValueError异常;ignore表示忽略
  • write_bytes(data) #以"wb"方式写入数据到路径对应文件
    • data 要写入的二进制数据 bytes类型
  • write_text(data,encoding=None,errors=None) #以"wt"方式写入字符串到路径对应文件
    • data 要写入的文本数据,str类型
    • encoding 编码格式
    • errors 什么样的编码错误将被捕获。默认值为None
      • None表示有编码错误将抛出ValueError异常;ignore表示忽略
  • 简单示例:
p = Path("gdy.txt")
p.write_bytes(b"abc")
p.write_text("你是誰") #因为是w模式,所以之前写入的内容abc会被清空
with p.open(mode="a+") as f: #已a模式打开,会在尾部追加
    f.write("ab你好")
p.read_text() #读取所有内容

path006

目录结构
  • iterdir() #迭代当前目录,不递归。
    • 简单示例 --输出当前路径下哪些是文件,哪些是目录
    from pathlib import Path
    arrdir = {*Path("").iterdir()} #获取当前目录下的所有文件
    mdir = {i for i in filter(lambda p: p.is_dir() ,arrdir)} #取出为目录的Path对象
    text = arrdir - mdir   #取出非目录Path对象
    print("目录:",[*map(lambda x:x.name,mdir)])
    print("文件:",[*map(lambda x:x.name,text)])
    
匹配查找
  • glob(pattern)->生成器对象 #匹配指定目录
    • pattern 通配符给定模式
    • 常用通配符:
      • ? #代表一个字符
      • * #代表任意个字符
      • [abc]或[a-z]表示一个字符
    • 简单示例:
    from pathlib import Path
    p = Path("")
    list(p.glob("test*")) #返回当前目录对象下的test开头文件
    list(p.glob("**/*.py")) #递归所有目录,查找已.py结尾的文件,等同于list(p.rglob("*.txt"))
    list(p.glob(**/*)) #递归p路径下的所有文件
    
  • rglob(pattern)->生成器对象 #递归匹配指定目录
    • pattern 通过给定的模式,递归目录。
    • 常用通配符:
      • ? #代表一个字符
      • * #代表任意个字符
      • [abc]或[a-z]表示一个字符
    • 简单示例
    from pathlib import Path
    p = Path("")
    list(p.rglob("*.???")) #匹配扩展民为3个字符的文件。等价于list(p.glob(**/*.???))
    list(p.rglob("[a-z]*.???")) #匹配字母开头的且扩展名是3个字符的文件
    
  • match(pattern)->True|False #匹配路径中是否是指定格式的路径。模式匹配,匹配到,返回True。
    • 注意:不会检查路径是否存在
    • pattern 通配符给定模式
    • 常用通配符:
      • ? #代表一个字符
      • * #代表任意个字符
      • [abc]或[a-z]表示一个字符
    • 简单示例:
    Path("a/b.py").match("*.py") #True #检查路径是否以.py结尾的文件
    Path("/a/b/c.py").match("b/*.py") #True #检查.py结尾的文件上级目录是否是b
    Path("/a/b/c.py").match("a/*.py") #False
    Path("/a/b/c.py").match("a/*/*.py")#True
    Path("/a/b/d/c.py").match("a/*/*.py") #False
    Path("/a/b/c.py").match("a/**/*.py") #True
    Path("/a/b/c.py").match("**/*.py") #True
    

os模块,操作系统平台

属性或方法 结果
os.name windows是nt,linux是posix
os.uname() *nix支持
sys.platform windows显示win32,linux显示linux
  • 常用方法
  • os.listdit(strpath)->list 获取指定目录内容列表,不递归
    • strpath str类型的路径
    • list 返回值是个list,存放strpath目录下的所有文件名称。
    • 注意:获取当前路径下的文件方法为:os.listdir()或者os.listdir(".")
  • os.open(path, flags, mode=0o777, *, dir_fd=None)->文件描述符 #打开文件
    • path 要打开的文件
    • flags 打开时的文件标记
      • 常用标记有,如果需要了解跟多请参考帮助文档
      • os.O_RDONLY #只读方式打开
      • os.O_WRONLY #只写方式打开
      • os.O_RDWR #读写方式打开
      • os.O_APPEND #追加方式打开
      • os.O_CREAT #创建文件
      • os.O_EXCL #
      • os.O_TRUNC #
  • os.read(fd,n)->bytes #从文件描述符fd中读取n个字节
    • fd:文件描述符
    • n :要读取的字节个数
  • os.write(fd,str) #
    • fd:文件描述符
    • str: bytes类型,要写入的字节
  • os.close(fd) #关闭文件描述符
    简单综合示例:
fd = os.open("text4.txt",os.O_CREAT) #创建文件
os.close(fd)
fd = os.open("text4.txt",os.O_WRONLY) #只写方式打开
os.write(fd,"你好".encode()) 
os.close(fd)
fd = os.open("text4.txt",os.O_RDONLY) #只读方式打开
print(os.read(fd,1000))
os.close(fd)

输出结果为:
path008

  • os.stat(path,*,dir_fd=None,follow_symlinks=True) #获取文件状态
    • 本质上调用系统的stat方法
    • path:路径的string或者bytes。或者fd文件描述符
    • follow_symlinks True 返回文件本身信息,False 如果是 软连接则显示软连接本身。对于软连接本身,可以使用os.lstat方法
  • os.lstat #获取链接文件本身的stat信息,即元数据信息
  • os.chmod(path,mode,*,dir_fd=None,follow_symlink=True)
    • path:路径的string或者 bytes.或者fd文件描述符
    • mode 权限:例如:0o777
  • os.chown(path,uid,gid) 改变文件的属主,属组,但需要足够的权限
  • os.symlink(src,dst,target_is_directory=False,*,dir_fd=none) 创建指向src的链接文件
    • src 源文件路径
    • dst 目标文件路径
  • os.mkdir(path,mode=0o777,*,dir_fd=None) #创建目录,如果目录已经存在报FileExistsError异常。如果父目录不存在也会报错
    • path:创建目录路径
    • mode:权限,默认值为0o777
    • dir_fd:文件描述符,默认值为None 在版本3.3后加入。注意:如果平台不支持,会抛出异常NotImplementedError
  • os.makedirs(name,mode=0o777,exist_ok=False) #创建目录,如果目录中父目录不存在,就直接创建。
    • name: 要创建的目录路径
    • mode: 创建目录时的目录权限,默认是777
    • exist_ok: 默认值为False 表示如果目录存在就抛出异常。
      • False :如果目录已经存在,就报错
      • True :如果目录存在,不报错,即忽略目录是否存在。

猜你喜欢

转载自blog.csdn.net/u013008795/article/details/89742486