|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
os模块
) V% i: ^$ L# z8 K( T; ^. M深度学习中的数据多是文件,所以数据处理阶段和文件相关的操作就非常重要。除了文件IO,Python中一些操作系统的相关功能也能够非常方便地帮助数据处理。想象一下我们有一个文件夹叫做data,下边有3个子文件夹叫做cat,dog和bat,里面分别是猫,狗和蝙蝠的照片。为了训练一个三分类模型,我们先要生成一个文件,里面每一行是文件的路径和对应的标签。定义cat是0,dog是1,bat是2,则可以通过如下脚本:
1 Z$ z% n0 {; |' u% C0 e
" T# n0 i& \2 g; [8 s, Timport os
- x8 Q0 ~' L- @5 ^: X
# w/ B/ L% W0 f4 e# 定义文件夹名称和标签的对应关系9 k- m5 H" @- F6 W# |. y ?
label_map = {2 i. R( M& ? i: N& W
'cat': 0," T8 L: q' x! E6 [$ |
'dog': 1,
) V$ D! @2 P" T# v( S, v'bat': 2
, y! P( [- p7 E# ]}: w% X& F6 u$ y& e
6 A* j# n+ W2 k# R) j0 o5 h
with open('data.txt', 'w') as f:
1 g' L S1 T7 F3 i6 T1 k
% e' c1 r5 M) f/ M+ F& y# 遍历所有文件,root为当前文件夹,dirs是所有子文件夹名,files是所有文件名$ ?% K7 [; c+ q& d& e- Q
for root, dirs, files in os.walk('data'):
) E2 C9 C8 N1 j2 v8 Z, wfor filename in files:
9 l6 f# P4 l" wfilepath = os.sep.join([root, filename]) # 获得文件完整路径
" x3 v% G" k) p" d0 j+ ~dirname = root.split(os.sep)[-1] # 获取当前文件夹名称+ @+ \- Q9 `" j* b
label = label_map[dirname] # 得到标签
Z1 Q% h$ }1 y5 a$ Nline = '{},{}\n'.format(filepath, label)+ o' D3 M% L, O2 i4 H# l
f.write(line)
( ]; V2 c8 t _, d* e7 }# i
7 g; S6 Z! h$ W! b9 Q( Q* L其中,os.sep是当前操作系统的路径分隔符,在Unix/Linux中是’/’,Windows中是’\\’。有的时候我们已经有了所有的文件在一个文件夹data下,希望获取所有文件的名称,则可以用os.listdir():
. o# j' i3 i6 pfilenames = os.listdir('data')8 `/ K& v3 d9 n: u4 F2 P. V+ G5 @' q8 A
; Q% x8 ^: i4 C6 f0 O: w' m
os也提供了诸如拷贝,移动和修改文件名等操作。同时因为大部分深度学习框架最常见的都是在Unix/Linux下使用,并且Unix/Linux的shell已经非常强大(比Windows好用太多),所以只需要用字符串格式化等方式生成shell命令的字符串,然后通过os.system()就能方便实现很多功能,有时比os,还有Python中另一个操作系统相关模块shutil还要方便:
7 ?4 h' P- J8 y% T1 H) [8 |8 Q" Rimport os, shutil
+ m, |- z. p1 x1 l, c2 u$ J8 S+ t
filepath0 = 'data/bat/IMG_000001.jpg'7 ?' ~, B4 t* o! g x
filepath1 = 'data/bat/IMG_000000.jpg'4 g1 `4 F7 u- Y: Z, o0 y' G7 S
3 _- U3 o9 ]! ]) ~& K$ D# c" W
# 修改文件名3 @* X7 L f) t, B
os.system('mv {} {}'.format(filepath0, filepath1))
% P8 f. ~; X3 p7 i: I5 h# u9 ~: ?. ?# K#os.rename(filepath0, filepath1)0 p# K) i+ T0 V
4 U$ ^( X) s* ? [# 创建文件夹
, r2 @( d: U9 O* @0 _6 udirname = 'data_samples'$ f2 H% U* j3 k \
os.system('mkdir -p {}'.format(dirname))
z% D9 A$ ~! G: _' ~+ J, H#if not os.path.exists(dirname):
% P* D. v# c: ~1 b+ d* a# os.mkdir(dirname)
; a- F$ t$ y# D% q, f& t7 _
, w9 O3 L0 R1 c# B# 拷贝文件7 v! v1 v& ]! j% ` @! B `( G
os.system('cp {} {}'.format(filepath1, dirname))7 ^, Y' o+ j- w n& H
#shutil.copy(filepath1, dirname) |
# m$ i- V5 D/ h. w- D2 d1 k |
|