文件解析的方法与原理

文件的解析使用python的struct模块,接下来会用到的2个方法:

        解包unpack()方法 : 使用该方法可以从写好的二进制文件中读出文件。它的函数原型为:struct.unpack(fmt,string),fmt参数是格式字符串。string表示要转换的python值。最终函数返回一个元组。

        calcsize()方法 : 该方法用于计算格式字符串所对应的结果长度,如:struct.calcsize("ii"),返回8。因为一个i代表一个int类型,占用的长度是4个字节。两个i就是两个int,长度为8个字节。

解析图片文件的核心代码示例如下:

def decode_idx3_ubyte(idx3_file):# 读取二进制数据with open(idx3_file, 'rb') as file:file_data =file.read()#定义偏移量,初始值为0offset = 0# 以大端法读取4个 unsinged int32file_header = '>iiii'  #解析文件头信息,依次为魔数、图片数量、每张图片高、每张图片宽magic_number, num_images, num_rows, num_cols = struct.unpack_from(file_header, file_data, offset)#读取完文件头信息后,偏移量向后移动16位offset += struct.calcsize(file_header)#以图片的像素大小读取图片file_image = '>' + str(num_rows * num_cols) + 'B'#生成和图片数量相同的数组,且每个数组的形状大小等于图片的像素大小images = np.empty((num_images, num_rows, num_cols))#循环读取每个图片的像素信息for i in range(num_images):image = struct.unpack_from(file_image, file_data, offset)#将读取的图片信息按照规定的形状形成数组images[i] = np.array(image).reshape((num_rows, num_cols))#每读取完一个图片,偏移量向后移动到下一个图片文件的起始位置offset += struct.calcsize(file_image)return images

        解析函数通过参数接收到测试集图片文件的路径后,以二进制格式rb打开文件,并读取文件数据。

        定义一个变量offset,代表偏移量,初始值为0。再定义格式符为4个i。然后解析并读取文件头信息,依次获得魔数、图片的数量,每张图片的高度和宽度。读取完后,使用struct.calcsize方法将偏移量向后移动16位。并定义接下来读取图片文件信息的格式符,即784个字节。

        开始读取前,生成和图片数量相同的数组,每个数组的形状大小等于图片的像素大小,以便接下来存储图片。然后循环读取每个图片,并将图片存入数组中。最终将数组返回。

解析图片文件的核心代码示例如下:

def decode_idx1_ubyte(idx1_file):#读取二进制数据with open(idx1_file, 'rb') as file:file_data = file.read()#定义偏移量,初始值为0offset = 0# 以大端法读取4个 unsinged int32file_header = '>ii'  #解析文件头信息,依次为魔数、标签数magic_number, label_num = struct.unpack_from(file_header, file_data, offset)#读取完文件头信息后,偏移量向后移动8位offset += struct.calcsize(file_header)#定义存储标签值的数组labels = []#每次读取一个 bytefile_label = '>B'#循环读取每个标签的信息    for i in range(label_num):#将读取的标签信息添加到数组中labels.append(struct.unpack_from(file_label, file_data, offset)[0])#每读取完一个标签,偏移量向后移动一个byteoffset += struct.calcsize(file_label)return labels

        解析标签文件的代码逻辑和解析图片文件的逻辑一致。只是需要注意,解析并读取的标签文件头信息,只有魔数和标签数。且在循环读取标签时,每次读取一个字节。

        解析成功后,会在指定的文件夹下生成相应的文件夹,其中存放了解析后的图片。

完整示例代码如下:

import struct
import numpy as np
import os
import cv2def decode_idx3_ubyte(idx3_file):# 读取二进制数据with open(idx3_file, 'rb') as file:file_data =file.read()#定义偏移量,初始值为0offset = 0# 以大端法读取4个 unsinged int32file_header = '>iiii'  #解析文件头信息,依次为魔数、图片数量、每张图片高、每张图片宽magic_number, num_images, num_rows, num_cols = struct.unpack_from(file_header, file_data, offset)#读取完文件头信息后,偏移量向后移动16位offset += struct.calcsize(file_header)#以图片的像素大小读取图片file_image = '>' + str(num_rows * num_cols) + 'B'#生成和图片数量相同的数组,且每个数组的形状大小等于图片的像素大小images = np.empty((num_images, num_rows, num_cols))#循环读取每个图片的像素信息for i in range(num_images):image = struct.unpack_from(file_image, file_data, offset)#将读取的图片信息按照规定的形状形成数组images[i] = np.array(image).reshape((num_rows, num_cols))#每读取完一个图片,偏移量向后移动到下一个图片文件的起始位置offset += struct.calcsize(file_image)return imagesdef decode_idx1_ubyte(idx1_file):#读取二进制数据with open(idx1_file, 'rb') as file:file_data = file.read()#定义偏移量,初始值为0offset = 0# 以大端法读取4个 unsinged int32file_header = '>ii'  #解析文件头信息,依次为魔数、标签数magic_number, label_num = struct.unpack_from(file_header, file_data, offset)#读取完文件头信息后,偏移量向后移动8位offset += struct.calcsize(file_header)#定义存储标签值的数组labels = []#每次读取一个 bytefile_label = '>B'#循环读取每个标签的信息    for i in range(label_num):#将读取的标签信息添加到数组中labels.append(struct.unpack_from(file_label, file_data, offset)[0])#每读取完一个标签,偏移量向后移动一个byteoffset += struct.calcsize(file_label)return labelsdef check_folder(folder):#检查文件文件夹是否存在,不存在则创建if not os.path.exists(folder):os.mkdir(folder)print(folder)else:if not os.path.isdir(folder):os.mkdir(folder)def export_img(exp_dir, img_ubyte, lable_ubyte):   check_folder(exp_dir)#生成数据集images = decode_idx3_ubyte(img_ubyte)labels = decode_idx1_ubyte(lable_ubyte)nums = len(labels)for i in range(nums):img_dir = os.path.join(exp_dir, str(labels[i]))check_folder(img_dir)img_file = os.path.join(img_dir, str(i)+'.png')imarry = images[i]cv2.imwrite(img_file, imarry)def parser_mnist(file_dir):#在指定的路径下,创建一个文件夹“train”,用于保存解析后的图片和标签train_dir = os.path.join(file_dir, 'train')#获得训练集图片文件的路径train_img_ubyte = os.path.join(file_dir, 'train-images.idx3-ubyte')#获得训练集标签文件的路径train_label_ubyte = os.path.join(file_dir, 'train-labels.idx1-ubyte')export_img(train_dir, train_img_ubyte, train_label_ubyte)#在指定的路径下,创建一个文件夹“test”,,用于保存解析后的图片和标签test_dir = os.path.join(file_dir, 'test')#获得测试集图片文件的路径test_img_ubyte = os.path.join(file_dir, 't10k-images.idx3-ubyte')#获得测试集标签文件的路径test_label_ubyte = os.path.join(file_dir, 't10k-labels.idx1-ubyte')export_img(test_dir, test_img_ubyte, test_label_ubyte)if __name__ == '__main__':file_dir = 'D:/MNIST_Download/unzip'parser_mnist(file_dir)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/99989.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

美容类产品找什么渠道做推广比较好,媒介盒子告诉你

哈喽,大家好,今天媒介盒子小编又来跟大家分享软文推广的干货知识了,本篇分享的主要内容是:美容类产品找什么渠道做推广比较好~ 随着如今生活条件的进步,越来越多人的女性开始注重对自身的保养。她们会在市场上搜罗大量的美容护肤类服务和产品,这也给了无…

MFC文本输出学习

void CTxttstView::OnDraw(CDC* pDC) {CTxttstDoc* pDoc GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCString str1;pDC->SetBkColor(RGB(0,0,0));pDC->TextOut(50, 50, "一段文字");pDC->SetBkColor(RGB(255,255,255))…

【MySQL】基本查询(三)聚合函数+group by

文章目录 一. 聚合函数二. group by子句结束语 建立如下表 //创建表结构 mysql> create table exam_result(-> id int unsigned primary key auto_increment,-> name varchar(20) not null comment 同学姓名,-> chinese float default 0.0 comment 语文成绩,->…

基于地理位置的IP地址定位技术

IP地址定位是指通过互联网上的IP地址,准确地定位出该IP地址对应的物理位置。IP地址是互联网上设备之间通信时使用的一个地址标识符,每个设备都有一个唯一的IP地址。 IP地址定位的原理是通过收集和分析网络设备的IP地址和相应的网络数据,以确定…

华为云云耀云服务器L实例评测|测试CentOS的网络配置和访问控制

目录 引言 1 理解几个基础概念 2 配置VPC、子网以及路由表 3 配置安全组策略和访问控制规则 3.1 安全组策略和访问控制简介 3.2 配置安全组策略 3.3 安全组的最佳实践 结论 引言 在云计算时代,网络配置和访问控制是确保您的CentOS虚拟机在云环境中安全运行的…

淘宝商品链接获取淘宝商品详情数据(用 Python实现淘宝商品信息抓取)

在网页抓取方面,可以使用 Python、Java 等编程语言编写程序,通过模拟 HTTP 请求,获取淘宝多网站上的商品页面。在数据提取方面,可以使用正则表达式、XPath 等方式从 HTML 代码中提取出有用的信息。值得注意的是,淘宝网…

Python中如何快速解析JSON对象数组

嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 由于浏览器可以迅速地解析JSON对象,它们有助于在客户端和服务器之间传输数据。 本文将描述如何使用Python的JSON模块来传输和接收JSON数据。 JavaSc…

【JavaEE】多线程(五)- 基础知识完结篇

多线程(五) 文章目录 多线程(五)volatile关键字保证内存可见性JMM(Java Memory Model) 不保证原子性 wait 和 notifywait()notify()线程饿死 上文我们主要讲了 synchronized以及线程安全的一些话题 可重入…

故障注入常用方法有哪些 其重要性是什么

故障注入是一种有效的测试方法,可用于评估系统对异常情况的响应。通过这种测试方法,可以发现系统中的潜在问题,并采取适当措施来改进系统的质量和性能。本文将介绍故障注入常用方法及重要性! 一、故障注入常用方法 1、随机故障注入&#xff1…

《向量数据库指南》——向量数据库 有必要走向专业化吗?

向量数据库 有必要走向专业化吗? 向量数据库系统的诞生,来源于具体业务需求——想要高效处理海量的向量数据,就需要更细分、更专业的数据基础设施,为向量构建专门的数据库处理系统。 但这种路径是必须的吗? 从产品层面讲,如果传统数据库厂商不单独研发向量数据库,那么…

Postgresql中的C/C++混编(JIT)

1 Postgresql编译JIT 整体上看使用了GCC、G编译文件,最后用G汇总: GCC编译的三个.o文件llvmjit、llvmjit_deform、llvmjit_expr llvmjit.c -> llvmjit.o gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -…

Unity布料系统Cloth

Unity布料系统Cloth 介绍布料系统Cloth(Unity组件)组件上的一些属性布料系统的使用布料约束Select面板Paint面板Gradient Tool面板 布料碰撞布料碰撞碰撞适用 介绍 布料系统我第一次用是做人物的裙摆自然飘动,当时我用的是UnityChan这个unity官方自带的插件做的裙摆…

javaee ssm框架项目整合thymeleaf2.0 更多thymeleaf标签用法 项目结构图

创建ssmthymeleaf项目 创建ssmthymeleaf项目参考此文 thymeleaf更多常用标签 <!DOCTYPE html> <html lang"en" xmlns:th"http://www.thymeleaf.org"> <head><meta charset"UTF-8"><title>Title</title> …

【ccf-csp题解】第7次csp认证-第二题-俄罗斯方块-简单碰撞检测算法

题目描述 思路讲解 本题的主要思路是实现一个draw函数&#xff0c;这个函数可以绘制每一个状态的画布。然后从第一个状态往后遍历&#xff0c;当绘制到某一个状态发生碰撞时&#xff0c;答案就是上一个状态的画布。 此处的状态x实际就是在原来的15*10画布上的第x行开始画我们…

你必须知道的数据查询途径!!

在当今信息爆炸的时代&#xff0c;我们每天都会面临海量的数据和信息。如何在这些繁杂的信息中快速、准确地找到自己需要的内容&#xff0c;也是当代一个非常重要的技能。下面&#xff0c;我将介绍几种你必须知道的企业数据信息查找途径。 ​ 1. 搜索引擎 搜索引擎是我们日常中…

基于SSM的医用物理学实验考核系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

算法题:柠檬水找零(典型的贪心算法问题)

这道题就是纯贪心算法题&#xff0c;遍历每个顾客&#xff0c;先把钱收了&#xff0c;如果是10块钱就判断手里头有没有5元用于找零&#xff1b;如果是20块钱&#xff0c;先判断是不是有10元5元&#xff0c;如果没有就再判断是否有3个5元。没有的话就直接返回 False。(完整题目附…

vue2项目中使用element ui组件库的table,制作表格,改表格的背景颜色为透明的

el-table背景颜色变成透明_el-table背景透明_讲礼貌的博客-CSDN博客 之前是白色的&#xff0c;现在变透明了&#xff0c;背景颜色是蓝色

加密市场波动:地缘政治与美股走弱引发不确定性!

伴随着国庆假期的结束&#xff0c;多日波动率维持低位的加密市场也似乎开始苏醒。近期多次突破28000美元未果的比特币&#xff0c;于9日15:00开始从27800美元附近下跌&#xff0c;最低跌至27260美元&#xff0c;同期以太坊也至1550美元左右&#xff0c;创近半个月来新低。 Coin…

vue接入高德地图获取经纬度

&#x1f90d;step1:高德地图开放平台&#xff0c;根据指引注册成为高德开放平台开发者&#xff0c;并申请 web 平台&#xff08;JS API&#xff09;的 key 和安全密钥; &#x1f90d;step2:在html引入安全密钥&#xff08;获取经纬度用&#xff0c;不然会报错&#xff09; <…