Python 文件操作函数

时间:2022-05-27 09:55:40

这个博客是 Building powerful image classification models using very little data 的前期准备,用于把图片数据按照教程指示放到规定的文件夹中。

python 文件处理主要用到 os 模块和 shutil 模块,'sh' 大概是 bash 的意思

os.chdir('path') 改变当前路径到 path

os.listdir('path') 输出 path 路径下所有的文件名

os.makedirs('path/dirname') 在 path 路径下创建 dirname 文件夹

shutil.copy2('path/filename', 'newpath') 将 path 路径下的 filename 文件拷贝到 newpath 路径下

 

场景:按照上面的教程,我们需要先下载 kaggle 猫狗识别大赛的源文件,分为 train 和 test1,解压后放到 cat_dog 文件夹,然后,我们将构建符合教程要求的文件目录,其结构如下图所示(注意文件名的变化):

data/
    train/
        dogs/
            dog001.jpg
            dog002.jpg
            ...
        cats/
            cat001.jpg
            cat002.jpg
            ...
    validation/
        dogs/
            dog001.jpg
            dog002.jpg
            ...
        cats/
            cat001.jpg
            cat002.jpg
            ...

依据教程要求,需要从 train 文件夹中将 cat.000.jpg 到 cat.999.jpg 拷贝到 data/cats/cat000.jpg 到 data/cats/cat999.jpg,将 cat.1000.jpg 到 cat.1399.jpg 拷贝到 validation/cats/cat000.jpg 到 validation/cats/cat399.jpg。同样的结构用于狗数据集的构建。

代码:

import shutil
import os

os.chdir('cat_dog')
os.makedirs('train')
os.makedirs('train/dogs')
os.makedirs('train/cats')
os.makedirs('validation')
os.makedirs('validation/dogs')
os.makedirs('validation/cats')

def getFileName(num, category):
    return category+'.'+str(num)+'.jpg'

def setFileName(num, category):
    num = str(num)
    num = (3-len(num))*'0'+num
    return category+num+'.jpg'

for num in range(1000):
    cat = getFileName(num, 'cat')
    dog = getFileName(num, 'dog')
    new_cat = setFileName(num, 'cat')
    new_dog = setFileName(num, 'dog')
    shutil.copy2('train1/'+cat, 'train/cats/'+new_cat)
    shutil.copy2('train1/'+dog, 'train/dogs/'+new_dog)

for num in range(400):
    cat = getFileName(1000+num, 'cat')
    dog = getFileName(1000+num, 'dog')
    new_cat = setFileName(num, 'cat')
    new_dog = setFileName(num, 'dog')
    shutil.copy2('train1/'+cat, 'validation/cats/'+new_cat)
    shutil.copy2('train1/'+dog, 'validation/dogs/'+new_dog)

 ps:为了使得构建的 train 与之前下载的 train 文件夹不重名,将之前的 train 文件夹改为 train1.

pps: 没注意看原教程要求,这里构建的 train 文件夹和 validation 文件夹应该放到 data 目录下,直接手动操作就好了。