|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
os模块" X6 F* y/ t! t3 b
深度学习中的数据多是文件,所以数据处理阶段和文件相关的操作就非常重要。除了文件IO,Python中一些操作系统的相关功能也能够非常方便地帮助数据处理。想象一下我们有一个文件夹叫做data,下边有3个子文件夹叫做cat,dog和bat,里面分别是猫,狗和蝙蝠的照片。为了训练一个三分类模型,我们先要生成一个文件,里面每一行是文件的路径和对应的标签。定义cat是0,dog是1,bat是2,则可以通过如下脚本:6 k# X) d! f8 W2 V* \9 P/ O# V
" _ B) {' |$ v: m6 o5 I* {import os
# R# f$ j2 B8 O' q1 n
h9 R6 j* c4 U2 z( p, o4 u# 定义文件夹名称和标签的对应关系
% ]$ i3 V# A8 i% O% E# E: Slabel_map = {8 B1 p* T. P9 \& N; U( M/ J
'cat': 0,
' A" ?) l( X7 U'dog': 1,: X# q! g0 {5 j8 m
'bat': 2
3 c- q5 x5 e/ `$ M* I}$ M0 e+ N- `! a; Y- m# w1 c
* U* T" ^9 h8 v% G9 c2 dwith open('data.txt', 'w') as f:
) r m& n0 Z; D. m- V. l& u
; b9 L8 A J: m7 r# 遍历所有文件,root为当前文件夹,dirs是所有子文件夹名,files是所有文件名
/ U7 N: G; v" b4 d2 jfor root, dirs, files in os.walk('data'):" g( c! P" T( P4 l2 w* s2 o
for filename in files:
$ f- d) _, [1 F7 `5 `& Yfilepath = os.sep.join([root, filename]) # 获得文件完整路径2 `/ G* ^0 o# F, R/ U/ N3 y) e
dirname = root.split(os.sep)[-1] # 获取当前文件夹名称
8 ?* j% g+ P X7 C8 s5 D Ylabel = label_map[dirname] # 得到标签
) m$ Y7 P- O$ Cline = '{},{}\n'.format(filepath, label)$ S. y! ~- Y5 L: m9 M) X5 k
f.write(line)
5 a# l8 \. {+ Y3 b1 b& X% E$ k* B" \. D. F3 ]3 N- a
其中,os.sep是当前操作系统的路径分隔符,在Unix/Linux中是’/’,Windows中是’\\’。有的时候我们已经有了所有的文件在一个文件夹data下,希望获取所有文件的名称,则可以用os.listdir():! n q" G& G- `6 H" G
filenames = os.listdir('data') B5 E4 k1 L& i( }
- H/ s9 j- B8 _
os也提供了诸如拷贝,移动和修改文件名等操作。同时因为大部分深度学习框架最常见的都是在Unix/Linux下使用,并且Unix/Linux的shell已经非常强大(比Windows好用太多),所以只需要用字符串格式化等方式生成shell命令的字符串,然后通过os.system()就能方便实现很多功能,有时比os,还有Python中另一个操作系统相关模块shutil还要方便:
' O3 f- W2 _ ~0 U/ x9 f) `import os, shutil/ k. G Z- }( ?* B. t* ^
6 x5 U) n% F, bfilepath0 = 'data/bat/IMG_000001.jpg'
5 [, D/ }" G2 l6 y H& p; e5 Ofilepath1 = 'data/bat/IMG_000000.jpg'( T$ B; q2 d- f+ i, `
: l3 p- r$ e6 O* A$ J- Y: ^
# 修改文件名) ~, U5 P9 g' `: r }1 ~
os.system('mv {} {}'.format(filepath0, filepath1)). D% w# I0 d: y ?; x6 v! N
#os.rename(filepath0, filepath1)+ n# ~+ G# G+ y( @% w" y7 T) D# v' X
5 ], E- \; `, w4 G- \1 m# 创建文件夹1 j5 Q n$ L+ x! F7 F
dirname = 'data_samples'* M5 N! j+ \/ U
os.system('mkdir -p {}'.format(dirname))3 R! i& A( E4 B7 ]
#if not os.path.exists(dirname):+ @+ d- C4 l! q8 @9 P6 }* y
# os.mkdir(dirname)6 q( }% M& U/ S3 ^) ]% A5 I! d
8 _# u$ q/ S' M$ B
# 拷贝文件 ]; d+ W: i) R$ \% L0 x" z
os.system('cp {} {}'.format(filepath1, dirname))
& F+ X! P" B$ s( q6 P#shutil.copy(filepath1, dirname) | 1 z; O- ^( S1 ^" Y: ^5 [
|
|