Python案例:文件和文件夹操作
来自CloudWiki
(重定向自Python文件与文件夹操作 精彩案例)
文件名批量随机化
示例10-1(可选) 把指定文件夹中的所有文件名批量随机化,保持文件类型不变。
from string import ascii_letters from os import listdir, rename from os.path import splitext, join from random import choice, randint def randomFilename(directory): for fn in listdir(directory): #切分,得到文件名和扩展名 name, ext = splitext(fn) n = randint(5, 20) #生成随机字符串作为新文件名 newName = ''.join((choice(ascii_letters) for i in range(n))) #修改文件名 rename(join(directory, fn), join(directory, newName+ext)) randomFilename('C:\\test')
文件夹增量备份
例10-2 编写程序,进行文件夹增量备份。
程序功能与用法:指定源文件夹与目标文件夹,自动检测自上次备份以来源文件夹中内容的改变,包括修改的文件、新建的文件、新建的文件夹等等,自动复制新增或修改过的文件到目标文件夹中,自上次备份以来没有修改过的文件将被忽略而不复制,从而实现增量备份。本例属于系统运维的范畴。
import os import filecmp import shutil import sys def autoBackup(scrDir, dstDir): if ((not os.path.isdir(scrDir)) or (not os.path.isdir(dstDir)) or (os.path.abspath(scrDir)!=scrDir) or (os.path.abspath(dstDir)!=dstDir)): usage() for item in os.listdir(scrDir): scrItem = os.path.join(scrDir, item) dstItem = scrItem.replace(scrDir,dstDir) if os.path.isdir(scrItem): #创建新增的文件夹,保证目标文件夹的结构与原始文件夹一致 if not os.path.exists(dstItem): os.makedirs(dstItem) print('make directory'+dstItem) #递归调用自身函数 autoBackup(scrItem, dstItem) elif os.path.isfile(scrItem): #只复制新增或修改过的文件 if ((not os.path.exists(dstItem)) or (not filecmp.cmp(scrItem, dstItem, shallow=False))): shutil.copyfile(scrItem, dstItem) print('file:'+scrItem+'==>'+dstItem) autoBackup(scrDir, dstDir)
统计目录占用空间
示例10-3 编写程序,统计指定文件夹大小以及文件和子文件夹数量。本例也属于系统运维范畴,可用于磁盘配额的计算,例如email、博客、FTP、快盘等系统中每个账号所占空间大小的统计。
import os totalSize = 0 fileNum = 0 dirNum = 0 def visitDir(path): global totalSize global fileNum global dirNum for lists in os.listdir(path): sub_path = os.path.join(path, lists) if os.path.isfile(sub_path): fileNum = fileNum+1 #统计文件数量 totalSize = totalSize+os.path.getsize(sub_path) #统计文件总大小 elif os.path.isdir(sub_path): dirNum = dirNum+1 #统计文件夹数量 visitDir(sub_path) #递归遍历子文件夹 def main(path): if not os.path.isdir(path): print('Error:"', path, '" is not a directory or does not exist.') return visitDir(path) def sizeConvert(size): #单位换算 K, M, G = 1024, 1024**2, 1024**3 if size >= G: return str(size/G)+'G Bytes' elif size >= M: return str(size/M)+'M Bytes' elif size >= K: return str(size/K)+'K Bytes' else: return str(size)+'Bytes' def output(path): print('The total size of '+path+' is:'+sizeConvert(totalSize) +'('+str(totalSize)+' Bytes)') print('The total number of files in '+path+' is:',fileNum) print('The total number of directories in '+path+' is:',dirNum) if __name__=='__main__': path = r'd:\idapro6.5plus' main(path) output(path)
递归删除文件
示例10-4 编写程序,递归删除指定文件夹中指定类型的文件和大小为0的文件。
from os.path import isdir, join, splitext from os import remove, listdir, chmod, stat filetypes = ('.tmp', '.log', '.obj', '.txt') #指定要删除的文件类型 def delCertainFiles(directory): if not isdir(directory): return for filename in listdir(directory): temp = join(directory, filename) if isdir(temp): delCertainFiles(temp) #递归调用 elif splitext(temp)[1] in filetypes or stat(temp).st_size==0: chmod(temp, 0o777) #修改文件属性,获取删除权限 remove(temp) #删除文件 print(temp, ' deleted....') delCertainFiles(r'C:\test')