pyefun.核心支持库.磁盘操作 源代码

"""

.. Hint::
    磁盘操作

.. literalinclude:: ../../../pyefun/核心支持库/磁盘操作.py
    :language: python
    :caption: 代码示例
    :linenos:


"""
import os
import sys
import stat
import shutil
from .公用函数 import *
from .文本操作 import *


# 取磁盘总空间
# 取磁盘剩余空间
# 取磁盘卷标
# 置磁盘卷标
# 改变驱动器
# 改变目录 -
# 取当前目录 -
# 创建目录 -
# 删除目录 -
# 复制文件 -
# 移动文件 -
# 删除文件 -
# 文件更名 -
# 文件是否存在 -
# 寻找文件
# 取文件时间
# 取文件尺寸
# 取文件属性
# 置文件属性
# 取临时文件名
# 读入文件 -
# 写到文件 -


[文档]def 取资源文件路径(relative_path=""): """ PyInstaller 单文件解压后目录的路径 """ try: base_path = sys._MEIPASS except Exception: base_path = os.path.abspath(".") return os.path.join(base_path, relative_path)
[文档]def 取运行目录(): """ PyInstaller 单文件的运行目录 """ if getattr(sys, 'frozen', False): return os.path.dirname(os.path.realpath(sys.argv[0])) else: return sys.path[0]
[文档]def 取当前目录(): return os.getcwd()
# 调用格式: 〈逻辑型〉 复制文件 (文本型 被复制的文件名,文本型 复制到的文件名) - 系统核心支持库->磁盘操作 # 英文名称:FileCopy # 成功返回真,失败返回假。本命令为初级命令。 # 参数<1>的名称为“被复制的文件名”,类型为“文本型(text)”。 # 参数<2>的名称为“复制到的文件名”,类型为“文本型(text)”。 # # 操作系统需求: Windows、Linux @异常处理返回类型逻辑型 def 复制文件(被复制的文件名, 复制到的文件名): shutil.copyfile(被复制的文件名, 复制到的文件名) return True @异常处理返回类型逻辑型 def 复制目录(被复制的目录, 复制到的目录): shutil.copytree(被复制的目录, 复制到的目录) return True # 调用格式: 〈逻辑型〉 移动文件 (文本型 被移动的文件,文本型 移动到的位置) - 系统核心支持库->磁盘操作 # 英文名称:FileMove # 将文件从一个位置移动到另外一个位置。成功返回真,失败返回假。本命令为初级命令。 # 参数<1>的名称为“被移动的文件”,类型为“文本型(text)”。 # 参数<2>的名称为“移动到的位置”,类型为“文本型(text)”。 # # 操作系统需求: Windows、Linux @异常处理返回类型逻辑型 def 移动文件(被移动的文件, 移动到的位置): shutil.move(被移动的文件, 移动到的位置) return True
[文档]def 文件_目录文件列表(路径='.'): '.为单前目录,..为上级目录,目录下的文件名,文件夹名,不带路径' return os.listdir(路径)
[文档]def 文件_遍历子目录(路径='.'): '成功返回列表:(路径, [包含目录], [包含文件]),用法 for root, dirs, files in os.walk("..", topdown=False):' return list(os.walk(路径))
[文档]def 文件_递归获取所有文件(路径='.'): """获取文件夹下所有文件绝对路径 排查文件夹""" filess = [] listFiles = os.listdir(路径) for i in range(0, len(路径)): path = os.path.join(路径, listFiles[i]) if os.path.isdir(path): filess.extend(文件_递归获取所有文件(path)) elif os.path.isfile(path): filess.append(path) return filess
@异常处理返回类型逻辑型 def 创建目录(路径, 自动创建目录=True): if 文件是否存在(路径): return True if 自动创建目录: try: access = 0o777 original_umask = os.umask(000) os.makedirs(路径, access) finally: os.umask(original_umask) else: os.mkdir(路径) return True # 调用格式: 〈逻辑型〉 写到文件 (文本型 文件名,字节集 欲写入文件的数据,... ) - 系统核心支持库->磁盘操作 # 英文名称:WriteFile # 本命令用作将一个或数个字节集顺序写到指定文件中,文件原有内容被覆盖。成功返回真,失败返回假。本命令为初级命令。命令参数表中最后一个参数可以被重复添加。 # 参数<1>的名称为“文件名”,类型为“文本型(text)”。 # 参数<2>的名称为“欲写入文件的数据”,类型为“字节集(bin)”。 # # 操作系统需求: Windows、Linux @异常处理返回类型逻辑型 def 写到文件(文件名, 欲写入文件的数据): if (type(欲写入文件的数据) == str): 欲写入文件的数据 = bytes(欲写入文件的数据, encoding="utf-8") with open(文件名, 'wb') as f: f.write(欲写入文件的数据) return True
[文档]def 读入文件(文件名): if 文件是否存在(文件名) == False: return b"" '方式默认用r 字节集用rb 长度默认读取全部,更多模式参考https://www.runoob.com/python3/python3-func-open.html' with open(文件名, 'rb') as f: return f.read(-1)
@异常处理返回类型逻辑型 def 删除文件(路径): '成功返回True,用于删除文件,如果文件是一个目录则返回一个错误' os.remove(路径) return True @异常处理返回类型逻辑型 def 删除目录(路径, 递归删除=False): if 文件是否存在(路径) == False: return False if 递归删除: shutil.rmtree(路径) else: os.rmdir(路径) return True @异常处理返回类型逻辑型 def 文件更名(原文件名, 新文件名): '成功返回True,可以是文件或文件夹' # os.rename(原文件名, 新文件名) shutil.move(原文件名, 新文件名) return True
[文档]def 文件_路径取扩展名(路径): return os.path.splitext(路径)[1]
[文档]def 文件_取文件名(路径, 是否需要拓展名=True): if 是否需要拓展名: return os.path.basename(路径) else: return os.path.splitext(os.path.basename(路径))[0]
[文档]def 路径_取目录名(路径): return os.path.basename(路径)
[文档]def 文件_取目录(路径): '去掉文件名,返回目录路径' return os.path.dirname(路径)
@异常处理返回类型逻辑型 def 改变目录(路径): '成功返回True' os.chdir(路径) return True @异常处理返回类型逻辑型 def 改变当前进程目录(路径): '成功返回True' os.chroot(路径) return True
[文档]def 文件_检查权限(路径, 权限=os.F_OK): '类型:0 是否存在 1 是否可读 2 是否可写 3 是否可执行,返回True或False' # {0: os.F_OK, 1: os.R_OK, 2: os.W_OK, 3: os.X_OK} return os.access(路径, 权限)
[文档]def 文件_是否为绝对路径(路径): '传入路径返回True或False' return os.path.isabs(路径)
[文档]def 文件_是否为目录(路径): '传入路径返回True或False' return os.path.isdir(路径)
[文档]def 文件_是否为文件(路径): '传入路径返回True或False' return os.path.isfile(路径)
[文档]def 文件是否存在(路径): """传入路径返回True或False/可以判断文件夹或者文件""" return os.path.exists(路径)
[文档]def 文件_取文件大小(路径): '返回文件长度' return os.path.getsize(路径)
[文档]def 文件_获取文件信息(路径): '成功返回(上次访问时间,修改时间,文件大小),返回的是10位时间戳' 结果 = os.stat(路径) return (结果.st_atime, 结果.st_mtime, 结果.st_size)
[文档]def 文件_修改文件时间(路径, 时间): '成功返回True,传入的时间为10位时间戳元组类型(访问时间戳,修改时间戳)' os.utime(路径, 时间) return True
# 调用格式: 〈日期时间型〉 取文件时间 (文本型 文件名) - 系统核心支持库->磁盘操作 # 英文名称:FileDateTime # 返回指定文件被创建或最后修改后的日期和时间。如果该文件不存在,将返回100年1月1日。本命令为初级命令。 # 参数<1>的名称为“文件名”,类型为“文本型(text)”。 # # 操作系统需求: Windows、Linux
[文档]def 取文件访问时间(路径): '返回时间戳' return os.path.getatime(路径)
[文档]def 取文件创建时间(路径): '返回时间戳' return os.path.getctime(路径)
[文档]def 取文件修改时间(路径): '返回时间戳' return os.path.getmtime(路径)
[文档]def 文件_修改权限(路径, 权限=stat.S_IRWXU): 'http://www.runoob.com/python/os-chmod.html' # stat.S_IREAD 只读 # stat.S_IWRITE 取消只读 # stat.S_IRWXU 读写执行 return os.chmod(路径, 权限)
[文档]def 文件_枚举(欲寻找的目录=".", name=".jpg", 递归子目录=True): list = [] for item in os.listdir(欲寻找的目录): item_path = os.path.join(欲寻找的目录, item) if os.path.isdir(item_path): if (递归子目录): newlist = 文件_枚举(item_path, name, 递归子目录) for item_path in newlist: list.append(item_path) elif os.path.isfile(item_path): if name in item: list.append(item_path) return list
[文档]def 目录_枚举(欲寻找的目录=".", 递归子目录=True): list = [] for item in os.listdir(欲寻找的目录): item_path = os.path.join(欲寻找的目录, item) if os.path.isdir(item_path): list.append(item_path) if (递归子目录): newlist = 目录_枚举(item_path, 递归子目录) for item_path in newlist: list.append(item_path) return list
[文档]def 文件_删除(欲删除的文件名: str) -> bool: return 删除文件(欲删除的文件名)
[文档]def 文件_取扩展名(路径: str) -> str: return 子文本替换(文件_路径取扩展名(路径), ".", "")
[文档]def 文件_更名(原文件名, 新文件名) -> bool: return 文件更名(原文件名, 新文件名)
[文档]def 文件_取父目录(路径) -> str: return os.path.dirname(路径)
[文档]def 文件_写出(文件名: str, 欲写入文件的数据) -> bool: dir = 文件_取父目录(文件名) if 文件是否存在(dir) == False: 创建目录(dir) return 写到文件(文件名, 欲写入文件的数据)
@异常处理返回类型逻辑型 def 文件_追加文本(文件名: str, 欲追加的文本: str) -> bool: dir = 文件_取父目录(文件名) if 文件是否存在(dir) == False: 创建目录(dir) with open(文件名, "a") as f: f.write(str(欲追加的文本) + "\n") return True @异常处理返回类型逻辑型 def 读入文本(文件名: str) -> str: return 读入文件(文件名).decode('utf-8')
[文档]def 文件_保存(文件名: str, 欲写入文件的数据: bytes) -> str: dir = 文件_取父目录(文件名) if 文件是否存在(dir) == False: 创建目录(dir) return 文件_写出(文件名, 欲写入文件的数据) else: data = 读入文件(文件名) wdata = 欲写入文件的数据 if (data != wdata): return 文件_写出(文件名, 欲写入文件的数据) return True
[文档]def 文件从列表中选取存在的文件路径(路径列表): """ 匹配文件是否存在 存在则返回文件路径 .. code-block:: python :linenos: labelsPath = 文件从列表中选取存在的文件路径([ "./model/labels.txt", "/opt/labels.txt", "/opt/model/labels.txt", ]) """ for v in 路径列表: if os.path.exists(v): return v return ''
[文档]def 路径优化(path): """ 把\\ // 乱七八糟的路径转化为规整的 :param path: :return: """ if 寻找文本(path, "\\") > -1: path = 子文本替换(path, "\\", "/") if 寻找文本(path, r"\\") > -1: path = 子文本替换(path, r"\\", "/") if 寻找文本(path, r"//") > -1: path = 子文本替换(path, r"//", "/") return os.path.normpath(path)
[文档]def 目录_取文件夹大小(path): """传入路径是文件夹""" size = 0.0 for root, dirs, files in os.walk(path): size += sum([os.path.getsize(os.path.join(root, file)) for file in files]) size = round(size / 1024 / 1024, 2) if size > 1000: size = round(size / 1024, 2) return str(size) + '-GB' return str(size) + '-MB'