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原文件夹路径: ' )
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( )
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 ( "请输入您的原始地址:" )
baseMapRegex = re. compile ( r'\".*?\"' )
if baseMapRegex. search( baseMap) :
baseMap = baseMap[ 1 : - 1 ]
size = 2 * 1024 * 1024
for folderName, subFolders, fileNames in os. walk( baseMap) :
print ( "正在检索%s..." % ( folderName) )
os. chdir( folderName)
moreBigFile = [ os. path. abspath( '.\\' + fn) for fn in fileNames if os. path. getsize( '.\\' + fn) > size]
print ( moreBigFile)
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)
测试
还行吧
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
拓展