zoukankan      html  css  js  c++  java
  • Python中文件路径名的操作

    1 文件路径名操作

      对于文件路径名的操作在编程中是必不可少的,比如说,有时候要列举一个路径下的文件,那么首先就要获取一个路径,再就是路径名的一个拼接问题,通过字符串的拼接就可以得到一个路径名。Python中3.4版本前使用os.path模块中的函数来操作路径名;3.4版本开始提供pathlib模块,使用Path对象来对目录和文件进行操作。

    2 os.path模块

     1 from os import path
     2 
     3 p = path.join('/etc', 'sysconfig', 'network')    # 根据不同的系统,将每个字符串组合成路径形式
     4 print(type(p), p)
     5 print(path.exists(p))    # 判断路径在当前系统中是否存在
     6 print(path.split(p))    # (head, tail)将路径中的最后一个目录或者文件与前面的路径分开
     7 print(path.abspath('.'))    # 返回当前工作路径,'.'代表当前路径
     8 p = path.join('o:/', p, 'test.txt')
     9 print(path.dirname(p))    # 取目录名
    10 print(path.basename(p))    # 取基名
    11 print(path.splitdrive(p))    # 将盘符名和文件路径名分开(对于windows有盘符之分,在Linux中没有盘符)
    12 
    13 p1 = path.abspath(__file__)    # 取当前文件所在的路径
    14 print(p1, path.basename(p1))
    15 while p1 != path.dirname(p1):    # 每次取上级目录中的基名
    16     p1 = path.dirname(p1)
    17     print(p1, path.basename(p1))
    View Code

    3 pathlib模块

    3.1 目录操作

    3.1.1 路径拼接和分解

    • 操作符"/"对路径拼接

      “/”操作符可以对两个Path对象进行拼接、字符串和Path对象或者Path对象和字符串进行拼接

    • parts属性

      parts属性,可以返回路径中的每一个部分

    • joinpath

      joinpath(*other)连接多个字符串到Path对象中

     1 from pathlib import Path
     2 
     3 p = Path()    # 返回当前目录
     4 p = Path('a', 'b', 'c/d')    # 当前目录下的a/b/c/d
     5 p = Path('/etc')    # 返回根下的etc目录
     6 
     7 p = Path()
     8 p = p / 'a'
     9 p1 = 'b' / p
    10 p2 = Path('c')
    11 p3 = p2 / p1
    12 print(p3.parts)
    13 p3.joinpath('etc', 'init.d', Path('httpd'))
    View Code

    3.1.2 获取路径

    • str获取路径字符串
    • bytes获取路径字符串的bytes
    1 p = Path('/etc')
    2 print(str(p), bytes(p))
    View Code

    3.1.3 获取路径中的父目录

    • parent属性返回目录的逻辑父目录
    • parents属性返回父目录序列,索引0是直接的父目录
    1 p = Path('/a/b/c/d')
    2 print(p.parent.parent)  # 返回当前路径的父目录的父目录即/a/b
    3 for x in p.parents:     # 将当前路径的每一级的父目录序列化
    4     print(x)
    View Code

     3.1.4 其他属性及方法

    属性 含义
    name 目录的最后一个部分
    stem  目录最后一个部分,不包含后缀
    suffix 目录中最后一个部分的扩展名
    suffixes 返回多个扩展名列表

      和以上四个属性相关的方法:

    •   with_suffix(suffix)补充扩展名到路径尾部,返回新的路径,扩展名存在则修改之
    •   with_name(name)替换目录最后一个部分并返回一个新的路径
    1 p = Path('/viktor/mysqlinstall/mysql.tar.gz')
    2 print(p.name)    # mysql.tar.gz
    3 print(p.suffix)    # .gz
    4 print(p.suffixes)    # ['.tar', '.gz']
    5 print(p.stem)    # mysql.tar
    6 print(p.with_name('mysql-5.tgz'))    # /viktor/mysqlinstall/mysql-5.tgz
    7 p = Path('README')
    8 print(p.with_suffix('.txt'))    # README.txt
    View Code

      和文件类型相关的方法:

    方法 功能
    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() 迭代当前目录
     1 p = Path()
     2 p /= 'a/b/c/d'
     3 p.exists()    # True
     4 
     5 # 创建目录
     6 p.mkdir()    # 如果p对象的路径存在抛出FileExistsError,否则抛出FileNotFoundError
     7 p.mkdir(parents=True)    
     8 p.exists()    # True
     9 p.mkdir(parents=Ture)    # 抛出FileExistsError
    10 p.mkdir(parents=True, exist_ok=True)    # 忽略FileExistsError
    11 p /= 'readme.txt'
    12 p.parent.rmdir()    # 删除readme.txt的父目录,此时真实目录中已经不存在d目录
    13 p.parent.exists()    # False 'a/b/c'
    14 p.mkdir()    # FileNotFoundError
    15 p.mkdir(parent=True)    # 成功
    View Code

      实现遍历,并判断文件类型,如果是目录是否可以判断其是否为空的代码:

     1 for x in p.parents[len(p.parents)-1].iterdir():
     2     print(x, end='	')
     3     if x.is_dir():
     4         flag = False
     5         for _ in x.iterdir():
     6             flag = True
     7             break
     8         print('dir','Not Empty' if flag else 'Empty', sep='	')
     9     elif x.is_file():
    10         print('file')
    11     else:
    12         print('other file')
    View Code

    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'方式写入字符串到路径对应文件
     1 p = Path("my_binary_file")
     2 p.write_bytes(b'Binary file contents')    # 以'wb'形式向p路径对象写入数据
     3 p.read_bytes()
     4 
     5 p = Path("my_text_file")
     6 p.write_text('Text file contents')    # 以'wt'形式向p路径对象写入数据
     7 p.read_text()
     8 
     9 with p.open() as f:
    10     print(f.read(5))
    View Code
  • 相关阅读:
    求一个数字各个位的数字之和
    二进制和十进制的转换 分别用python和js实现
    pymysql 获取插入数据的主键id
    js03.事件
    02.js运算符
    jsonpath
    01.js控制台
    2.命令补充
    hashmap
    正则表达式的补充
  • 原文地址:https://www.cnblogs.com/dabric/p/11757049.html
Copyright © 2011-2022 走看看