当前位置: 首页 > 科技观察

移动和重命名2000个文件,Python,3秒

时间:2023-03-22 14:01:57 科技观察

文章转载自微信公众号《Python早起》(zaoqi-python)。大家好,又到了Python办公自动化(偷懒)的话题了。今天介绍的案例是如何使用Python自动移动、修改、重命名文件/文件夹。这样的操作在日常办公中经常会用到。如果能掌握Python的实现,效率会大大提高!所以我希望我能通过这篇文章让大家知道:如何综合使用基于osglob和shutil的文件管理!一、需求描述为了让本文介绍的案例更加通用,我新建了一个文件夹files1,用来存放1800+个文件,如下图所示:需要完成的内容如下:将1835个文件移动到新建文件夹file2中,并重命名文件,在名称的开头加上序号和“finaldraft”字样,例如,将名称更改为“1-finaldraft-xxxxx(原文件名)”你可能在想你的心:这是人干的???但这确实是一个真正的需要。批量重命名文件很常见。如果没有技巧,只会花费大量的时间和人力来做。这里的技巧是Python。另外,还有一个问题:是先移动再重命名还是先重命名再移动?继续阅读!毕竟,谁愿意无缘无故地为自己的电脑生成一大堆无用的文件呢(也不要乱用别人的电脑)。不得不提的是,生成随机文件可以帮助我们更好地考验自己的Python文件管理能力。如果没有适合自己练习的文件夹和文件夹,何不自己写个代码生成呢?当然,过程中我们也会学到一些知识点,先看代码:importrandomimportstringforiinrange(2000):random_str=''.join(random.sample(string.ascii_letters+string.digits,random.randint(1,11)))file=open(r"C:\\xxx\\file1"+random_str+".txt",'w+')#前面路径为生成文件的目标文件夹file.write(''.join(random.sample(string.ascii_letters+string.digits,random.randint(1,11))))file.close()传递的String可以得到所有的字母和数字,使用random.sample()接受两个参数,一个是采样范围,一个是采样次数,默认是替换采样。这样可以在给定的字母数字范围内随机选择1-10,但是返回的结果是一个列表,需要使用.join方法完成字符串拼接。生成一个随机生成的名字的文件后,用类似的方式在里面写入一些随机的内容:上面的方法并不优雅,因为需要用file.close()释放,更好的方法是使用contextmanager直接用结构来减少出错的机会:importrandomimportstringforiinrange(2000):random_str=''.join(random.sample(string.ascii_letters+string.digits,random.randint(1,11)))withopen(r"C:\\xxx\\file1"+random_str+".txt",'w+')asfile:file.write(''.join(random.sample(string.ascii_letters+string.digits,random.randint(1,11))))因为即使名字是随机生成的,采样的范围和数量也不大,所以2000次采样会有一些名字是由完全相同的地块组成的,后面形成的文件会覆盖之前生成的文件,导致文件不超过2000个。2.重命名文件/文件夹需要使用os内置库的os.rename()方法:importosos.rename('practice.txt','practice_rename.txt')#重命名文件os.rename('folder1','folder2')#重命名文件夹虽然需求中有要求对文件进行重命名,但其实没有必要直接使用这个方法。3.移动文件/文件夹需要使用内置库shutil的shutil.move方法:importshutilshutil.move(r'.\practice.txt',r'.\folder1/')shutil.move(r'.\practice.txt',r'.\folder1/new.txt')注意到上面最后两行代码的区别了吗?第一行是将目标文件移动到目标文件夹,第二行是将目标文件移动到目标文件夹时,可以重命名。也就是说,我们不需要先用os.rename给文件命名,再用shutil.move移动到指定文件夹,而是一步一步用shutil.move就可以了。4、遍历获取文件采用基于glob库的迭代框架:importglobpath=xxxforfileinglob.glob(f'{path}/**/*.xlsx',recursive=True):pass以上代码可以获取里面的所有文件给定路径下文件夹下的Excel文件(.xlsx格式),递归参数默认为False,为True时允许逐步遍历,本例需要获取该文件夹下的所有.txt文件给定文件夹,就更简单了:importglobpath=xxxforfileinglob.glob(f'{path}/*.txt'):pass3.代码实现在上面的小节中,我们把需求拆分成了多个小块,理清了思路。现在我们可以开始写代码了。首先导入需要的库:importosimportshutilimportglobpath=r"C:\xxx"#??存放大量需要重命名和移动的文件的文件夹路径的上层路径上面说了,不用os.rename,那么为什么要导入os库呢?一方面是因为需要通过这个库生成新的文件夹。也可以手动完成,但是如果代码中的判断过多,不容易出错:ifnotos.path.exists(path+r'\file2'):os.mkdir(path+r'\file2')另一方面,下面将使用它来获取文件名,然后你可以一步移动和重命名它。glob迭代文件框遍历得到文件的绝对路径:count=1#generateserialnumberforfileinglob.glob(f'{path}\\test\\*.txt'):#这里是绝对路径filename=os.path.basename(file)shutil.move(file,path+r'\file2'+f'\{count}-finaldraft-{filename}')count+=1看到了吗,Python,3秒,大功告成,准备开饭!