![2dc685da050c4709009b8dc15e274657.png](https://i-blog.csdnimg.cn/blog_migrate/384d930986ca53d179aaa7ca8e5b07cf.png)
咕咕咕很久的一位靓仔的习惯性吐槽:前几天,某位老铁从深圳出差回来,然后跟我说能不能帮他写个脚本移动一下照片,然后我就欣然答应,因为这是我很久前想做的事情了,在我们日常的批量化处理序列文件任务里面,将文件批量化移动到某些文件夹去似乎是一项必须有现成脚本的事,这样可以省去很多麻烦,一键搞定。
先给大家看一下目录结构跟要完成的任务,首先我们有一堆文件夹,这个文件夹有很多层子目录,最终对应到某个物种的中文名跟拉丁文,也就是这样子的
![109800239b2ca66cc6e9c7a0e8c56cfc.png](https://i-blog.csdnimg.cn/blog_migrate/5bf5f1433d3fb310a4390691b2df9af9.png)
然后,我们有一堆照片,已经整理好的,并且注上了中文的种名,也就是这样的
![80b0ba480d1f754bf5e748f0b0e69b04.png](https://i-blog.csdnimg.cn/blog_migrate/77e81ca3fa646b2f49953a96b333499b.jpeg)
我们的目标就是将所有的照片移到对应的种的文件夹里面。
明白了之后,我们就可以开始写代码了
#首先,我们这次的环境中有中文,所以第一步,先引入中文识别
#coding=utf-8
#接着,我们要先得到目录的整个结构,这个时候我们需要引入os的包,来获取路径信息
import os
raw_dic = []
def get_file_path(file_dir):
for root, dirs, files in os.walk(file_dir):
raw_dic.append(root)
return raw_dic
get_file_path("#此处输入文件夹的绝对路径")
print(raw_dic)
![b62e4a5c323d92dcfcd17bef60544a71.png](https://i-blog.csdnimg.cn/blog_migrate/f979a2e66a350f0ac1fb439c1bd9e1f1.png)
可以看到,此时返回的不仅仅是最后对应种的路径,还包括它的更上级路径,这个时候就需要经过一定筛选了,由于我这次是科属种这样分类下来的,那么我可以用“属”作为关键字对无关的内容进行过滤,如果你们遇到其他情况,也请根据具体情况,选择过滤的内容
final_dic = []
for i in raw_dic:
if "属" in i.split("")[-2]:
final_dic.append(i)
for i in final_dic:#检查一下输出来的是什么东西
print(i)
![5f686728300194ab544671fa8c9078d8.png](https://i-blog.csdnimg.cn/blog_migrate/f54485d1fc4f791e242f0094432acf2d.png)
嗯,对了,那这样我们就得到了最终我们要的那个目录了,接着我们来获取一下文件的路径,有了上面的那个内容,相信一下子就能写出来
file_name = []
def file_path(file_dir):
for root, dirs, files in os.walk(file_dir):
for i in files:
strings = str(root) + "" + str(i)
file_name.append(strings)
return file_name
file_name("#输入物种照片存放的路径")
OK,那么这样我们就已经获得了两个内容了,接着我们就需要将照片放入指定的文件夹
import shutil ###如果不明白这个包是干嘛的,还请自行百度
import re
for line_one in final_dic:
species_name = line_one.split("")[-1]
for line_two in file_name:
species_picture = line_two.split("")[-1]
cop = re.compile("[u4e00-u9fa5]")###此处就是将照片名字里面非中文的内容全部去掉,只保留中文
species = cop.sub("",species_picture)
if species in species_name:
shutil.copy(line_two,line_one)###如果不想保留原位置照片,可以用move
这样我们的整个雏形就完成了,那么接下来让我们开始让它可以在命令行里面快速输入,而不用每次都打开jupyter来修改路径内容
#coding=utf-8
import sys ###使用这个包的argv传入命令行的参数,这样我们就可以直接在命令行内输入两个路径来得到最终的结果了
import os
import shutil
import re
file_dic = []
raw_dic = []
def get_file_dic(file_dir):
for root,dirs, files in os.walk(file_dir):
raw_dic.append(root)
return raw_dic
get_file_dic(sys.argv[1])
for i in raw_dic:
if "属" in i.split("")[-2]:
file_dic.append(i)
picture_path = []
def get_picture_path(file_dir):
for root, dirs, files in os.walk(file_dir):
for i in files:
strings = str(root) + "" + str(i)
picture_path.append(strings)
return picture_path
get_picture_path(sys.argv[2])
for file_path in file_dic:
species_name = file_path.split("")[-1]
for species_path in picture_path:
species_picture = species_path.split("")[-1]
only_chinese = re.compile("[u4e00-u9fa5]")
species = only_chinese.sub("", species_picture)
if species in species_name:
shutil.copy(species_path, file_path)
什么? ,你觉得这样不够友好,需要再优雅一些,最好是提示输入两个参数再执行,ok,那我们再改一下
#coding=utf-8
import os
import shutil
import re
print("请输入文件夹目录的路径")
x = input()
print("请输入文件所在路径")
y = input()
file_dic = []
raw_dic = []
def get_file_dic(file_dir):
for root,dirs, files in os.walk(file_dir):
raw_dic.append(root)
return raw_dic
get_file_dic(x)
for i in raw_dic:
if "属" in i.split("")[-2]:
file_dic.append(i)
picture_path = []
def get_picture_path(file_dir):
for root, dirs, files in os.walk(file_dir):
for i in files:
strings = str(root) + "" + str(i)
picture_path.append(strings)
return picture_path
get_picture_path(y)
for file_path in file_dic:
species_name = file_path.split("")[-1]
for species_path in picture_path:
species_picture = species_path.split("")[-1]
only_chinese = re.compile("[u4e00-u9fa5]")
species = only_chinese.sub("", species_picture)
if species in species_name:
shutil.copy(species_path, file_path)
print("任务已完成,请检查是否成功")
OK,这样我们就完成了整个脚本的书写与测试,如果有什么疑问欢迎在下方留言或者发送到825526231@qq.com,懂的问题我一定会倾力答复,我们下次再见!
练习链接:链接: https://pan.baidu.com/s/1kSyJVFrjqVSrG4qcrBrAtg 提取码: 7y5k 复制这段内容后打开百度网盘手机App,操作更方便哦