美文网首页
Python操作文件封装工具类

Python操作文件封装工具类

作者: 爱学习的蹭蹭 | 来源:发表于2023-01-09 12:58 被阅读0次

    Python操作文件封装

    • 解压文件
    • 删除文件
    • 写入文件
    • 递归文件
    • 解决乱码
    • 删除目录
    • 创建目录
    • 去重数据
    # -*- coding:utf-8 -*-
    import os
    import re
    import time
    import operator
    import zipfile
    import rarfile
    import shutil
    
    # 找交集,差集
    def find_diff_str(list1,list2):
        A = set(list1).intersection(set(list2)) #交集
        B = set(list1).union(set(list2)) # 并集
        C = set(list1).difference(set(list2)) #差集,在list1中但不在list2中的元素
        D = set(list2).difference(set(list1)) #差集,在list2中但不在list1中的元素
        return A,B,C,D
     
    
    # 对个获取指定目录的所有文件
    def get_all_files(dir):
        fileList = []
        """遍历获取指定文件夹下面所有文件"""
        if os.path.isdir(dir):
            filelist = os.listdir(dir)
            for ret in filelist:
                filename = dir + "\\" + ret
                if os.path.isfile(filename):
                    fileList.append(filename)
        return fileList
    
    
    # 对个获取指定目录的所有文件
    def get_file_list_by_walk(dir):
        fileList = []
        """使用listdir循环遍历"""
        if not os.path.isdir(dir):
            return fileList
        dirlist = os.walk(dir)
        for root, dirs, files in dirlist:
            for fi in files:
                fileList.append(os.path.join(root, fi))
        return fileList
    
    #指定文件路径获取文件最后文件的路径包含文件
    #如:D:\test\file.txt 返回的结果为:D:\test\
    def get_file_root(path):
        #获取文件名
        #return os.path.split(path)[1] 
        # 获取文件路径
        return os.path.split(path)[0]
    
    #指定文件路径获取文件最后文件的路径包含文件
    #如:D:\test\file.txt 返回的结果为:file.txt
    def get_file_name(path):
        return os.path.basename(path)
        
    # 编码转换
    def decode(str):
        try:
            string = str.encode('cp437').decode('gbk')
        except:
            string = str.encode('utf-8').decode('utf-8')
        return string  
    # 创建目录
    def mkdir(path):
        # 去除尾部 \ 符号
        pathx = path.strip().rstrip("\\")
        # 判断路径是否存在
        # 存在     True
        # 不存在   False
        isExists = os.path.exists(pathx)
        # 判断结果
        if not isExists:
            # 如果不存在则创建目录创建目录操作函数
            os.makedirs(path)
            print(path + ' 创建成功')
            return True
        else:
            # 如果目录存在则不创建,并提示目录已存在
            print(path + ' 目录已存在')
            return False
    
    
    """
    参考文章 https://www.jb51.net/article/180325.htm
    https://blog.csdn.net/WANGYONGZIXUE/article/details/111576380
    在一个数组里面找重复值
    python处理去重用set函数
    """
    def find_repeat_val_by_list(list):
        values = {}
        for i in list:
          if list.count(i)>1:
            values[i] = list.count(i)
        return values
    
    """
    通过指定文件路径文件进行读取内容
    如:D:\test\file.txt
    """
    def reader_file(path):
        #解决乱码问题
        fi = open(path,'r',encoding='utf-8',errors = 'ignore')
        strs = []
        #splitlines解决不换行\n输出
        for line in fi.read().splitlines():
            if(len(line)>0):
                strs.append(line)
        return str
    
    """
    创建一个txt文件,并向文件写入msg
    @file_dir参数 代表文件目录 如:D:\test
    @file_name参数 代表文件名称 如:file.txt
    @msg参数 代表要写入文件的内容信息
    """
    def writer_to_file(file_dir, file_name, msg):
        # 先创建目录
        mkdir(file_dir)
        # 再打开文件
        full_path = file_dir + "\\" + file_name
        fi = open(full_path, 'w')
        # 写入文件
        fi.write(msg) 
        fi.close()
    
    
    
    
    #删除文件
    def del_files(dir_path):
        # os.walk会得到dir_path下各个后代文件夹和其中的文件的三元组列表,顺序自内而外排列,
        for root, dirs, files in os.walk(dir_path, topdown=False):
            # 第一步:删除文件
            for file_name in files:
                try:
                    os.remove(os.path.join(root, file_name))  # 删除文件
                except Exception as e:
                    print(f'删除文件,失败原因为:{e}' )
                    pass
        
            # 第二步:删除空文件夹
            for dir in dirs:
                try:
                    os.rmdir(os.path.join(root, dir)) # 删除一个空目录
                except Exception as e:
                    print(f'删除空文件夹,失败原因为:{e}' )
                    pass
                        
    # 创建目录
    def mkdir(path):
        # 去除尾部 \ 符号 
        pathx = path.strip().rstrip("\\")
        #print(f'pathx={pathx}')
        
        # 判断路径是否存在
        # 存在     True
        # 不存在   False
        isExists = os.path.exists(pathx)
        # 判断结果
        if not isExists:
            # 如果不存在则创建目录创建目录操作函数
            os.makedirs(path)
            print(path + ' 创建成功')
            return True
        else:
            # 如果目录存在则不创建,并提示目录已存在
            print(path + ' 目录已存在')
            return False
            
    
    class File:
        def __init__(self):
            self.fileList = []
    
        """
        递归列表文件
        """
        def recursion_file(self, filepath):
            files = os.listdir(filepath)
            for file in files:
                fi_d = os.path.join(filepath, file)
                if os.path.isdir(fi_d):
                    self.recursion_file(fi_d)
                else:
                    self.fileList.append(fi_d)
    
        """
        获取文件列表
        """
    
        def get_file_list(self, filepath):
            self.recursion_file(filepath)
            return self.fileList
    
    """
    解压rar文件
    需要安装WinRar并且配置环境变量
    pip install rarfile
    返回失败文件
    """
    def un_rar(filepath):
        fail_path = ''
        try:
            if os.path.isdir(filepath + "-file"):
                pass
            else:
                zipname = filepath
                extractpath = filepath.replace(".rar", "") + '-file'
                rar = rarfile.RarFile(zipname)
                rar.extractall(extractpath)
                rar.close()
                #os.remove(extractpath)
                #print(f'成功文件:{get_file_name(filepath)}' )
        except Exception as e:
            print(f'失败文件为:{get_file_name(filepath)}--->>un_rar Exception file fail' )
            fail_path = filepath
            pass
        return fail_path
    
    # 删除空文件夹
    def del_empty_file(dir_path):
        for root, dirs, files in os.walk(dir_path, topdown=False):
            for dir in dirs:
                try:
                    os.rmdir(os.path.join(root, dir)) # 删除一个空目录
                except Exception as e:
                    print(f'删除空文件夹,失败原因为:{e}' )
                    pass
    """
    解压zip文件 返回失败文件
    """
    def un_zip(filepath):
        fail_path = ''
        # 可以自己定义路径
        zipname = filepath
        extractpath = filepath.replace(".zip", "") + '-file'
        try:
           
            # 注意压缩格式选择
            frzip = zipfile.ZipFile(zipname, 'r', zipfile.ZIP_DEFLATED)
            # 将所有文件加压缩到指定目录
            frzip.extractall(extractpath)
            frzip.close()
        except Exception as e:
            print(f'失败文件为:{get_file_name(filepath)}' )
            fail_path = filepath
            pass
        
        #解压完成
        all_path_file = []
        all_path_dir = []
        for root, dirs, files in os.walk(extractpath):
            for file in files:
                file_kv = {'name': file, 'path': root}
                all_path_file.append(file_kv)
            for dir1 in dirs:
                # 文件深度
                deep_count = len(root.split('\\'))
                dir_kv = {'name': dir1, 'path': root, 'deep': deep_count}
                all_path_dir.append(dir_kv)
        # 一定是先文件再文件夹,否者重命名后文件夹内的文件找不到,先是最大深度文件夹,所以需要深度排序
        all_path_dir = sorted(all_path_dir, key=operator.itemgetter('deep'), reverse=True)
    
        for dic in all_path_file + all_path_dir:
            file_name   = dic['name']
            parent_path = dic['path']
            file_name_ok  = decode(file_name)  
            err_path_name = os.path.join(parent_path, file_name)
            ok_path_name  = os.path.join(parent_path, file_name_ok)
            os.rename(err_path_name, ok_path_name)  # 重命名文件
            
        return fail_path
    
    

    python读取Excel推荐文章

    相关文章

      网友评论

          本文标题:Python操作文件封装工具类

          本文链接:https://www.haomeiwen.com/subject/xggpcdtx.html