【python】NumPy(三):文件读写

devtools/2024/10/20 1:26:12/

目录

​前言

NumPy

常见IO函数

save()和load()

savez()

loadtxt()和savetxt()

练习


前言

在数据分析中,我们经常需要从文件中读取数据或者将数据写入文件,常见的文件格式有:文本文件txt、CSV格式文件(用逗号分隔)、二进制文件等。

Numpy可以读写磁盘上的文本数据或者二进制数据。为ndarray对象引入了一个简单的文件格式:npy。用于存储重建ndarray所需的数据、图形、dtype等信息。

NumPy

常见IO函数

在Numpy中,常见的IO函数有:

  • loadtxt()和savetxt():处理正常的文本文件和CSV文件。
  • load()和save():读写文件数组数据的两个主要函数,默认情况下,是以未压缩的原始二进制格式保存在.npy文件中;
  • savez():用于将多个数写入文件。默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为 .npz 的文件中

save()和load()

numpy.save(filearrallow_pickle=Truefix_imports=<no value>)

想了解更多关于save函数的知识,可以查看:

numpy.save — NumPy v2.1 手册

  • file:文件的路径;
  • arr:所要保存的数组;
  • allow_pickle:bool,可选,允许使用python pickles保存对象数组。默认True。
  • fix_imports:bool,可选,不过已经弃用,忽略。

文件拓展名为.npy

numpy.load(file,mmap_mode=None,allow_pickle=False,fix_imports=True,encoding='ASCII')

  • file:所要读取的文件路径;

mmap_mode:None,{‘r+’,'r','w+','c'}可选;一个 内存映射数组保存在磁盘上。但是,可以访问它 并像任何 ndarray 一样进行切片。内存映射特别有用 用于访问大文件的小片段,而无需读取 整个文件复制到内存中。

‘r'打开现有文件仅供读取
'r+'打开现有文件进行读取和写入
'w+'常见或覆盖现有文件以进行读取和写入。如果shape也必须指定,那么mode='w+'
‘c’Copy-on-write:赋值会影响内存中的数据,但更改不会保存到磁盘,磁盘上的文件为只读。
  • allow_pickle:bool,可选 .
  • fix_imports:bool,可选。仅在python3上加载python2生成的picked文件时有用。
  • encoding:str,可选。读取python2字符串时使用的编码,仅在以下情况下有用 在 Python 3 中加载 Python 2 生成的 pickle 文件,其中包括 npy/npz 文件。除 'latin1' 以外的值, 不允许使用 'ASCII' 和 'bytes',因为它们会破坏数字 数据。默认值: 'ASCII'。
  • max_header_size:int,可选。标头允许的最大大小。大标头可能不安全 以安全地加载,因此需要显式传递更大的值。 有关详细信息,请参阅。 传递 allow_pickle 时,将忽略此选项。在那种情况下 根据定义,该文件是可信的,并且限制是不必要的。

示例:

python"># 首先存储数组数据,生成.npy文件
import numpy as np#这里利用相对路径来存储
fileName = './text.npy'
# 生成数组
a = np.arange(24).reshape(2,3,4)
print(a)
#保存到文件中
np.save(fileName,a)

当运行完上面的代码,我们可以打开我们在编写代码下的文件夹:

 

当我们用记事本打开后,会发现是一堆乱码:

 

我们来利用load()来读取其中的数据:

python">a = np.load(fileName)
a
python">array([[[ 0,  1,  2,  3],[ 4,  5,  6,  7],[ 8,  9, 10, 11]],[[12, 13, 14, 15],[16, 17, 18, 19],[20, 21, 22, 23]]])

我们可以看到,能够成功读取。

savez()

对于前面的save(),一次只能存储一个数组,那么在numpy中,提供了savez()函数,可以将多个数据保存到一个文件中,生成的文件拓展名是.npz

savez(file,*args,**kwds)

  • file:文件的路径;
  • *args:要保存到文件的数组;
  • **kwds:关键字,每个数组都会保存到 output 文件及其相应的关键字名称。

示例:

python"># 将三个数组放到文件中
a = np.arange(20).reshape(2,10)
b = np.arange(10).reshape(2,5)
c = np.arange(40).reshape(5,8)
#要保存到的文件路径
fileName = './texts.npz'
np.savez(fileName,a,b,c)

我们可以打开文件查查看,确实生成了texts.npz文件,在打开之后,也是一堆乱码。

同样的,我们需要利用load()函数来读取。

需要注意,如果我们直接接受文件内容,打印出来是这样的: 

可以看到,直接打印我们得不到我们想要的数组,因为什么呢?

因为被压缩了,需要根据文件所给的key关键字名称当做索引来进行打印。

python">all = np.load(fileName)
print(all)
print(all['arr_0'])
print(all['arr_1'])
print(all['arr_2'])
python">NpzFile './texts.npz' with keys: arr_0, arr_1, arr_2
[[ 0  1  2  3  4  5  6  7  8  9][10 11 12 13 14 15 16 17 18 19]]
[[0 1 2 3 4][5 6 7 8 9]]
[[ 0  1  2  3  4  5  6  7][ 8  9 10 11 12 13 14 15][16 17 18 19 20 21 22 23][24 25 26 27 28 29 30 31][32 33 34 35 36 37 38 39]]

loadtxt()和savetxt()

这两个函数只能够读写一维或者二维数组的文本文件,同时我们也可以给定分隔符、跳过行数等。

numpy.savetxt(fname,array,fmt='%.18e',delimiter=None,newline='\n', header='', footer='', comments='# ', encoding=None)

  • fname:文件路径
  • array:要写入文件的数组(可以是一维或者二维数组);
  • fmt:写入文件的格式,如:%d、%f、%.18e。默认是%.18e。
  • delimiter:分隔符;
  • header:将在文件开头写入的字符串;
  • footer:在文件末尾写入的字符串;
  • comments:附加在header和footer之间的字符串,为注释。
  • encoding:所使用的字符集编码。 

生成的文件可以是txt文件或者是CSV文件。

numpy.loadtxt(fname,dtype=type’float’>,comments=’#’,delimiter=None, converters=None,skiprows=0,usecols=None,unpack=False,ndmin=0,encoding=‘bytes’)

  • fname:所要读取的文件路径;
  • dtype:读取后数据的类型;
  • comments:跳过文件中指定参数开头的行(相当于注释)
  • delimiter:读取文件时的分隔符
  • converters:对读取的数据进行预处理;
  • skiprows:跳过的行数;
  • usecols:指定读取的列;
  • encoding:对读取的文件进行预编码。

示例:

现在我们来创建数组保存到文件中。

python">a = np.arange(12).reshape(3,4)
fileName='./text.txt'
# 默认fmt是%.18e(浮点数,即保留18位小数)
np.savetxt(fileName,a)

可以看到,如果我们没有设置格式,那么默认的格式就是%.18e,输出18位小数。

我们可以来设置一下:

python">a = np.arange(12).reshape(3,4)
fileName='./text.txt'
# 默认fmt是%.18e(浮点数,即保留18位小数)
np.savetxt(fileName,a,fmt='%d')

 

可以看到,我们指定输出格式为整数,那么在输出的时候就是整数。

我们来读取一下:

python">a = np.arange(12).reshape(3,4)
fileName='./text.txt'
# 默认fmt是%.18e(浮点数,即保留18位小数)
np.savetxt(fileName,a,fmt='%d')#读取文件
a = np.loadtxt(fileName,dtype=np.int32)
print(a)

结果:

python">[[ 0  1  2  3][ 4  5  6  7][ 8  9 10 11]]

 那么如果我们生成的是csv文件,那么会是什么样的?

python">a = np.arange(12).reshape(3,4)
fileName='./text.csv'
# 默认fmt是%.18e(浮点数,即保留18位小数)
np.savetxt(fileName,a,fmt='%d')

我们来读取一下: 

python">a = np.arange(12).reshape(3,4)
fileName='./text.csv'
# 默认fmt是%.18e(浮点数,即保留18位小数)
np.savetxt(fileName,a,fmt='%d')#读取文件
a = np.loadtxt(fileName,dtype=np.int32)
print(a)
python">[[ 0  1  2  3][ 4  5  6  7][ 8  9 10 11]]

那如果我们只想要第二三行,那么我们可以指定一下跳过几行(skiprows=1)

python">#读取文件
a = np.loadtxt(fileName,dtype=np.int32,skiprows=1)
print(a)
python">[[ 4  5  6  7][ 8  9 10 11]]

在此基础上,我们只需要第2、4列,那么我们可以设置一下usecols=(1,3)

python">#读取文件
a = np.loadtxt(fileName,dtype=np.int32,skiprows=1,usecols=(1,3))
print(a)
python">[[ 5  7][ 9 11]]

练习

现在有一个学生成绩单,根据需求,我们要读取出学生的成绩,并计算其总分。;

 我们可以打开记事本查看,会发现中间有逗号隔开,所以我们在读取的时候,也需要设置一下分隔符:

python">#首先我们需要创建一个结构化类型
stu_type = np.dtype([('name',np.str_,2),('Chinese','i2'),('Math','i2'),('English','i2')])
fileName='./成绩单.csv'
#进行读取,跳过第一行
student = np.loadtxt(fileName,skiprows=1,dtype=stu_type,delimiter=',')
print(student)
# 这里我们需要取出各科成绩
Chinese = student['Chinese']
Math = student['Math']
English = student['English']
print(Chinese)
print(Math)
print(English)
# 计算总分
sum = Chinese + Math + English
print('每个同学的总分为:',sum)
averge =sum/3
#设置格式
np.set_printoptions(formatter={'float': '{: 0.3f}'.format})
print('每个同学的平均分为:',averge)
python">[('张三',  90,  86,  99) ('李四', 100, 100, 100) ('王五',  87,  98, 111)('赵六',  89,  99,  98) ('安静',  86,  87,  94) ('安心',  98,  90,  87)('王梓',  87,  88,  89)]
[ 90 100  87  89  86  98  87]
[ 86 100  98  99  87  90  88]
[ 99 100 111  98  94  87  89]
每个同学的总分为: [275 300 296 286 267 275 264]
每个同学的平均分为: [ 91.667  100.000  98.667  95.333  89.000  91.667  88.000]

 以上就是本篇所有内容咯~

若有不足,欢迎指正~

后续慢慢改进~~~


http://www.ppmy.cn/devtools/127155.html

相关文章

Modbus 协议:工业自动化领域的通信脊梁

一、引言 在当今工业自动化的舞台上&#xff0c;数据的准确传输和设备间的有效通信是实现高效生产、精准控制的关键。Modbus 协议作为一种应用广泛、历史悠久的通信协议&#xff0c;在工业领域发挥着举足轻重的作用。从工厂的生产线到智能建筑的控制系统&#xff0c;从能源管理…

【MATLAB代码】TDOA定位,求三维下的位置(1主锚点、3副锚点),附代码

目录 代码概述 代码结构 输入输出 联系作者 代码用途 获取方法 代码概述 该MATLAB代码实现了基于时间差定位&#xff08;TDOA, Time Difference of Arrival&#xff09;的方法&#xff0c;使用最小二乘法在三维空间中估计一个未知点的位置。该算法利用一个主锚点和三个副…

QEMU源码全解析 —— 内存虚拟化(6)

接前一篇文章:QEMU源码全解析 —— 内存虚拟化(5) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社 QEMU内存管理模型

go语言编写SSH远程登录并执行命令的程序

在Go语言中&#xff0c;你可以使用golang.org/x/crypto/ssh包来编写一个SSH远程登录并执行命令的程序。以下是一个简单的示例&#xff0c;展示了如何使用该包来实现这个功能&#xff1a; 首先&#xff0c;你需要安装golang.org/x/crypto/ssh包&#xff08;如果还没有安装的话&…

百易云资产管理运营系统 ufile.api.php SQL注入漏洞复现

0x01 产品描述&#xff1a; 百易云资产管理运营系统&#xff0c;是专门针对企业不动产资产管理和运营需求而设计的一套综合解决方案。该系统能够覆盖资产的全生命周期管理&#xff0c;包括资产的登记、盘点、评估、处置等多个环节&#xff0c;同时提供强大的运营分析功能&#…

【达梦数据库】获取表字段信息SQL

在达梦数据库&#xff08;DM Database&#xff09;中&#xff0c;你可以通过查询系统视图来获取某个表的字段信息。具体来说&#xff0c;你可以使用 ALL_TAB_COLUMNS、USER_TAB_COLUMNS 或 DBA_TAB_COLUMNS 视图&#xff0c;具体取决于你的权限和需要查询的范围。 以下是获取某…

一文掌握异步web框架FastAPI(一)

目录 一、安装 FastAPI 和 Uvicorn(一个 ASGI 服务器): 1、ASGI 与 WSGI 2、Uvicorn 的特点 二、一个 简单的FastAPI 应用 ​编辑 三、路由参数与请求体 1. 基础路由 2. 路径参数和查询参数 3、请求体 1)JSON Data 2)multipart/form-data,用于处理文件上传和表单…

QT教程18-QPainterPath

目录 1. 基本概念 2. 创建和使用 QPainterPath 3. 添加基本图形元素 4. 组合路径 5. 路径的变换 6. 绘制路径 7. 常用方法 8. 示例&#xff1a;绘制一个复杂图形 9. 总结 QPainterPath 是 Qt 框架中的一个类&#xff0c;用于创建复杂的图形路径。它允许你定义一系列的…