|
os模块
深度学习中的数据多是文件,所以数据处理阶段和文件相关的操作就非常重要。除了文件IO,Python中一些操作系统的相关功能也能够非常方便地帮助数据处理。想象一下我们有一个文件夹叫做data,下边有3个子文件夹叫做cat,dog和bat,里面分别是猫,狗和蝙蝠的照片。为了训练一个三分类模型,我们先要生成一个文件,里面每一行是文件的路径和对应的标签。定义cat是0,dog是1,bat是2,则可以通过如下脚本:
import os
# 定义文件夹名称和标签的对应关系
label_map = {
'cat': 0,
'dog': 1,
'bat': 2
}
with open('data.txt', 'w') as f:
# 遍历所有文件,root为当前文件夹,dirs是所有子文件夹名,files是所有文件名
for root, dirs, files in os.walk('data'):
for filename in files:
filepath = os.sep.join([root, filename]) # 获得文件完整路径
dirname = root.split(os.sep)[-1] # 获取当前文件夹名称
label = label_map[dirname] # 得到标签
line = '{},{}\n'.format(filepath, label)
f.write(line)
其中,os.sep是当前操作系统的路径分隔符,在Unix/Linux中是’/’,Windows中是’\\’。有的时候我们已经有了所有的文件在一个文件夹data下,希望获取所有文件的名称,则可以用os.listdir():
filenames = os.listdir('data')
os也提供了诸如拷贝,移动和修改文件名等操作。同时因为大部分深度学习框架最常见的都是在Unix/Linux下使用,并且Unix/Linux的shell已经非常强大(比Windows好用太多),所以只需要用字符串格式化等方式生成shell命令的字符串,然后通过os.system()就能方便实现很多功能,有时比os,还有Python中另一个操作系统相关模块shutil还要方便:
import os, shutil
filepath0 = 'data/bat/IMG_000001.jpg'
filepath1 = 'data/bat/IMG_000000.jpg'
# 修改文件名
os.system('mv {} {}'.format(filepath0, filepath1))
#os.rename(filepath0, filepath1)
# 创建文件夹
dirname = 'data_samples'
os.system('mkdir -p {}'.format(dirname))
#if not os.path.exists(dirname):
# os.mkdir(dirname)
# 拷贝文件
os.system('cp {} {}'.format(filepath1, dirname))
#shutil.copy(filepath1, dirname) |
|