在Linux环境下使用Python复制目录下某类型文件(不带目录结构)到另一个目录

今天下载了一份数据集,想放在faster-rcnn上跑一下。但数据集的目录结构是这种形式的

dataset/
├── class1
│   ├── img
│   │   └── img1_1.jpg
│   └── xml
│       └── img1_1.xml
├── class2
│   ├── img
│   │   └── img2_1.jpg
│   └── xml
│       └── img2_1.xml
└── class3
    ├── img
    │   └── img3_1.jpg
    └── xml
        └── img3_1.xml

为了方便faster-rcnn的输入,我需要把数据集整理成这种目录结构

dataset_after_settle/
├── img
│   ├── img1_1.jpg
│   ├── img2_1.jpg
│   └── img3_1.jpg
└── xml
    ├── img1_1.xml
    ├── img2_1.xml
    └── img3_1.xml

为了实现这个功能,写了一个python脚本来处理,代码如下

############################################################
# author     : swings 
# 
# date       : 2018-08-14
#
# Parameters : argv[1] 源目录
#              argv[2] 用于匹配文件名的模式串,比如'.txt'
#              argv[3] 目标目录
#
# description: 这个脚本的作用是从argv[1]中寻找文件名能匹配
#              argv[2]的所有文件,并不带目录结构地把它们复
#              制到argv[3]
############################################################
import os, sys
import shutil

count = 0

def search(curpath, s, despath):
    global count
    L = os.listdir(curpath)  
    for subpath in L:  
        # subpath路径是目录,递归查找文件
        if os.path.isdir(os.path.join(curpath, subpath)):  
            newpath = os.path.join(curpath, subpath)
            search(newpath, s, despath)
        # subpath是文件
        elif os.path.isfile(os.path.join(curpath, subpath)):  
            if s in subpath:
                shutil.copyfile(os.path.join(curpath, subpath), os.path.join(despath, subpath))
                count += 1

def main():
    workingpath = sys.argv[1]
    s = sys.argv[2]
    despath = sys.argv[3]

    search(workingpath, s, despath)
    print('copy %d files' % count)

if __name__ == '__main__':
    main()

使用方法如下

$ python3 file_copy.py data_set/ .xml dataset_after_settle/xml/
$ python3 file_copy.py data_set/ .jpg dataset_after_settle/jpg/
  • 上面的命令可以满足本文开头提出的需求

你可能感兴趣的:(Python)