当前位置: 代码网 > it编程>前端脚本>Python > Python存储与读写二进制文件的示例代码

Python存储与读写二进制文件的示例代码

2024年09月10日 Python 我要评论
技术背景一般情况下我们会选择使用明文形式来存储数据,如json、txt、csv等等。如果是需要压缩率较高的存储格式,还可以选择使用hdf5或者npz等格式。还有一种比较紧凑的数据存储格式,就是直接按照

技术背景

一般情况下我们会选择使用明文形式来存储数据,如json、txt、csv等等。如果是需要压缩率较高的存储格式,还可以选择使用hdf5或者npz等格式。还有一种比较紧凑的数据存储格式,就是直接按照二进制格式存储。这种格式下,存储的数据之间没有间隔符,在没有压缩的情况下应该是体积最小的存储类型。

使用方法

在python中,我们可以使用numpy.tofile()功能,直接将numpy数组类型存储到一个二进制文件中。读取的时候,虽然可以直接使用open(file_name, 'rb')来进行读取,但是为了适配大量io的场景,这里我们使用内存映射mmap的形式来进行数据读取。

完整示例

如下是一个完整的示例代码,相关的功能直接用注释的形式在代码中标记:

import numpy as np
import mmap
import resource
# 获取页数据量大小(单位:字节)
page_size = resource.getpagesize()
# 定义单精度浮点数数据占用字节(单位:字节)
data_size = 4
# 计算页存储数据数量(num_float32)
page_fnum = int(page_size/data_size)
print ("the page_size is: {}".format(page_size))
print ("corresponding float32 numbers should be: {}".format(page_fnum))
# 生成示例数据,使用page_fnum+4大小的数据量定义两页数据
tmp_arr = np.arange(page_fnum+4).astype(np.float32)
# 数据存储路径
tmp_file = '/tmp/tmp.dat'
# 将数组存储到二进制文件中
tmp_arr.tofile(tmp_file)
# 每次从二进制文件中读取4个数据
read_num = 4
with open(tmp_file, 'rb') as file:
    # 第一页数据的内存映射
    mm = mmap.mmap(file.fileno(), 0, access=mmap.access_read, offset=0)
    # 第一页数据的1、2、3、4位数据
    print (np.frombuffer(mm.read(data_size*read_num), dtype='<f4'))
    # 第一页数据的5、6、7、8位数据
    print (np.frombuffer(mm.read(data_size*read_num), dtype='<f4'))
    # 第二页数据的内存映射
    mm = mmap.mmap(file.fileno(), 0, access=mmap.access_read, offset=page_size)
    # 第二页数据的1~4位数据
    print (np.frombuffer(mm.read(data_size*read_num), dtype='<f4'))
    # 第二页数据的5~8位数据
    print (np.frombuffer(mm.read(data_size*read_num), dtype='<f4'))
    # 关闭内存映射
    mm.close()
# 退出文件io

该脚本的输出结果为:

the page_size is: 4096
corresponding float32 numbers should be: 1024
[0. 1. 2. 3.]
[4. 5. 6. 7.]
[1024. 1025. 1026. 1027.]
[]

结果解析

我们打印的第一个数据是页大小,这里显示是4096个字节。而一个单精度浮点数占4个字节,所以一页存了1024个单精度浮点数,也就是第二个打印输出的结果。由于我们定义的numpy数组是一个从0开始的递增数组,因此第一页数据的前8位数字就是从0到7。而第二页的数据是1024~1027一共4个浮点数,占16个字节。所以我们在第二页第二次使用numpy.frombuffer()去读取数据的时候,得到的是一个空的数组。此外我们可以查看一下这个二进制文件的大小:

in [1]: import os
in [2]: os.path.getsize('/tmp/tmp.dat')
out[2]: 4112

一共是4112个字节,刚好是4096+16个字节。

总结概要

本文介绍了一种在python中将numpy数组转存为一个紧凑的二进制格式的文件,及其使用内存映射的形式进行读取的方案。一个二进制的数据流,不仅可以更加方便页形式的内存映射,相比于传统的numpy单精度浮点数数组还有一个可哈希的特性。总体来说是一个对于高性能计算十分友好的存储格式,在cudasponge中作为一个分子动力学模拟轨迹输出的格式使用。

版权声明

本文首发链接为:https://www.cnblogs.com/dechinphy/p/dat.html

作者id:dechinphy

更多原著文章:https://www.cnblogs.com/dechinphy/

请博主喝咖啡:https://www.cnblogs.com/dechinphy/gallery/image/379634.html

到此这篇关于python存储与读写二进制文件的文章就介绍到这了,更多相关python读写二进制文件内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

  • python循环某一特定列的所有行数据(方法示例)

    python循环某一特定列的所有行数据(方法示例)

    在python中,处理表格数据(比如csv文件、excel文件等)时,我们通常会使用pandas库,因为它提供了丰富的数据结构和数据分析工具。下面,我将以处理c... [阅读全文]
  • pyinstaller打包路径的总结

    一、相对路径(自己总结得出,简单好用,力荐)py文件的相对路径:相对于py文件所在目录的相对路径。exe文件的相对路径:相对于exe文件所在目录的相对路径。准备打包的代码:impo…

    2024年09月10日 前端脚本
  • Python 如何调用手机摄像头

    python 调用手机摄像头在手机上安装软件这里以安卓手机作为演示,iso也是差不多的软件下载地址(需要的朋友及时下载,链接有效期3天。)注意:要想在电脑上查看手机摄像头拍摄的内容…

    2024年09月10日 前端脚本
  • PyTorch中的torch.cat函数基本用法详解

    PyTorch中的torch.cat函数基本用法详解

    在pytorch中,torch.cat是一个非常实用的函数,用于将多个张量(tensor)沿指定维度连接起来。这个功能在机器学习和深度学习中经常用到,尤其是在需... [阅读全文]
  • 打包迁移Python env环境的三种方法总结

    打包迁移Python env环境的三种方法总结

    平常工作中可能遇到python虚拟环境迁移的场景,总结了如下几个方法。适用于同架构、相同类型系统之间的python虚拟环境迁移。方法一:使用pip freeze... [阅读全文]
  • Python实现时间序列变化点检测功能

    平稳性是时间序列分析与预测的核心概念。在平稳条件下,时间序列的统计特性(如均值)在时间维度上保持不变,仅存在随机波动。但是实际数据集中很少观察到完全的平稳性。时间序列通常会经历结构…

    2024年09月09日 前端脚本

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com