文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

【Python】Numpy用fromfile和tofile读写文件

2023-09-01 11:30

关注

文章目录

fromfiletofile既可以读写二进制文件,也可以读写文本文件,是非常灵活的文件读取函数。

tofile

考虑到大家手头没有合适的文件以供读写,所以先讲解tofile,其定义为

ndarray.tofile(fid, sep='', format='%s')

其中sep表示分隔符,当sep为空('')时,将存储为二进制文件,否则存储为文本。当存储为文本时,可通过format来设置文本的存储格式。

import numpy as npx = np.random.randint(10, size=[5,10])print(x)'''[[8 5 5 4 1 5 9 0 8 8] [1 4 9 2 2 8 6 3 0 8] [0 6 7 8 9 0 6 6 2 1] [2 8 6 0 5 0 4 8 6 8] [3 0 1 3 5 9 7 1 6 5]]'''x.tofile("test.bin")

由于sep默认为'',所以test.bin是二进制文件,为了确认这一点,可以打开看一下

>>> x.tofile("test.bin")>>> with open('test.bin', 'rb') as f:...   f.read()...

返回值如下


b’\x08\x00\x00\x00\x05\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00\x00\x01\x00\x00\x00\x05\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x08\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x00\t\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x08\x00\x00\x00\x06\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x08\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x08\x00\x00\x00\x06\x00\x00\x00\x08\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x03\x00\x00\x00\x05\x00\x00\x00\t\x00\x00\x00\x07\x00\x00\x00\x01\x00\x00\x00\x06\x00\x00\x00\x05\x00\x00\x00’


可以看出其存储的内容以4个字节为一组,并且高位高地址,0x08 0x00 0x00 0x00正是8,0x05 0x00 0x00 0x00正是5,依次类推。

如果对sep赋了值,那么存储内容也会相应地发生变化

x.tofile('test.txt', sep='|')

这个test.txt可以直接打开,内容是

8|5|5|4|1|5|9|0|8|8|1|4|9|2|2|8|6|3|0|8|0|6|7|8|9|0|6|6|2|1|2|8|6|0|5|0|4|8|6|8|3|0|1|3|5|9|7|1|6|5

format可以指明输出文档的数字格式,例如

x.tofile('test.txt', sep=',', format="%f")

所得到的test.txt中,数字就会有小数点。

fromfile

fromfile相当于是tofile的对偶函数,其定义为

fromfile(file, dtype=float, count=-1, sep='', offset=0, *, like=None)

其中file, sep自不必说,dtype表示读取之后赋予的数据类型,count表示读取的项目;offset表示偏移量;like为一个数组,这个数组决定读取数据之后输出数组的形状。

如果不声明dtype,则会默认为是float类型,从而导致灾难性后果

>>> y = np.fromfile('test.bin')>>> yarray([1.06099790e-313, 8.48798317e-314, 1.06099790e-313, 4.44659081e-323,       1.69759663e-313, 8.48798316e-314, 4.24399159e-314, 1.69759663e-313,       6.36598738e-314, 1.69759663e-313, 1.27319747e-313, 1.69759663e-313,       4.44659081e-323, 1.27319747e-313, 2.12199579e-314, 1.69759663e-313,       2.96439388e-323, 2.47032823e-323, 1.69759663e-313, 1.69759663e-313,       1.48219694e-323, 6.36598737e-314, 1.90979621e-313, 2.12199579e-314,       1.06099790e-313])

由于此前用tofile保存的是整型,所以读取的时候也得是整型

>>> y = np.fromfile('test.bin', dtype=int)>>> print(y)[8 5 5 4 1 5 9 0 8 8 1 4 9 2 2 8 6 3 0 8 0 6 7 8 9 0 6 6 2 1 2 8 6 0 5 0 4 8 6 8 3 0 1 3 5 9 7 1 6 5]

这回味儿就对了。

而且二进制和文本一定要注意区分,即sep不能弄错,否则也会无法读取到想要的数据

>>> y = np.fromfile('test.bin', dtype=int, sep=',')<stdin>:1: DeprecationWarning: string or file could not be read to its end due to unmatched data; this will raise a ValueError in the future.>>> yarray([], dtype=int32)>>> y = np.fromfile('test.txt', sep=',')>>> yarray([8., 5., 5., 4., 1., 5., 9., 0., 8., 8., 1., 4., 9., 2., 2., 8., 6.,       3., 0., 8., 0., 6., 7., 8., 9., 0., 6., 6., 2., 1., 2., 8., 6., 0.,       5., 0., 4., 8., 6., 8., 3., 0., 1., 3., 5., 9., 7., 1., 6., 5.])

来源地址:https://blog.csdn.net/m0_37816922/article/details/128694566

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯