《Python编程快速上手—让繁琐工作自动化》第9章实践

9.8.3 消除缺失的编号

import os,re,shutil

flist = []
path = r'C:\Users\Yuno\Desktop\spam01'
os.chdir(path)
#找出所有符合条件的文件
for folderName, subfoldernames, filenames in os.walk(path):
    for file in filenames:
#用groups()会返回一个元组,将一个元组作为列表的一个元素
        if re.compile(r'^(spam)(0*)(\d*)(.)(.*)').search(file) != None:                     
            flist.append(re.compile(r'^(spam)(0*)(\d*)(.)(.*)').search(file).\
                     groups())
            print('Found:'+ file)
            
        else:                    
            continue
   #据元组返回的第3个元素(也就是一堆0后面的数)从小到大排序
flist.sort(key=lambda x:int(x[2]))
   
for i in (1,range(len(flist))):    
    if i+1 == int(flist[i][2]):
        continue
    else:
        shutil.move(''.join(flist[i]),''.join(flist[i]).replace(flist[i][2],\
                                                                str(i+1)))
        print(os.path.join(path,''.join(flist[i])) + '---->' + \
                                        os.path.join(path,\
                                    ''.join(flist[i]).replace(flist[i][2],\
                                                              str(i+1))))
print('DONE')

思路:
想直接利用文件中的数字来进行排序然后再for循环对应查找缺漏,但因为eval(001)会报错,所以就用正则表达式分了组,导致后面一串有点繁琐。

后来发现,列表如['spam001','spam002',]原来可以排序ORZ是根据一个以一个个元素去比较原来根本不用上面那么麻烦啊

然后综合参考了@Wuhouxxxx和patrick0827的有关专题文章写了另一个。简洁到不敢相信ORZ

#9.8.2
import shutil,os

path =  r'C:\Users\Yuno\Desktop\spam01'
flist = []
os.chdir(path)
#找符合条件的
for folderName,subfolders,filenames in os.walk(path):
    for filename in filenames:
        if filename.startswith('spam') and filename.endswith('.txt'):
            flist.append(filename)
#排序
flist.sort()
#更名
for i in range(1,len(flist)+1):
    shutil.move(flist[i-1],'spam%03d.txt'%(i))
    print(flist[i-1] + '------>' + 'spam%03d.txt'%(i))
print('DONE')

亮点:
1.参考了上面说的后者的从字符串查找收进列表,省了正则表达式。
2.最关键的发现是像本题的list类型可以直接排序ORZ查有关文件耶好像没有详细讲(有python2的)。所以个人摸索了一下应该是从ASCII码比较吧。有知道的同学望指教!
3.还有更加神的是@[Wuhouxxxx] 同学的直接省去对比而用move来将所有文件重命名!!这样子的话按顺序的文件也同样不受影响。而且看了该同学的代码才发现了 %03d 是用0填充成3位数ORZ之前的网课没有提到这种方法。在字符串格式化一章学的是用format的。不知道是不是因为python2也是用这种形式?望多多指教!

你可能感兴趣的:(《Python编程快速上手—让繁琐工作自动化》第9章实践)