python文件操作详解编程语言

#! /usr/bin/python 
# -*- coding:utf-8 -*- 
''' 
Created on 2013-12-11 
 
@author: Java 
''' 
import os 
import MySQLdb 
from db.DbUtil import DbUtil 
import time 
import shutil 
import sys 
import zipfile 
from os.path import  join,getsize 
import math 
 
 
class FileOption(): 
    #global fileList  类的全局变量  放置位置  
     
    def __init__(self): 
        pass 
     
    def CreateFloderByList(self,pathList): 
        ''' 
        创建文件夹 
        :param pathList:文件夹集合 
        ''' 
        self.pathList = pathList 
        for path in pathList: 
            if not os.path.isdir(path): 
                os.makedirs(path) 
                 
    def CreateFloder(self,path): 
         
        self.path = path 
        if not os.path.isdir(path): 
            os.makedirs(path)     
             
    def readFileName(self,path): 
        fileNames = os.listdir(path) 
        return fileNames 
     
    def renameFile(self,path): 
        ''' 
        批量修改文件的名称 
        :param path: 
        ''' 
        self.path = path 
         
     
        allRenameList = os.listdir(path) 
        for allRenameItem in allRenameList: 
            renamePath =os.path.join(path,allRenameItem) 
            if os.path.isfile(renamePath)==True: 
                print allRenameItem 
                if allRenameItem.find('.')<0: 
                    newname = allRenameItem+'index.html' 
                    os.renames(os.path.join(path,allRenameItem), os.path.join(path,newname)) 
                    print allRenameItem,'ok' 
                else: 
                    os.renames(os.path.join(path,allRenameItem), os.path.join(path,'index.html')) 
                    print allRenameItem,'ok' 
                     
    def renameFile2(self,path,newName): 
        ''' 
        批量修改文件名称,解决了中文文件名称的问题 
     
        :param path:路径 
        :param newName:新名称 
        ''' 
     
        allRenameList = os.listdir(path) 
        for allRenameItem in allRenameList: 
            renamePath =os.path.join(path,allRenameItem) 
            if sys.getfilesystemencoding()=='mbcs': 
                renamePath=renamePath.decode('mbcs') 
                print renamePath 
            elif sys.getfilesystemencoding() & 0x800: 
                renamePath=renamePath.decode('utf-8') 
#                 print renamePath 
            if os.path.isfile(renamePath)==True: 
                if sys.getfilesystemencoding()=='mbcs': 
                    allRenameItem=allRenameItem.decode('mbcs') 
                elif sys.getfilesystemencoding() & 0x800: 
                    allRenameItem=allRenameItem.decode('utf-8') 
                    if allRenameItem.find('.')<0: 
                        newname = allRenameItem+newName 
                        os.renames(os.path.join(path,allRenameItem), os.path.join(path,newname)) 
                        print allRenameItem,'ok' 
                    else: 
                        os.renames(os.path.join(path,allRenameItem), os.path.join(path,newName)) 
                        print allRenameItem,'ok' 
            else: 
                option = FileOption() 
                option.renameFile2(renamePath,newName) 
             
    def IteratrFolder(self,testpath): 
        ''' 
        遍历文件夹 并且解决了中文文件名的问题 
        查看系统文件名编码  sys.getfilesystemencoding() 
        :param path: 
        ''' 
        listsubDir=[] 
        list = os.listdir(testpath) 
        for filename in list: 
            if sys.getfilesystemencoding()=='mbcs': 
                filename=filename.decode('mbcs') 
                paths = os.path.join(testpath,filename) 
                if os.path.isdir(paths): 
                    listSub = os.listdir(paths) 
                    for sub in listSub: 
                        subDir = os.path.join(paths,sub) 
                        listsubDir.append(subDir) 
                return listsubDir 
                     
    def RemoveFilesByFileType(self,path,fileType): 
        ''' 
        批量删除指定文件夹下指定文件类型的文件 
        :param path:路径 
        :param fileType:文件类型 
        ''' 
        fileList = os.listdir(path) 
        for one in fileList: 
            print one 
            removePath =os.path.join(path,one) 
            if os.path.isfile(removePath)==True: 
                if removePath.find(fileType)>=0: 
                    os.remove(removePath) 
      
    def isSubString(self,subStrList,string): 
        ''' 
        判断 字符串Str是否包含序列subStrList 中的每一个子字符串 
        subStrList =['py','java','txt'] 
        string = 'nihaojavaandpython.txt' 
        isSubString(subStrList,string) 
        reutn Treu(or False) 
         
        '''   
        flag = True 
        for substr in subStrList: 
            if not (substr in string): 
                flag = False 
         
        return flag 
     
    def getFileSuffix(self,filePath): 
        ''' 
        得到所有文件的后缀名,用系统的函数os.path.splitext 
        ''' 
        try: 
             
            for (dirPath,dirs,files) in os.walk(filePath): 
                for filename in files: 
                    ext = os.path.splitext(filename)[1] #取得文件类型,注意它还带着点号    
                    print ext 
        except os.error,e: 
            print 'error e'%e   
     
    def getFileListBySuffix(self,filePath,fileList,suffixStr=[]): 
        ''' 
        获取目录中指定的后缀名的文件     (自己写的方法)   
        ''' 
        fileNames = os.listdir(filePath) 
        for fileName in fileNames: 
            findPath = os.path.join(filePath, fileName)  
            if os.path.isfile(findPath): 
                if (len(fileNames)>0): 
                    if(len(suffixStr)>0): 
                        #返回指定类型的文件名 
                        option = FileOption() 
                        if (option.isSubString(suffixStr,fileName)): 
                            fullFileName = os.path.join(filePath,fileName) 
                            fileList.append(fullFileName)                         
                    
            elif os.path.isdir(findPath): 
                option = FileOption() 
                option.getFileListBySuffix(findPath,fileList,suffixStr)               
        #对文件名排序            
        if (len(fileList)>0): 
            fileList.sort() 
             
            return  fileList 
         
    def getFileListBySuffix_Better(self,filePath,fileList,suffixStr=[]): 
        ''' 
        获取目录中指定的后缀名的文件     (自己写的方法速度更快)   
        ''' 
        for (dirPath,dirs,files) in os.walk(filePath): 
            for filename in files: 
                if (len(files)>0): 
                    if(len(suffixStr)>0): 
                        #返回指定类型的文件名 
                        option = FileOption() 
                        if (option.isSubString(suffixStr,filename)): 
                            fullFileName = os.path.join(filePath,filename) 
                            fileList.append(fullFileName)                         
               
        #对文件名排序            
        if (len(fileList)>0): 
            fileList.sort() 
            return  fileList     
    def getFileListBySuffix_Best(self,filePath,fileList,suffixStr=[]): 
        ''' 
        获取目录中指定的后缀名的文件     (自己写的方法速度更快)   
        ''' 
        for (dirPath,dirs,files) in os.walk(filePath): 
            for filename in files: 
                if (len(files)>0): 
                    if(len(suffixStr)>0): 
                        #返回指定类型的文件名 
                        for suf in suffixStr: 
                            if os.path.splitext(filename)[1].find (suf)==0: 
                                fullFileName = os.path.join(dirPath,filename) 
                                fileList.append(fullFileName)                         
               
        #对文件名排序            
        if (len(fileList)>0): 
            fileList.sort() 
            return  fileList     
 
     
    def copyFiles(self,sourceDir, targetDir):  
        ''' 
        实现对文件的拷贝 
        ''' 
 
        for file in os.listdir(sourceDir):  
            sourceFile = os.path.join(sourceDir,  file)  
            targetFile = os.path.join(targetDir,  file)  
            if os.path.isfile(sourceFile):  
                if not os.path.exists(targetDir):   
                    os.makedirs(targetDir)   
                if not os.path.exists(targetFile) or(os.path.exists(targetFile) and (os.path.getsize(targetFile) != os.path.getsize(sourceFile))):   
                    open(targetFile, "wb").write(open(sourceFile, "rb").read())  
            if os.path.isdir(sourceFile):  
                First_Directory = False 
                create = FileOption()  
                create.copyFiles(sourceFile, targetFile) 
                 
    def moveFiles(self,dir,extName): 
        ''' 
        :param dir:原始数据目录 
        :param extName:文件的扩展名 
        根据文件名创建文件夹,并将其放入对应的文件夹内 
        ''' 
        self.dir = dir 
        self.extName = extName 
        for i in os.listdir(dir): 
            name = ''.join(i.split(extName)[0:-1]) 
            print name 
            os.mkdir(os.path.join(dir,name)) 
            os.rename(os.path.join(dir,i), os.path.join(dir,name,i)) 
                         
     
    def moveDirAndFiles(self,oldPath,newPath): 
        ''' 
        实现对指定文件的迁移 
        :param oldPath:源路径 
        :param newPath:目的路径 
        ''' 
        self.oldPath = oldPath 
        self.newPath = newPath 
        try: 
            allChangeFileList = os.listdir(oldPath) 
            for allChangeItem in allChangeFileList: 
                changeFilePath =os.path.join(oldPath,allChangeItem) 
 
                if os.path.isdir(changeFilePath): 
 
                    dstAddPath = os.path.join(newPath,allChangeItem) 
                    if os.path.exists(dstAddPath): 
 
                        moveFiles = FileOption() 
                        moveFiles.moveDirAndFiles(oldPath,dstAddPath) 
                    else: 
                        os.makedirs(newPath) 
                        os.rename(oldPath,newPath) 
                else: 
                    shutil.move(oldPath,newPath) 
                return True 
        except os.errno,e: 
            print 'error e%s'%e 
             
             
             
#     def moveDirAndFiles_Better(self,oldPath,newPath): 
#         ''' 
#         实现对指定文件的迁移 
#         :param oldPath:源路径 
#         :param newPath:目的路径 
#         ''' 
#         self.oldPath = oldPath 
#         self.newPath = newPath 
#         try: 
#             for (dirPath,dirs,files) in os.walk(oldPath): 
#                 for filename in files: 
#                     dstPath = os.path.join(dirPath,filename) 
#                     print dstPath 
#                     if os.path.exists(dstPath): 
#                         shutil.move(oldPath,newPath) 
#                     else: 
#                         os.makedirs(newPath) 
#                         os.rename(oldPath,newPath) 
#         except os.errno,e: 
#             print 'error e%s'%e 
 
    def TraverseFolder(self,path): 
        ''' 
        遍历文件夹 
        :param path: 
        ''' 
        self.path = path 
        print "<----folder&file---->" 
        no=0 
        for (path,dirs,files) in os.walk(path): 
            print  
            no += 1 
            print "No.%d"%no 
            print "path=%s"%path 
            if len(dirs)!=0: 
#                 print type(dirs) 
                subfolders = '' 
                for dir in dirs: 
                    subfolders += dir+';' 
                subfolders = '[' + subfolders + ']' 
                print "subfolders=%s"%subfolders 
            if len(files)!=0: 
                filenames = '' 
                for filename in files: 
                    filenames += filename+';' 
                filenames = '[' + filenames + ']' 
                print "files=%s"%filenames 
        print "<----folder&file---->" 
     
 
     
    def renameExpendNameOfFile(self,path,oldexp_name,newexp_name): 
        ''' 
         
        :param path:路径 
        :param oldexp_name:旧的扩展名 
        :param newexp_name:新的扩展名 
        ''' 
        self.path = path 
        self.oldexp_name = oldexp_name 
        self.newexp_name = newexp_name 
        changedCount = 0           
        for (path,dirs,files) in os.walk(path): 
            for filename in files: 
                ext = os.path.splitext(filename)[1] #取得文件类型,注意它还带着点号             
                if (ext == oldexp_name): 
                    changedCount += 1 
                    newname = filename.replace(oldexp_name, newexp_name) 
                    oldpath = path + "//" + filename       
                    newpath = path + "//" + newname 
                    try: 
                        os.rename(oldpath, newpath) 
                        print 'No.%d'%changedCount, 'change', oldpath, 'to', newpath 
                    except BaseException, e:   
                        print(str(e)) 
         
         
    def renameExpendNameOfFile2(self): 
        ''' 
    修改文件的后缀名,有控制台输入参数 
    ''' 
        str = u'请输入要处理的文件夹路径====>' 
        path = raw_input(str.encode('utf-8')) 
        print path 
     
        str = u'请输入源文件类型(不包括.)====>' 
        old_ext = "."+raw_input(str.encode('utf-8')) 
        print old_ext 
     
        str = u'请输入目标文件类型(不包括.)====>' 
        new_ext = "."+raw_input(str.encode('utf-8'))     
        print new_ext 
     
        print   #输出空行占位 
        f = FileOption() 
        f.TraverseFolder(path) 
        print 
     
        str = u'开始批量更名' 
        print str 
        print '<-----------------' 
        changedCount = 0           
        for (path,dirs,files) in os.walk(path): 
            for filename in files: 
                ext = os.path.splitext(filename)[1] #取得文件类型,注意它还带着点号             
                if (ext == old_ext): 
                    changedCount += 1 
                    newname = filename.replace(old_ext, new_ext) 
                    oldpath = path + "//" + filename       
                    newpath = path + "//" + newname 
                    try: 
                        os.rename(oldpath, newpath) 
                        print 'No.%d'%changedCount, 'change', oldpath, 'to', newpath 
                    except BaseException, e:   
                        print(str(e)) 
        print '----------------->' 
 
 
    def deleteFolder(self,path): 
        ''' 
        删除指定目录下的文件 
        :param path: 
        ''' 
        self.path = path 
         
        for root ,dirs,files in os.walk(path, False): 
            for name in files: 
                os.remove(os.path.join(root,name)) 
            for name in dirs: 
                os.rmdir(os.path.join(root,name)) 
                 
                 
                 
    def remove_empty_dir(self,path): 
        ''' 
        删除目录下所有的空文件夹 
        :param path: 
        ''' 
        self.path = path 
         
        while(path[-1] == "//"): 
            path = path[:-1] 
            print path 
  
        a = {} 
        for root, dirs, files in os.walk(path, False): 
            print dirs 
            if len(files) == 0: 
                a[root] = 0 
            else: 
                for file in files: 
                    try: 
                        fn = os.path.join(root, file) 
                        size = os.path.getsize(fn) 
                        if size != 0: 
                            b = root 
                            while(b != path): 
                                a[b] = 1 
                                b = b.rpartition("//")[0] 
                            a[path] = 1 
                        else: 
                            try: 
                                os.remove(fn) 
                                a[root] = 0 
                            except (WindowsError): 
                                b = root 
                                while(b != path): 
                                    a[b] = 1 
                                    b = b.rpartition("//")[0] 
                                a[path] = 1 
                    except (WindowsError): 
                        b = root 
                        while(b != path): 
                            a[b] = 1 
                            b = b.rpartition("//")[0] 
                        a[path] = 1 
                      
                    if a[root]: 
                        break; 
        empty_dirs = [] 
        for i,j in a.iteritems(): 
            if j == 0: 
                print i 
                empty_dirs.insert(0, i) 
        del a 
        empty_dirs.sort(reverse = True)     
        for i in empty_dirs: 
            try: 
                os.rmdir(i) 
                print "%s 删掉了!!" % (i) 
            except (WindowsError): 
                print "%s 删不掉!!" % (i) 
                 
    def zipAllFiles(self,startdir,zipPath): 
        ''' 
    实现批量压缩文件 
        :param startdir: 压缩包的层次  比如download.zip解压开是:download/1/1.html   所以startdir 就是‘f:/download/’ 
        :param zipPath:  download/1/ 文件的上次层次 
        ''' 
        self.startdir = startdir 
        self.zipPath = zipPath 
         
        for dirpath, dirnames, filenames in os.walk(startdir): 
            for filename in filenames: 
                newp = dirpath+'//' 
 
                if newp.find('F:'+zipPath)==0: 
                    print os.path.join(newp,filename) 
              
#                     f = zipfile.ZipFile('F:/pythonTest/zipTest//'+'download'+str(DownID)+'.zip','a',zipfile.ZIP_DEFLATED) 
#                     f.write(os.path.join(newp,filename)) 
#                     print os.path.join(newp,filename) 
#                     f.close() 
                     
                     
    def getAllFileSize(self,path,size): 
        ''' 
        得到整个文件所在文件夹的大小 
        1B = 8 bit 
        1KB = 1024 B 
        1MB = 1024 KB 
        1MB = 1024*1024 B 
        1GB = 1024 MB 
        :param path: 
        ''' 
        self.path = path 
        for dirpath,dirs,files in os.walk(path): 
            size += sum([getsize(join(dirpath,name)) for name in files]) 
        return size 
     
    def getFileSize(self,path): 
        ''' 
        得到每个文件的大小,以字典方式存入list中 
        :param path: 
        ''' 
        self.path = path 
         
        sizeDic={} 
        sizeList = [] 
        for dirpath,dirs,files in os.walk(path): 
             
            for file in files: 
                fileSize = getsize(join(dirpath,file)) 
                sizeDic={file:fileSize} 
                sizeList.append(sizeDic) 
        return sizeList 
 
     
             
         
         
if __name__=='__main__': 
    db = DbUtil() 
    create =FileOption() 
    size1 = create.getFileSize('F://pythonTest//delete//') 
 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/8159.html

(0)
上一篇 2021年7月18日 19:19
下一篇 2021年7月18日 19:28

相关推荐

发表回复

登录后才能评论