数据处理:python实现从文件夹中复制文件(匹配选定内容的文件)

       对于深度学习,已经是耳熟能详了,做深度学习的都知道无非是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)))

由此,就可以将自己需要的文件从庞大的数据集中选取出来。

完整可运行的代码见:https://github.com/Messi-Q/SmartContract-Detection-Based-DeepLearning/blob/master/tools/find_call_value.py

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章