• 前言
  • 一、基础脚本
    • 1、获取某一文件夹下指定文件类型的文件名
    • 2、批量修改某一文件夹下的文件类型或命名
    • 3、批量复制文件到指定的文件夹下
  • 二、进阶脚本
    • 1、多个Voc数据集的融合
      • 文件重命名
      • 对xml文件的filename和path属性进行修改
      • 去除xml文件中的版本号<?xml version="1.0" ?>
    • 2、xml数据增强
    • 3、xml数据格式 转 coco数据格式

前言

  做深度学习等模型训练工作时经常需要批量处理一些数据文件,为了方便查阅,笔者将会在本篇博客持续更新汇总一些常用的数据文件批量处理脚本,文中大多脚本都参考了网络现有资源加以改进,给出了多种实现方法(包括标准库和第三方库的方法以及自己编写的更接近底层的、可以根据需求灵活改变的方法),文章中将会介绍脚本作用以及需要修改的地方并给出使用示例。


一、基础脚本


1、获取某一文件夹下指定文件类型的文件名

Input

  • file_dir:待获取文件名的文件夹路径
  • file_type(可选):指定文件类型(笔者这里只写了指定一种文件类型,如果需要提取多种的话可以多次调用,或者在文件类型判断中加入或判断即可)

Output

  • file_dir 文件夹下指定文件类型的文件名列表(不一定按照在文件夹下的查看顺序)
import os
def get_file_name(file_dir,file_type=''):#默认为文件夹下的所有文件lst = []for root, dirs, files in os.walk(file_dir):for file in files:if(file_type == ''):lst.append(file)else:if os.path.splitext(file)[1] == str(file_type):#获取指定类型的文件名lst.append(file)return lst


使用Python标准库

  • glob模块的glob方法
from glob import glob
# glob获得路径下所有文件路径
#‘*’表示任意,如果文件命是任意,那么就是所有文件
# 可根据需要修改,获得指定命名格式的文件
src_file_list = glob(file_dir + '*')

通过glob方法还可以实现提取规定命名形式的文件,进一步了解可以看python之glob模块以及根据路径获取文件名

  • os模块
import os
os.listdir(file_dir)


2、批量修改某一文件夹下的文件类型或命名

  只需要在第一个脚本的基础上,对获取到的文件进行重命名即可(文件名称包括文件显示名以及文件扩展类型名称,改变文件类型本质也是重命名),重命名需要用到Python re库中的replace方法以及os库中的rename方法。
  读者只需要根据需求修改Newdir的命名形式即可。

import os
import re
# 获取文件夹file_dir下指定类型file_type的所有文件名
def file_name(file_dir,file_type=''):#默认为文件夹下的所有文件lst = []for root, dirs, files in os.walk(file_dir):for file in files:if(file_type == ''):lst.append(file)else:if os.path.splitext(file)[1] == str(file_type):#获取指定类型的文件名lst.append(file)return lstfile_dir = "C:/Users/MECHREVO/Desktop/test/"
files = file_name(file_dir)# 对文件名进行批量重命名
for name in files:#遍历所有文件Olddir= file_dir + name# 根据自己的需要对文件名称进行修改,生成新的文件名称Newdir= file_dir + name.replace(".xml",".txt")os.rename(Olddir,Newdir)#重命名

使用示例
(修改文件类型)

处理前:

处理后:


3、批量复制文件到指定的文件夹下

更简便的方法:用Python复制文件的9个方法

function

  • 复制一个文件到目标路径下(结合脚本1使用,先获取需要复制的文件路径,多次调用实现批量复制)

Input

  • srcfile:待复制移动的文件路径
  • dstpath:目标路径
import shutil
import os
# 复制文件到指定的目录
# srcfile 需要复制、移动的文件
# dstpath 目的地址
def mycopyfile(srcfile,dstpath):                       # 复制函数if not os.path.isfile(srcfile):print ("%s not exist!"%(srcfile))else:fpath,fname=os.path.split(srcfile)             # 分离文件名和路径if not os.path.exists(dstpath):os.makedirs(dstpath)                       # 创建路径shutil.copy(srcfile, dstpath + fname)          # 复制文件print ("copy %s -> %s"%(srcfile, dstpath + fname))

使用示例


二、进阶脚本


1、多个Voc数据集的融合

  当你搜索了多个来源的Voc数据集时,可能会面临数据路径与名称无法对应的问题,需要对数据集进行融合,即对标注文件内容进行批量修改。

文件重命名

  • 首先对每一个数据集的文件名称进行批量修改,请看脚本2批量修改文件名称(名称修改为顺序数字)
  • 需要修改:文件路径以及文件扩展名称
  • 注意:这只是对一个数据集进行批量命名,对于多个数据集,需要对起始顺序进行手动修改。
import os
import re
# 获取文件夹file_dir下指定类型file_type的所有文件名
def get_file_name(file_dir,file_type=''):#默认为文件夹下的所有文件lst = []for root, dirs, files in os.walk(file_dir):for file in files:if(file_type == ''):lst.append(file)else:if os.path.splitext(file)[1] == str(file_type):#获取指定类型的文件名lst.append(file)return lstfile_dir = "C:/Users/MECHREVO/Desktop/test/"
files = get_file_name(file_dir)
  • 由于返回的文件名列表并没有按照顺序存储在列表中,但我们的图像标注文件和图像文件必须是一一对应的,这就要求我们恢复原始的文件名顺序,下一步我们需要对返回的列表中的文件名称进行排序处理。
  • 排序处理的思路很简单,将列表中的文件名称去除文件扩展名得到数字即可进行排序,通常我们使用labeling等图像标注软件生成的都是数字名称的数据集,如果读者需要实现自定义的比较,可以自定义富比较方法
# 获得文件数字并排序(可以看到上面是乱序)
import re
file_name_num = []
# 首先去掉文件扩展名
for each in files:# 这一步是去掉.xml,也可以用replace# 对于图片文件操作时,应改为对应的文件扩展名(如.jpg)each_name_num = re.compile(r'.xml').sub(r'', each)file_name_num.append(int(each_name_num))
# 对数字进行排序
file_name_num.sort()
  • 对文件进行重新命名
# 设置文件名的起始顺序
i = -1
# 对文件名进行批量重命名
for name in files:# 遍历所有文件i = i + 1Olddir= file_dir + name# 根据自己的需要对文件名称进行修改,生成新的文件名称# 处理什么类型文件就填什么扩展名Newdir= file_dir + str(i) + '.xml' # 对标注文件# Newdir= file_dir + str(i) + '.jpg'  # 对图片# 重命名os.rename(Olddir,Newdir)

对于每一个数据集的img和ann文件,我们都需要进行上述操作,并注意改变起始标号,比如:当处理第一个数据集时,我们设置起始标号为0,一直到完毕100,那么下一个数据集的标号就应该从101开始,继续往下标号。

最后将三个数据集的文件合并到一起(此时它们已经按顺序命名):


对xml文件的filename和path属性进行修改

  • 对于voc数据集,模型是通过xml文件中的属性来索引其对应的img的,xml文件中是需要指定img文件的路径的,因此我们需要对xml文件中的filename、path属性进行修改。
  • 需要修改:xml文件和img的存储位置
import os
import os.path
import xml.dom.minidom
path = "C:/Users/MECHREVO/Desktop/test/" #xml文件存储路径
#返回文件夹中的文件名列表
files=os.listdir(path)
#print(files)
  • 修改filename
# 修改filename 此处是用阿拉伯数字递增命名
count=0
for xmlFile in files:if not os.path.isdir(xmlFile):#os.path.isdir()用于判断对象是否为一个目录#如果不是目录,则直接打开name1=xmlFile.split('.')[0]#print(name1)dom=xml.dom.minidom.parse(path+'/'+xmlFile)#print(dom)root=dom.documentElement#newfolder=root.getElementsByTagName('folder')#print(newfolder)newpath = root.getElementsByTagName('path')newfilename = root.getElementsByTagName('filename')newfilename[0].firstChild.data = name1+'.jpg'with open(os.path.join(path, xmlFile), 'w') as fh:dom.writexml(fh)print('写入name/pose OK!')count = count + 1
  • 修改path
# 修改path
count=0
# 图像的根目录(也就是我们本地图像的存储位置)
img_dir = "C:\\Users\\MECHREVO\\data\\image\\"
for xmlFile in files:if not os.path.isdir(xmlFile):#os.path.isdir()用于判断对象是否为一个目录#如果不是目录,则直接打开name1=xmlFile.split('.')[0]#print(name1)dom=xml.dom.minidom.parse(path+'/'+xmlFile)#print(dom)root=dom.documentElement#newfolder=root.getElementsByTagName('folder')#print(newfolder)filename = root.getElementsByTagName('filename')newpath = root.getElementsByTagName('path')newpath[0].firstChild.data = img_dir + name1 +'.jpg'with open(os.path.join(path, xmlFile), 'w') as fh:dom.writexml(fh)print('写入name/pose OK!')count = count + 1

去除xml文件中的版本号<?xml version="1.0" ?>

  利用python的xml模块对xml文件进行操作时,经常会出现<?xml version="1.0" ?>,利用下列脚本去掉即可(不去应该也行)

# 去除版本号<?xml version="1.0" ?>
import osdef listFiles():fileDir = "C:/Users/MECHREVO/data/result/"fileList = []for root, dirs, files in os.walk(fileDir):for fileObj in files:fileList.append(os.path.join(root, fileObj))for fileObj in fileList:f = open(fileObj,'r+')all_the_lines = f.readlines()f.seek(0)f.truncate()for line in all_the_lines:f.write(line.replace('<?xml version="1.0" ?>', ''))#print(line)f.close()listFiles()

至此我们就可以将多个数据集融合为一个数据集,实现标注文件与图像文件一一对应。


2、xml数据增强

Dataset-Augment: https://github.com/mickkky/Dataset-Augment

需要修改:(在最底下的main函数里面)
IMG_DIR :原始数据集图片的文件夹路径
XML_DIR: 原始xml文件的文件夹路径
AUG_XML_DIR :数据增强后的图片的存储路径
AUG_IMG_DIR:数据增强后的xml文件的存储路径
AUGLOOP :每张图片增强多少次(我设的是10)

注意:使用前需要先确认原始的图片和xml文件夹内的文件是不是一一对应的,比如图片文件夹有一张abc.jpg,则xml文件夹一定有一个abc.xml文件。

import xml.etree.ElementTree as ET
import pickle
import os
from os import getcwd
import numpy as np
from PIL import Image
import shutil
import matplotlib.pyplot as pltimport imgaug as ia
from imgaug import augmenters as iaaia.seed(1)def read_xml_annotation(root, image_id):in_file = open(os.path.join(root, image_id))tree = ET.parse(in_file)root = tree.getroot()bndboxlist = []for object in root.findall('object'):  # 找到root节点下的所有country节点bndbox = object.find('bndbox')  # 子节点下节点rank的值xmin = int(bndbox.find('xmin').text)xmax = int(bndbox.find('xmax').text)ymin = int(bndbox.find('ymin').text)ymax = int(bndbox.find('ymax').text)# print(xmin,ymin,xmax,ymax)bndboxlist.append([xmin, ymin, xmax, ymax])# print(bndboxlist)bndbox = root.find('object').find('bndbox')return bndboxlist# (506.0000, 330.0000, 528.0000, 348.0000) -> (520.4747, 381.5080, 540.5596, 398.6603)
def change_xml_annotation(root, image_id, new_target):new_xmin = new_target[0]new_ymin = new_target[1]new_xmax = new_target[2]new_ymax = new_target[3]in_file = open(os.path.join(root, str(image_id) + '.xml'))  # 这里root分别由两个意思tree = ET.parse(in_file)xmlroot = tree.getroot()object = xmlroot.find('object')bndbox = object.find('bndbox')xmin = bndbox.find('xmin')xmin.text = str(new_xmin)ymin = bndbox.find('ymin')ymin.text = str(new_ymin)xmax = bndbox.find('xmax')xmax.text = str(new_xmax)ymax = bndbox.find('ymax')ymax.text = str(new_ymax)tree.write(os.path.join(root, str("%06d" % (str(id) + '.xml'))))def change_xml_list_annotation(root, image_id, new_target, saveroot, id,img_name):in_file = open(os.path.join(root, str(image_id) + '.xml'))  # 这里root分别由两个意思tree = ET.parse(in_file)elem = tree.find('filename')elem.text = (img_name + str("_%06d" % int(id)) + '.jpg')xmlroot = tree.getroot()index = 0for object in xmlroot.findall('object'):  # 找到root节点下的所有country节点bndbox = object.find('bndbox')  # 子节点下节点rank的值# xmin = int(bndbox.find('xmin').text)# xmax = int(bndbox.find('xmax').text)# ymin = int(bndbox.find('ymin').text)# ymax = int(bndbox.find('ymax').text)new_xmin = new_target[index][0]new_ymin = new_target[index][1]new_xmax = new_target[index][2]new_ymax = new_target[index][3]xmin = bndbox.find('xmin')xmin.text = str(new_xmin)ymin = bndbox.find('ymin')ymin.text = str(new_ymin)xmax = bndbox.find('xmax')xmax.text = str(new_xmax)ymax = bndbox.find('ymax')ymax.text = str(new_ymax)index = index + 1tree.write(os.path.join(saveroot, img_name + str("_%06d" % int(id)) + '.xml'))def mkdir(path):# 去除首位空格path = path.strip()# 去除尾部 \ 符号path = path.rstrip("\\")# 判断路径是否存在# 存在     True# 不存在   FalseisExists = os.path.exists(path)# 判断结果if not isExists:# 如果不存在则创建目录# 创建目录操作函数os.makedirs(path)print(path + ' 创建成功')return Trueelse:# 如果目录存在则不创建,并提示目录已存在print(path + ' 目录已存在')return Falseif __name__ == "__main__":IMG_DIR = "C:/Users/MECHREVO/data/image"XML_DIR = "C:/Users/MECHREVO/data/result"# =============================================================================
#     AUG_XML_DIR = "./Annotations"  # 存储增强后的XML文件夹路径
# =============================================================================AUG_XML_DIR = "C:/Users/MECHREVO/data/new_xml"  # 存储增强后的XML文件夹路径try:shutil.rmtree(AUG_XML_DIR)except FileNotFoundError as e:a = 1mkdir(AUG_XML_DIR)# =============================================================================
#     AUG_IMG_DIR = "./JPEGImages"  # 存储增强后的影像文件夹路径
# =============================================================================AUG_IMG_DIR = "C:/Users/MECHREVO/data/new_img"  # 存储增强后的影像文件夹路径try:shutil.rmtree(AUG_IMG_DIR)except FileNotFoundError as e:a = 1mkdir(AUG_IMG_DIR)AUGLOOP = 10  # 每张影像增强的数量boxes_img_aug_list = []new_bndbox = []new_bndbox_list = []# 影像增强seq = iaa.Sequential([iaa.Flipud(0.5),  # vertically flip 20% of all imagesiaa.Fliplr(0.5),  # 镜像iaa.Multiply((1.2, 1.5)),  # change brightness, doesn't affect BBsiaa.GaussianBlur(sigma=(0, 3.0)),  # iaa.GaussianBlur(0.5),iaa.Affine(translate_px={"x": 15, "y": 15},scale=(0.8, 0.95),rotate=(-30, 30))  # translate by 40/60px on x/y axis, and scale to 50-70%, affects BBs])for root, sub_folders, files in os.walk(XML_DIR):for name in files:print(name)bndbox = read_xml_annotation(XML_DIR, name)shutil.copy(os.path.join(XML_DIR, name), AUG_XML_DIR)shutil.copy(os.path.join(IMG_DIR, name[:-4] + '.jpg'), AUG_IMG_DIR)for epoch in range(AUGLOOP):seq_det = seq.to_deterministic()  # 保持坐标和图像同步改变,而不是随机# 读取图片img = Image.open(os.path.join(IMG_DIR, name[:-4] + '.jpg'))# sp = img.sizeimg = np.asarray(img)# bndbox 坐标增强for i in range(len(bndbox)):bbs = ia.BoundingBoxesOnImage([ia.BoundingBox(x1=bndbox[i][0], y1=bndbox[i][1], x2=bndbox[i][2], y2=bndbox[i][3]),], shape=img.shape)bbs_aug = seq_det.augment_bounding_boxes([bbs])[0]boxes_img_aug_list.append(bbs_aug)# new_bndbox_list:[[x1,y1,x2,y2],...[],[]]n_x1 = int(max(1, min(img.shape[1], bbs_aug.bounding_boxes[0].x1)))n_y1 = int(max(1, min(img.shape[0], bbs_aug.bounding_boxes[0].y1)))n_x2 = int(max(1, min(img.shape[1], bbs_aug.bounding_boxes[0].x2)))n_y2 = int(max(1, min(img.shape[0], bbs_aug.bounding_boxes[0].y2)))if n_x1 == 1 and n_x1 == n_x2:n_x2 += 1if n_y1 == 1 and n_y2 == n_y1:n_y2 += 1if n_x1 >= n_x2 or n_y1 >= n_y2:print('error', name)new_bndbox_list.append([n_x1, n_y1, n_x2, n_y2])# 存储变化后的图片image_aug = seq_det.augment_images([img])[0]path = os.path.join(AUG_IMG_DIR,name[:-4] + str( "_%06d" % (epoch + 1)) + '.jpg')image_auged = bbs.draw_on_image(image_aug, thickness=0)Image.fromarray(image_auged).save(path)# 存储变化后的XMLchange_xml_list_annotation(XML_DIR, name[:-4], new_bndbox_list, AUG_XML_DIR,epoch + 1,name[:-4])print( name[:-4] + str( "_%06d" % (epoch + 1)) + '.jpg')new_bndbox_list = []



3、xml数据格式 转 coco数据格式

数据格式的转换实际是annotation标注文件的转化

  • voc的数据标注文件为.xml文件,每张图片均有一个对应的同名.xml标注文件。


  • coco则是将所有的图片的标注信息写在一个json文件中

将xml文件转成json文件,训练集的所有xml文件会得到一个json文件,验证集同理。
需要修改:(在最下面)
xml_path :xml文件夹的路径(注意!是文件夹,不是文件,最后不需要反斜杠)
json_file :要导出的json文件的路径
category_name_set:指定类别名称(如果设置为空的话,那么将会按照xml中出现的顺序添加)

import xml.etree.ElementTree as ET
import os
import jsoncoco = dict()
coco['images'] = []
coco['type'] = 'instances'
coco['annotations'] = []
coco['categories'] = []category_set = dict()
image_set = set()category_item_id = 0
image_id = ''
id_num = 0
annotation_id = 0def addCatItem(name):global category_item_idcategory_item = dict()category_item['supercategory'] = 'none'category_item_id += 1category_item['id'] = category_item_idcategory_item['name'] = namecoco['categories'].append(category_item)category_set[name] = category_item_idreturn category_item_iddef addImgItem(file_name, size):global image_id,id_numif file_name is None:raise Exception('Could not find filename tag in xml file.')if size['width'] is None:raise Exception('Could not find width tag in xml file.')if size['height'] is None:raise Exception('Could not find height tag in xml file.')image_item = dict()temp = str(id_num)image_item['id'] = int(temp)id_num += 1image_item['file_name'] = file_nameimage_item['width'] = size['width']image_item['height'] = size['height']coco['images'].append(image_item)image_set.add(file_name)return image_item['id']def addAnnoItem(object_name, image_id, category_id, bbox):global annotation_idannotation_item = dict()annotation_item['segmentation'] = []seg = []#bbox[] is x,y,w,h#left_topseg.append(bbox[0])seg.append(bbox[1])#left_bottomseg.append(bbox[0])seg.append(bbox[1] + bbox[3])#right_bottomseg.append(bbox[0] + bbox[2])seg.append(bbox[1] + bbox[3])#right_topseg.append(bbox[0] + bbox[2])seg.append(bbox[1])annotation_item['segmentation'].append(seg)annotation_item['area'] = bbox[2] * bbox[3]annotation_item['iscrowd'] = 0annotation_item['ignore'] = 0annotation_item['image_id'] = image_idannotation_item['bbox'] = bboxannotation_item['category_id'] = category_idannotation_id += 1annotation_item['id'] = annotation_idcoco['annotations'].append(annotation_item)def parseXmlFiles(xml_path): for f in os.listdir(xml_path):if not f.endswith('.xml'):continuebndbox = dict()size = dict()current_image_id = Nonecurrent_category_id = Nonefile_name = Nonesize['width'] = Nonesize['height'] = Nonesize['depth'] = Nonexml_file = os.path.join(xml_path, f)print(xml_file)tree = ET.parse(xml_file)root = tree.getroot()if root.tag != 'annotation':raise Exception('pascal voc xml root element should be annotation, rather than {}'.format(root.tag))#elem is <folder>, <filename>, <size>, <object>for elem in root:current_parent = elem.tagcurrent_sub = Noneobject_name = Noneif elem.tag == 'folder':continueif elem.tag == 'filename':file_name = elem.textif file_name in category_set:raise Exception('file_name duplicated')#add img item only after parse <size> tagelif current_image_id is None and file_name is not None and size['width'] is not None:if file_name not in image_set:current_image_id = addImgItem(file_name, size)print('add image with {} and {}'.format(file_name, size))else:raise Exception('duplicated image: {}'.format(file_name)) #subelem is <width>, <height>, <depth>, <name>, <bndbox>for subelem in elem:bndbox ['xmin'] = Nonebndbox ['xmax'] = Nonebndbox ['ymin'] = Nonebndbox ['ymax'] = Nonecurrent_sub = subelem.tagif current_parent == 'object' and subelem.tag == 'name':object_name = subelem.textif object_name not in category_set:current_category_id = addCatItem(object_name)else:current_category_id = category_set[object_name]elif current_parent == 'size':if size[subelem.tag] is not None:raise Exception('xml structure broken at size tag.')size[subelem.tag] = int(subelem.text)#option is <xmin>, <ymin>, <xmax>, <ymax>, when subelem is <bndbox>for option in subelem:if current_sub == 'bndbox':if bndbox[option.tag] is not None:raise Exception('xml structure corrupted at bndbox tag.')bndbox[option.tag] = int(option.text)#only after parse the <object> tagif bndbox['xmin'] is not None:if object_name is None:raise Exception('xml structure broken at bndbox tag')if current_image_id is None:raise Exception('xml structure broken at bndbox tag')if current_category_id is None:raise Exception('xml structure broken at bndbox tag')bbox = []#xbbox.append(bndbox['xmin'])#ybbox.append(bndbox['ymin'])#wbbox.append(bndbox['xmax'] - bndbox['xmin'])#hbbox.append(bndbox['ymax'] - bndbox['ymin'])print('add annotation with {},{},{},{}'.format(object_name, current_image_id, current_category_id, bbox))addAnnoItem(object_name, current_image_id, current_category_id, bbox )if __name__ == '__main__':category_name_set = ('class1','class2','class3','class4','class5')for each in category_name_set:addCatItem(each)xml_path =  "G:/guangdian/new_data/train/ann"json_file = 'G:/guangdian/new_data/train/train.json'parseXmlFiles(xml_path)json.dump(coco, open(json_file, 'w'))

数据文件批量处理脚本汇总相关推荐

  1. python之数据文件批量清洗,入库

    python之数据文件批量清洗,入库 因为最近有一个数据接入清洗的项目,别的工具用起来有些觉得不太顺手,就学着写了一个数据清洗入库的通用模板,节省一些工作量.主要流程为:数据库连接---文件批量导入- ...

  2. 网上共享核磁数据文件批量复制和解压,并删除压缩文件

    本人在网上找到了共享核磁数据,但是是gz格式,并且路径比较乱,我写了一个脚本,将gz压缩文件复制到文件夹并解压,删除gz. clear;clc %%批量将文件夹下面某种类型文件复制到新文件夹%% ti ...

  3. Nmap中NSE数据文件分析

    Nmap中NSE数据文件分析 1.Nmap中数据文件所在的位置 2.暴力穷举时所使用的用户名和密码列表数据文件 3.Web应用审计数据文件 http-fingerprints.lua http-sql ...

  4. python数据批量写入iq数据库_通过Load table命令将数据文件加载到Sybase IQ数据库里面的Python脚本...

    CREATE TABLE poc_app.sys_ftp_cfg ( ftp_id              varchar(100) NOT NULL,          --话单文件名标记 ftp ...

  5. 数据处理小工具:Excel 批量数据文件拆分/整合器...

    需求分析: 现在有一大堆的Excel数据文件,需要根据每个Excel数据文件里面的Sheet批量将数据文件合并成为一个汇总后的Excel数据文件.或者是将一个汇总后的Excel数据文件按照Sheet拆 ...

  6. .mat文件批量转成图片——python脚本编写

    .mat文件批量转成图片--python脚本编写 mat文件简介 mat文件是Matlab的数据存储的标准格式.mat文件是标准的二进制文件,还可以ASCII码形式保存和加载,在MATLAB中打开显示 ...

  7. Matlab的各种数据读取、文件读写等操作汇总

    Matlab的各种数据读取.文件读写等操作汇总 MATLAB提供了多种方式从磁盘读入文件或将数据输入到工作空间,即读取数据,又叫导入数据:将工作空间的变量存储到磁盘文件中称为存写数据,又叫导出数据.至 ...

  8. expect脚本同步文件、 expect脚本指定host和要同步的文件 、 构建文件分发系统 、批量远程执行命令...

    为什么80%的码农都做不了架构师?>>>    20.31 expect脚本同步文件 使用expect脚本同步文件 说明:核心命令是rsync #! /usr/bin/expect ...

  9. php数据库缓存类,常见php数据文件缓存类汇总

    本文实例汇总了常见php数据文件缓存类.分享给大家供大家参考.具体分析如下: 数据文件缓存的做法我们常用的有php文件缓存与利用memcache来缓存数据,下面面我分别总结了memcache缓存数据与 ...

最新文章

  1. python uiautomation选择list内容_使用python UIAutomation从QQ2017(v8.9)群界面获取所有群成员详细资料,...
  2. 阿里centos7 yum源
  3. 【bzoj1086】 scoi2005—王室联邦
  4. 。。。,带着这三点疑问,让我们层层深入的对HTTPS原理进行剖析!
  5. [专栏精选]2018.3地形更新详解
  6. 使用Playwright对ASP.NET Core应用执行功能测试
  7. tensorflow contrib模块_OpenCV DNN 模块-风格迁移
  8. 【渝粤教育】国家开放大学2018年春季 7406-21T金融统计分析 参考试题
  9. 咱们开始吧!第一次作业
  10. android虚拟机模糊,Android studio虚拟机在启动界面和桌面出现画面模糊花屏问题的解决方法...
  11. 技术系统进化法则包括_八大技术系统进化法则主要包括哪些
  12. mapreduce面试问题_MapReduce问题与解答第2部分
  13. 开源自助建站系统源码完整源码+搭建教程 傻瓜式一键建站系统源码
  14. [转]机器学习资料(非常好理解)
  15. 计算机英语wheel是什么意思,wheel是什么意思
  16. 代数结构:群、环、域、模、线性空间、格
  17. XILINX FPGA 7K325T 烧录MCS文件后无法自启动的问题
  18. 怎样通过百度文库引流?使得你的网络业绩倍增
  19. 屏幕分辨率、屏幕尺寸、屏幕像素、屏幕密度完全解析
  20. java项目中没有jdk包_彻底搞懂Java开发工具包(JDK)安装及环境变量配置

热门文章

  1. html+css+导航栏(垂直+水平+下拉式)
  2. 软件设计模式--第三章 结构型模式--享元模式
  3. python标注cad桩位_python操作cad
  4. 北京丛林之都市生存实录
  5. 20160301.CCPP体系详解(0040天)
  6. 笔记-新版医用电气设备电磁兼容标准 YY9706.102 解读(2021-03-04 网络培训)
  7. 卡马克《德军总部 3D》iPhone 版开发笔记
  8. HTML代码实例:详细讲解超级链接--网页制作
  9. 作为程序员,你是如何在工作以后找到女朋友的?
  10. 揭穿数据分析的六大谎言