在Python很多库中,使用文件名的地方都可以使用文件对象来替代。

在下述三种方法中,都是如此。

一、a.tofile()和np.fromfile()

numpy中的ndarray对象有一个函数tofile(文件名,sep=None),如果指明sep参数,以文本形式打开文件;没有指明sep参数,以二进制形式打开文件。

这种方式的特点如下:

  • 无格式
  • 默认使用二进制,指明sep参数则以文本方式读写文件
  • 不保留数组类型、形状信息
  • 最节省空间
  • 因为最简单,所以更便于交流
  • 在读入文件时,需要指明dtype
import numpy as np
a=np.array([1,2,3])
a.tofile("haha.bin")#12B
print(a.nbytes)#输出12
b=np.fromfile("haha.bin",np.int)
print(np.all(b==a))#输出True
a.tofile("haha.txt",sep="$")#使用sep参数则以文本方式写入文件
c=np.fromfile("haha.txt",sep="$")
print(np.all(c==a))

二、np.save()和np.load()

  • 这是有格式的输出,它能保留数组的类型和形状信息
  • 只能输出一个数组,若要输出多个数组可以使用np.savez(文件名,数组1,数组2....)
  • save()保存之后后缀名为npy,savez()保存之后后缀名npz
  • 使用解压程序打开npz文件可以看到里面是若干个以“数组名称”命名的npy格式的文件,数组名称默认为“arr_数字”的形式,可以指明savez()参数名称来命名数组
import numpy as np
a=np.array([1,2,3])
b=a.copy()
c=a.copy()
np.save("haha",a)#只能保存一个数组,文件名自动加npy后缀
np.savez("haha",a,b,c=c)#只打包不压缩,文件名自动加npz后缀
np.savez_compressed("haha.compress",a,b,c=c)#先打包,再压缩,文件名自动加npz后缀
x=np.load("haha.npy")#得到ndarray对象
y=np.load("haha.npz")#得到一个字典,dict对象
z=np.load("haha.compress.npz")#得到一个字典,dict对象
print(x)
for i in y:
print(i,y[i])
print(z.keys())
print(y.items())

np.save()函数的参数为:np.save(file,arr,allow_pickle,对象aingshifix_imports)

  • allow_pickle表示是否允许numpy使用pickle的方式来序列化对象,默认为True。
  • fix_imports参数用于兼容版本问题,用于Python3的代码导出兼容Python2的pickle。

在Python中,在有些情形下不鼓励使用pickle,这处于以下两点考虑:

  • 兼容性:不跨平台,因为pickle读入时一读入就是一个对象,这个对象所依赖的包在反序列化时不一定存在
  • 安全性:pickle文件中可以植入代码,造成反序列化时很危险

三、np.loadtxt和np.savetxt:读写一维或者二维的文本文件

可以用这两个函数来读写字符串。

import numpy as np
a=np.array(["one",1,3])#如果数字、字符串混合,默认为字符串类型
print(a.dtype,type(a)) a=np.tile("only unicode is allowd".split(),(4,1))
np.savetxt("haha.txt",a,fmt="%s")#fmt默认为%.18e(也就是浮点数)
print(np.loadtxt("haha.txt",dtype=np.str))

loadtxt和savetxt可以方便地用来读写csv文件。下面看一个复杂点的例子,这个例子讲了savetxt和loadtxt的参数。

import numpy as np
import pickle
a = np.arange(12).reshape(4, 3)
np.savetxt(fname=open("haha.txt", "wb"), # 使用文件名或者file对象都可以,但必须是二进制形式打开
X=a, # 准备写入的对象
fmt="%s", # 写入数据的格式,可以制定一个format数组,如["%s","%d"]
delimiter=",", # 分隔符
newline="\n\n", # 换行符
header=",".join("age sex height ".split()), # 头部
footer="this is the end", # 底部
comments="//") # 注释,默认头部和底部都是被注释了的
b = np.loadtxt(fname="haha.txt",
dtype=np.str,
comments="//",
delimiter=",",
# 传入的是bytes类型的对象
converters={0: lambda x: "age={}".format(x.decode("utf8")),
1: lambda x: "sex={}" .format(x.decode("utf8")),
2: lambda x: "height={}" .format(x.decode("utf8")),
},
skiprows=2, # 跳过前x行,这里的x就是需要跳过的行数
usecols=[0, 1, 2], # 需要读取哪几列
unpack=False, # 是否按照列进行解压
ndmin=0) # 返回的数组至少具有的维数(如果不足,会补维)
print(open("haha.txt").read())
print(b)
# 使用unpack
age, sex, height = np.loadtxt(
fname="haha.txt",
dtype=np.int,
comments="//",
delimiter=",",
unpack=True#使用unpack参数直接把各列解压
)
print(age)
print(height)

参考资料

官方文档

奋斗的珞珞

numpy文件读写的三对函数的更多相关文章

  1. Numpy 文件读写

    NumPy 文件读写主要有二进制的文件读写和文件列表形式的数据读写两种形式 二进制的文件读写 save  np.save ("./文件名", 数组名):以二进制的格式保存数据 保存 ...

  2. 【Win 10 应用开发】文件读写的三种方案

    本文老周就跟伙伴们探讨一下关于文件读写的方法.总得来说嘛,有三种方案可以用,而且每种方案都各有特色,也说不上哪种较好.反正你得记住老祖宗留给我们的大智慧——事无定法,灵活运用者为上. OK,咱们开始吧 ...

  3. C# 文件读写系列三

    1.读写文本文件 在C# 文件读写系列二中列举了相当多的读写文本文件的方法,大致有以下几种: (1).通过静态类File的静态方法来进行文本文件的读写,主要有ReadAllBytes().ReadAl ...

  4. Python 文件读写的三种模式和区别

    #coding=utf-8 #__author:Administrator #__time:2018/5/9 13:14 #__file_name:text1 import io #能调用方法的一定是 ...

  5. 科学计算库Numpy——文件读写

    读文件 要读取的文件 有分隔符的文件 备注:delimiter分隔符. 有多余行的文件 备注:skiprows去掉几行. 指定列 备注:usecols指定使用哪几列. 写文件 保存后的文件 备注:fm ...

  6. 文件读写(三)利用FileStream类操作字节数组byte[]、BinaryFormatter、内存流MemoryStream

    一.Stream类概述 在.NET Framework中,文件和流是有区别的.文件是存储在磁盘上的数据集,它具有名称和相应的路径.当打开一个文件并对其进行读/写时,该文件就称为流(stream).但是 ...

  7. day5_函数_文件读写_用一个函数来满足文件的读或者写_应用默认参数

    import json def op_file_tojson(filename,dic=None): #默认值参数,根据是否传dic字典来判断读还是写 if dic: #如果dic传了值,不是空的,则 ...

  8. Python中文件读写read,readline,readlines函数的区别?

    read 每次会读取整个文件 readline 每次读取一行信息 readlines 读取整个文件返回一个列表,列表每个元素代表一行

  9. NX二次开发-C语言文件读写fwrite和fread函数

    NX9+VS2012 #include <uf.h> #include <stdio.h> UF_initialize(); /* //设置文件路径 const char* f ...

随机推荐

  1. java去除字符串的html标签

    //方法一 public String stripHtml(String content) { // <p>段落替换为换行 content = content.replaceAll(&qu ...

  2. Ubuntu SVN安装&使用&命令

    SVN 安装 apt-get install subversion checkout svn checkout svn://192.168.1.110/app 按提示输入相应的用户名和密码. 往版本库 ...

  3. registry-1.docker.io TimeOut 错误

    用Docker For Windows在Windows 10上执行docker login或者 docker pull/push的时候,经常会报这样的错误: https: Get https://re ...

  4. ASP入门(八)-Request对象

    Request是ASP的耳朵,它可以获得客户端传递来的消息. BinaryRead方法和TotalBytes属性 用于以二进制方式读取客户端的请求,比如处理通过客户端上传文件时,通常使用这个方法来读取 ...

  5. Global Web Index发布社交网络现状调查,Snapchat增速领跑移动端所有App,四分之一Facebook用户年龄在45岁以上【转载+整理】

    原文地址 有次上班做公交,期间听到一个老太太说:"我加你微信啊--",还有一次去看老中医,并交换了电话,可当我回去后发现这个大夫竟然加了我微信--这些都令我有点吃惊,连60.70岁 ...

  6. iOS NSNotificationCenter 最基本使用

    NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:] , @"a ...

  7. Error 之 只能在执行Render() 的过程中调用 RegisterForEventValidation;

    在实现"将GridView中的数据导出到Excel中"的时候出现了如下错误: 用户代码未处理 InvalidOperationException 只能在执行 Render() 的过 ...

  8. 微信小程序 - 上传图片(组件)

    更新日期: 2019/3/14:首次发布,更新了2018/12/30的UI以及反馈信息获取方式,具体请下载:demo. 2019/3/20:感谢544429676@qq.com指出的现存bug,已修复 ...

  9. C#或Python中正则表达式元字符含意

    一.列表 元字符 描述 \ 将下一个字符标记为一个特殊字符.或一个原义字符.或一个 向后引用.或一个八进制转义符.例如,'n' 匹配字符 "n".'\n' 匹配一个换行符.序列 ' ...

  10. SQLServer中char、varchar、nchar、nvarchar的区别

    http://www.cnblogs.com/14lcj/archive/2012/07/08/2581234.html SQLServer中char.varchar.nchar.nvarchar的区 ...