Python案例:文件和文件夹操作

来自CloudWiki
跳转至: 导航搜索

文件名批量随机化

示例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')

返回 Python 文件与文件夹操作