对于深度学习,已经是耳熟能详了,做深度学习的都知道无非是train, train, train...,所谓训练就需要数据集,对数据的处理是工作量大且耗时耗神的一件事。在做实验的过程中,遇到这样的需求:
1) 提取含有某个“关键字”的文件
2)数据集的分布如下
这里有40个文件夹,每个文件夹中有1000个文件。
对于这样的数据集,我们可能只需要每个文件夹中的几个文件;并且需要找出对自己有用的文件。如果一个一个的来看,那工作量和时间太浪费了,很不值。所以接下来,我将阐述如何解决这样的问题的方法。
(1)读取文件,匹配文件内容
def readFile(filepath):
"""通过正则匹配文本中内容,并返回文本."""
regcontent = r'call.value' # 列出内容含有'call.value'的文件
contentre = re.compile(regcontent)
fp = open(filepath)
lines = fp.readlines() # 逐行读取文件内容
flines = len(lines)
# 逐行匹配数据.
for i in range(flines):
iscontent = re.findall(contentre, lines[i])
if iscontent:
fp.close()
return filepath
(2)过滤空文件
def getValidData(filelist=[]):
"""过滤集合中空的元素."""
valifile = []
for fp in filelist:
if fp != None:
valifile.append(fp)
return valifile
(3)复制文件(shutil.copy)
def copyFile(src_file):
dst = "/media/jion1/data/train_data" # 指定文件夹
shutil.copy(src_file, dst) # shutil.copy 复制文件到指定文件夹下
(4)获取指定文件并复制
def getDirList(filepath):
"""获取目录下所有的文件."""
regtxt = r'.+?\.txt' # 扫描对象为txt文件.
txtlist = [] # 文件集合.
txtre = re.compile(regtxt)
needfile = [] # 存放结果.
for parent, listdir, listfile in os.walk(filepath):
for files in listfile:
# 获取所有文件.
istxt = re.findall(txtre, files)
filecontext = os.path.join(parent, files)
# 获取非空的文件.
if istxt:
txtlist.append(filecontext)
# 将所有的数据存放到needfile中.
needfile.append(readFile(filecontext))
if needfile == []:
raise FileException("no file can be find!")
else:
validatedata = getValidData(needfile)
print(validatedata) # 打印获取的文件名
# 循环复制数组中的文件
for i in range(len(validatedata)):
copyFile(validatedata[i])
print('total file %s , validate file %s.' % (len(txtlist), len(validatedata)))
由此,就可以将自己需要的文件从庞大的数据集中选取出来。