Python编程快速上手——让繁琐工作自动化第九章测试题

Python编程快速上手——让繁琐工作自动化(第九章)

9.8.1 选择性拷贝

题目

  • 编写一个程序,遍历一个目录树,查找特定扩展名的文件(诸如.pdf或jpg)。
  • 不论这些文件的位置在哪里,将它们拷贝到一个新的文件夹中。

分析

  • 创建存放内容的文件夹(根据扩展名来命名)
  • 使用walk遍历指定文件夹
  • 将返回的文件copy到扩展名文件夹中
  • 有感而发,就写的比较详细,已经打包成脚本,可以清理微信的“垃圾堆”了。我怕吓跑你们,哈哈哈

代码

import os, shutil, datetime, re

#解决文件名重复的问题,面对多重文件夹的情况
def comFileName(fn1, en):
    if fn1 in os.listdir('.\\'+monthDay+'\\'+ en +''):   
        fn2 =  os.path.splitext(fn1)[0] + '&' + os.path.splitext(fn1)[1]
        return comFileName(os.path.split(fn2)[1], en)
    return os.path.join('.\\'+monthDay+'\\'+ en + '\\', fn1)
    
while True:
    #初始化界面
    print('***********欢迎使用1.0脚本***********')
    basePath = input('请输入你需要分类的文件夹路径:可直接将文件夹拉入指令框\n原文件夹路径:   ')
    #当你使用命令框来运行py时,直接将文件路径拉到命令框时,可能格式为"C:\Program Files"
    basePathRegex = re.compile(r'\".*?\"')
    if basePathRegex.search(basePath):
        basePath = basePath[1:-1]
        print(basePath)
    user1 = input('您是选择全部分类还是指定分类;\n--------全部分类请输入\'1\'--------指定分类请输入\'2\'\n----------------: ')

    #生成日期文件
    monthDay = datetime.datetime.now().strftime('%m%d-%H-%M-%S')
    os.mkdir('.\\'+monthDay+'')
    #初始化后缀类型列表  
    extensionName = []

    #用户选择分类标准,创建指定扩展文件夹
    if user1 == '2':
        print("您选择了指定分类")
        printStr = '请输入所选扩展名;例如:jpg txt: \n'
        extensionName = list(map(str, input(printStr).split()))
        [os.mkdir('.\\'+monthDay+'\\'+ i +'') for i in extensionName]
    else:
        print("您选择了全部分类分类")

    #对文件分类的核心部分       
    for folderName, subFolders, fileNames in os.walk(basePath):
        print('正在检索%s...' % (folderName))
        for fn in fileNames:
            #如果用户选择了全部分类,可在此处筛选后缀,节省运行时间,创建全部扩展文件夹
            if (user1 != '2') and (os.path.splitext(fn)[1][1:] not in extensionName):
                extensionName.append(os.path.splitext(fn)[1][1:]) 
                os.mkdir('.\\'+monthDay+'\\'+ os.path.splitext(fn)[1][1:] +'')
                        
            for en in extensionName:
                if fn.endswith(en):               
                    #两个扩展文件名字是否相同
                    if fn not in os.listdir('.\\'+monthDay+'\\'+ en +''):   
                        fn = folderName + '\\' + fn                
                        shutil.copy(fn, '.\\'+monthDay+'\\'+ en +'')
                    else:
                        a = comFileName(fn, en)
                        (open(a, 'w')).close()                   
                        #os.mknod(a)
                        #使用os.mknod()的时候,碰到了这个问题。搜了一下才知道Windows上的Python不支持mknod函数,
                        fn = folderName + '\\' + fn 
                        shutil.copy(fn, a)                                    
                    break
    aaa = input('Done...\n是否继续分类其他文件夹;\n--------继续请按"1"--------退出请按"0": \n----------------:')
    if aaa.lower() == 'n':
        break
    else:
        print('\n\n\n')

测试

  • 简单实现的话,不用那么长的代码。就是写着写着发现有点搞头,就扩展了一下下。
  • 扫描文件的时,文件是无后缀名时,程序会错误,可以设个异常处理,我。。懒得弄了。
    在这里插入图片描述
    在这里插入图片描述
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

9.8.2 删除不需要的文件

题目

  • 一些不需要的、 巨大的文件或文件夹占据了硬盘的空间,这并不少见。如果你试图释放计算机上的空间,那么删除不想要的巨大文件效果最好。但首先你必须找到它们。
  • 编写一个程序,遍历一个目录树,查找特别大的文件或文件夹,比方说,超过100MB的文件(回忆一下 ,要获得文件的大小,可以使用os模块的os.path.getsize0).将这些文件的绝对路径打印到屏幕上。

分析

  • 输入源地址
  • 遍历源地址下的所有文件/文件夹
  • 核心过程
  • 单个文件大于XXXB时,将该文件打入文件列表;
  • 当文件夹大于XXXB时,将该文件打入文件夹列表;
  • 打印所有的文件

代码

import os, re
baseMap = input("请输入您的原始地址:") 
#当你使用命令框来运行py时,直接将文件路径拉到命令框时,可能格式为"C:\Program Files"
baseMapRegex = re.compile(r'\".*?\"')
if baseMapRegex.search(baseMap):
        baseMap = baseMap[1:-1]
#2MB的大小,自己可以写个正则re.compile(r'(\d+)(B|KB|MB|GB)', i)
size = 2*1024*1024
for folderName, subFolders, fileNames in os.walk(baseMap):
    print("正在检索%s..." % (folderName))
    os.chdir(folderName)
    #如果文件大于size则将文件写入文件列表
    moreBigFile = [os.path.abspath('.\\' + fn)  for fn in fileNames if os.path.getsize('.\\' + fn) > size]
    print(moreBigFile)
    #如果文件夹大于size则将文件写入文件夹列表
    moreFolder = sum([os.path.getsize('.\\' + fn)  for fn in fileNames])
    if sum([os.path.getsize('.\\' + fn)  for fn in fileNames]) > size:
        print(os.path.abspath('.\\')) 

测试

在这里插入图片描述

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

9.8.3消除缺失的编号

题目

  • 编写一个程序,在一个文件夹中,找到所有带指定前缀的文件,诸如spamo01.tspam002.txt等,并定位缺失的编号(例如存在spam001.txt和spam003.txt,但不存在spam002.txt)。让该程序对所有后面的文件改名,消除缺失的编号。
  • 作为附加的挑战,编写另一个程序, 在一些连续编号的文件中, 空出一些编号,以便加入新的文件。

分析

  • 输入原始地址
  • 输入后缀名
  • 设置正则表达式
  • 列表收纳符合正则的文件名
  • 使用左填充生成001、002…列表
  • 使用数字列表替换

代码

import os, re, shutil

baseMap = input("请输入您的原始地址:") 
extensionName = input("请输入您选择的后缀名:")
lenextensionName = len(extensionName)
os.chdir(baseMap)
#设置正则,我想不出怎么分割,所以添加了'-'来作为分割
fileRegex = re.compile(r'.*?-\d{3}(.'+ extensionName+')$')
fileExtension = sorted([i for i in os.listdir(baseMap) if fileRegex.search(i)])
print(fileExtension)
#制造数字编号
listNums = [(str(i+1).rjust(3, '0')) for i in range(len(fileExtension))]

for i in fileExtension:
    newFileExtension = i[:-(lenextensionName + 4)] + listNums[fileExtension.index(i)] \
        + i[-(lenextensionName + 1):]
    shutil.move('.\\'+ i +'', '.\\'+ newFileExtension +'')
print('Done...')
#可有可无,用于输出新的目标文件名
fileExtension = sorted([i for i in os.listdir(baseMap) if fileRegex.search(i)])
print(fileExtension)

测试

  • 还行吧
    在这里插入图片描述
    在这里插入图片描述
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

拓展

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值