python3 文件操作(列出、创建、删除、复制) 文件打开模式

1. 文件操作

ls、mk、rm、cp

【1】列出文件夹

结果列表 = ls ( 文件全路径, 选项="", 要包含前缀=False )  # 选项="-r" 表示递归列出

【2】创建文件 or 文件夹

mk ( 文件全路径, 选项="-p", 要删除旧文件=False )  # 选项="-p" 表示递归创建,也可以是-r

【3】删除文件 or 文件夹

rm ( 文件全路径, 选项="-rf" )  # 选项="-r" 表示递归删除

【4】复制文件 or 文件夹

cp ( 旧文件, 新文件, 要删除旧文件=False )

2. 文件打开模式

(1)三种基本模式:r、w、a

r 只读

w 删除原文,只写

a 保留原文(追加),只写

(2)附加后缀

b 表示二进制读写

+ 表示额外赋予读写权限

U 表示读取的换行全部改成\n

(3)三种模式的不同

无文件时: r 报错,w、a 新建

是否清除原文:r 、a 否,w 是

初始读取位置:r、w 开头,a 结尾

import os
import shutil
from u_工具 import stream,getDeepFilePaths

# region fileSystem

def exist(文件全路径):
    return os.path.exists(文件全路径)


def isdir(文件全路径):
    if exist(文件全路径):
        return os.path.isdir(文件全路径)
    else:
        文件后缀 = get文件后缀(文件全路径)
        if not 文件后缀:
            return True
        else:
            return False


def ls(文件全路径, 选项="", 要包含前缀=False):
    选项 = 选项.lower()
    if exist(文件全路径):
        if isdir(文件全路径):
            if ("p" in 选项) or ("r" in 选项):
                return getDeepFilePaths(文件全路径, "*")
            else:
                if 要包含前缀:
                    return stream(os.listdir(文件全路径)) \
                        .map(lambda i: os.path.join(文件全路径, i)).collect()
                else:
                    return os.listdir(文件全路径)
        else:
            return [文件全路径];
    else:
        return []


def mkdir(文件全路径, 选项="-p"):
    选项 = 选项.lower()
    if not exist(文件全路径):
        if ("p" in 选项) or ("r" in 选项):
            os.makedirs(文件全路径)
        else:
            os.mkdir(文件全路径)


def mk(文件全路径, 选项="-p", 要删除旧文件=False):
    选项 = 选项.lower()
    if exist(文件全路径):
        if 要删除旧文件:
            rm(文件全路径)
        else:
            return

    if isdir(文件全路径):
        mkdir(文件全路径, 选项)
    else:
        所在目录 = get文件所在目录(文件全路径)
        if 所在目录 and (not exist(所在目录)):
            mk(所在目录, 选项)
        with open(文件全路径, "a"):
            pass


def rm(文件全路径, 选项="-rf"):
    if exist(文件全路径):
        if isdir(文件全路径):
            if ("p" in 选项) or ("r" in 选项):
                shutil.rmtree(文件全路径)
            else:
                # 只删除文件,保留文件夹
                try:
                    os.rmdir(文件全路径)
                except:
                    stream(ls(文件全路径, 要包含前缀=True)).filter(lambda i: not isdir(i)) \
                        .forEach(lambda i: rm(i))
        else:
            os.remove(文件全路径)


def get文件后缀(文件全路径):
    return os.path.splitext(文件全路径)[1]


def get文件名(文件全路径):
    return os.path.basename(文件全路径)


def get文件所在目录(文件全路径):
    return os.path.dirname(文件全路径)


def basename(文件全路径):
    return get文件名(文件全路径)


def dirname(文件全路径):
    return get文件所在目录(文件全路径)


def cp(旧文件, 新文件, 要删除旧文件=False):
    旧文件类型 = "dir" if isdir(旧文件) else "file"
    新文件类型 = "dir" if isdir(新文件) else "file"

    def file_file():
        # shutil.copyfile(旧文件,新文件)  # 只复制内容
        # 复制内容和权限 新文件不存在:新建,存在:覆盖
        shutil.copy(旧文件, 新文件)

    def file_dir():
        if not exist(新文件):
            mk(新文件)
        shutil.copy(旧文件, 新文件)

    def dir_file():
        if not exist(新文件):
            mk(新文件)
        with open(新文件, "ab") as ff:
            for i in ls(旧文件, 要包含前缀=True):
                with open(i, "rb") as f:
                    ff.write(f.read())

    def dir_dir():
        shutil.copytree(旧文件, 新文件)

    def default():
        raise Exception("复制失败,参数类型未支持")

    switch = {
        "file-file": file_file,
        "file-dir": file_dir,
        "dir-file": dir_file,
        "dir-dir": dir_dir
    }
    switch.get(f"{旧文件类型}-{新文件类型}", default)()

    if 要删除旧文件:
        rm(旧文件)

# endregion fileSystem

from u_工具 import stream,getDeepFilePaths 在:https://blog.csdn.net/u013595395/article/details/108772974

猜你喜欢

转载自blog.csdn.net/u013595395/article/details/109537816
今日推荐