批量copy_【生信小课堂】批量化移动特定文件至特定文件夹

2dc685da050c4709009b8dc15e274657.png

咕咕咕很久的一位靓仔的习惯性吐槽:前几天,某位老铁从深圳出差回来,然后跟我说能不能帮他写个脚本移动一下照片,然后我就欣然答应,因为这是我很久前想做的事情了,在我们日常的批量化处理序列文件任务里面,将文件批量化移动到某些文件夹去似乎是一项必须有现成脚本的事,这样可以省去很多麻烦,一键搞定。

先给大家看一下目录结构跟要完成的任务,首先我们有一堆文件夹,这个文件夹有很多层子目录,最终对应到某个物种的中文名跟拉丁文,也就是这样子的

109800239b2ca66cc6e9c7a0e8c56cfc.png

然后,我们有一堆照片,已经整理好的,并且注上了中文的种名,也就是这样的

80b0ba480d1f754bf5e748f0b0e69b04.png

我们的目标就是将所有的照片移到对应的种的文件夹里面。

明白了之后,我们就可以开始写代码了

#首先,我们这次的环境中有中文,所以第一步,先引入中文识别
#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

可以看到,此时返回的不仅仅是最后对应种的路径,还包括它的更上级路径,这个时候就需要经过一定筛选了,由于我这次是科属种这样分类下来的,那么我可以用“属”作为关键字对无关的内容进行过滤,如果你们遇到其他情况,也请根据具体情况,选择过滤的内容

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

嗯,对了,那这样我们就得到了最终我们要的那个目录了,接着我们来获取一下文件的路径,有了上面的那个内容,相信一下子就能写出来

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,操作更方便哦

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值