zoukankan      html  css  js  c++  java
  • Python之文件操作工具

    逐步完善中。

    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    
    import os
    import codecs #支持多国语言的编码解码
    import chardet # 自动判别侦听文件字符集类型
    
    class FileUtil:
        """ 
        File Operation Tool 
        -----------------------
            + api link
                + [Python File(文件) 方法 - 菜鸟教程](https://www.runoob.com/python/file-methods.html)
                + [Python 文件I/O - 菜鸟教程](https://www.runoob.com/python/python-files-io.html)
            + default encoding:utf-8
    		+ methods
    			+ writeFile(filePath,data,encoding='utf-8')
    			+ writeFileByCover(filePath,data,encoding='utf-8')
    			+ writeFileByAppend(filePath,data,encoding='utf-8')
    			+ fileSwitchEncode(filePath,oldEncodeCharset,newEncodeCharset='utf-8')
    			+ fileCharset(filePath)
    			+ readFileNBytes(filePath,startPosition=0,readByteSize=1000,encoding='utf-8')
    			+ readFileNLines(filePath,startLine=0,lineSize=10,encoding='utf-8')
    			+ readFile(filePath,encoding='utf-8')
    			+ getAlllFilesPathOfCurrentDirectory(file_dir=None) 获取当前路径下的所有文件 
    			+ getAllSubDirsOfCurrentDirectory(file_dir=None) 获取当前路径下的所有子目录(一级子目录)
    			+ printAllFile(file_dir) 打印指定路径下的所有文件、目录 
        """
        def writeFile(filePath,data,encoding='utf-8'):
            FileUtil.writeFileByCover(filePath,data,encoding); # 默认覆盖
            pass;
        # 通过覆盖的方式写入新数据
        # + 打开一个文件用于读写。
        # + 如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。
        # + 如果该文件不存在,创建新文件。
        def writeFileByCover(filePath,data,encoding='utf-8'):
            with open(filePath,'w',encoding=encoding) as file:
                file.write(data);
                file.flush(); # 主动刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。
                file.close();
            pass;
        # 如果文件存在,则通过从原文件结尾处添加新数据的方式写入
        # + 打开一个文件用于追加。
        # + 如果该文件已存在,文件指针将会放在文件的结尾。
        # + 也就是说,新的内容将会被写入到已有内容之后。
        # + 如果该文件不存在,创建新文件进行写入。
        def writeFileByAppend(filePath,data,encoding='utf-8'):
            with open(filePath,'a',encoding=encoding) as file:
                file.write(data);
                file.flush(); # 主动刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。
                file.close();
            pass;
        # 文件编码转换
        ### path = r"C:Users千千寰宇Desktop	ext.txt";
        ### FileUtil.fileSwitchEncode(path,'gbk','utf-8');
        def fileSwitchEncode(filePath,oldEncodeCharset,newEncodeCharset='utf-8'):
            data = '';
            newData = '';
            newFileTmpPath = filePath+".tmp";
            if os.path.exists(newFileTmpPath) == True: #存在:删除其内容
                os.remove(newFileTmpPath); # 删除已存在的临时文件
                print("[fileSwitchEncode] Remove temporary file '",newFileTmpPath,"' successfully!");
                pass;
            newFile =  codecs.open(newFileTmpPath,'a',encoding=newEncodeCharset); #a:文件末尾追加 + 写
            with codecs.open(filePath,"r",encoding=oldEncodeCharset) as file:
                data = file.readlines();
                for line in data:
                    newFile.write(line.encode(newEncodeCharset).decode(newEncodeCharset));# gbk,utf-8
                    pass;
                file.close();
            newFile.close();
            #删除 原file
            os.remove(filePath);
            os.rename(newFileTmpPath, filePath);# os.rename(src,dist) #将临时文件路径命名为 原file的名字
            pass;
        
        def fileCharset(filePath): #获得文件的字符集类型
            tmpFile = open(filePath,'rb');
            data = tmpFile.read(90)
            tmpFile.close()
            print(chardet.detect(data));
            return chardet.detect(data)["encoding"]; # 形如:gbk,utf-8
            pass;
    		
        def readFileNBytes(filePath,startPosition=0,readByteSize=1000,encoding='utf-8'): #读取从第startPosition字节处开始的readByteSize字节的文件数据 
            data = '';
            if startPosition < 0:
                startPosition = 0;
                pass;
            if readByteSize < 1:
                readByteSize = 100;
                pass;
            with open(filePath,'r',encoding=encoding) as f:
                f.seek(startPosition); # startPosition即偏移字节位置
                data = f.read(readByteSize);
                f.close();
                pass;
            return data;
            pass;
    
        def readFileNLines(filePath,startLine=0,lineSize=10,encoding='utf-8'): #读取从第startLine行开始的lineSize行文件数据 
            data = '';
            i = 0; #记录当前所处行数
            line = None;
            endLineSize = startLine + lineSize;
            with open(filePath,'r',encoding=encoding) as f:
                print ("[FileUtil.readFileNLines] file name: ", f.name)
                line = f.readline();
                while (line!=None) and (i < startLine): 
                    line=None;
                    line = f.readline();
                    i+=1;
                    pass;
                print("current line[",i,"] line:",line); # test
                while (line!=None) and (i<endLineSize):
                    # print ("[FileUtil.readFileNLines] 第 %d 行 - %s" % (i+1, line)); # test
                    data += line;
                    line=None;
                    line = f.readline();
                    i+=1;
                    pass;
                f.close();
            return data;
            pass;
    
        def readFile(filePath,encoding='utf-8'):
            #data = '';
            #try:
                #f = open(filePath, 'r',encoding='utf-8');
                ## print(f.read());
                #for line in f:
                #    #print(line);
                #    data +=line;
                #    pass;
            #finally:
                #if f:
                    #f.close();
                    #pass;
                #pass;
            with open(filePath,'r',encoding=encoding) as file:
                data = file.read()
            return data;
            pass; 
    
        def getAlllFilesPathOfCurrentDirectory(file_dir=None):#获取当前路径下的所有文件 
            """
            获取当前路径下的所有文件 
            ------------------------
            即 不包含子目录下的文件和子目录
            :file_dir:必须为存在的目录路径,不得为文件路径
            :return 文件名数组,形如:['DatabaseUtil.py', 'FileUtil.py', 'PageRank.py', 'poms.ipynb', 'Test.ipynb', 'textrank.ipynb', 'Untitled.ipynb']
            """
            L=[];
            for root, dirs, files in os.walk(file_dir): 
                L.append(files);
                # print(files) #当前路径下所有非目录子文件
                pass
            # print(L); # test
            return L[0];
    
        def getAllSubDirsOfCurrentDirectory(file_dir=None):#获取当前路径下的所有子目录(一级子目录)
            """
            获取当前路径下的所有子目录(一级子目录)
            ------------------------
            即 不包含子目录下的文件和子目录
            :file_dir:必须为存在的目录路径,不得为文件路径
            :return 子目录数组,形如:['.ipynb_checkpoints', '__pycache__']
            """
            L=[];
            for root, dirs, files in os.walk(file_dir): 
                L.append(dirs);
                # print(files) #当前路径下所有非目录子文件
                pass
            # print(L); # test
            return L[0];
    
        def printAllFile(file_dir): #打印指定路径下的所有文件、目录 
            L=[];
            for root, dirs, files in os.walk(file_dir): 
                print("root:",root) #当前目录路径  
                print("dirs:",dirs) #当前路径下所有子目录  
                print("files:",files) #当前路径下所有非目录子文件
                # for file in files:  
                    # if os.path.splitext(file)[1] == '.jpeg':   # 指定特定类型的文件
                        # L.append(os.path.join(root, file))  
                        # pass;
                    # pass;
                # return L;
            pass
        
        pass; # end class
    
  • 相关阅读:
    echo和重定向
    grep命令
    重温JSP学习笔记--JSP动作标签
    重温JSP学习笔记--El表达式
    重温JSP学习笔记--El函数库
    重温JSP学习笔记--JSTL标签库
    重温JSP学习笔记
    Android 用 camera2 API 自定义相机
    从零开始用 Flask 搭建一个网站(一)
    从零开始用 Flask 搭建一个网站(二)
  • 原文地址:https://www.cnblogs.com/johnnyzen/p/10813439.html
Copyright © 2011-2022 走看看