通常情况下,数据是以文件形式存储的。常用的存储文件的格式有文本文件、CSV 格式文件、二进制格式文件和多维数据文件等。其中 CSV(Comma-Separated Value,逗号分隔值)格式是一种常见的文件格式。通常,数据库的转存文件就是 CSV 格式的,文件中的各个字段对应于数据库表中的列。众所周知,电子表格软件(如Microsoft Excel)可以处理 CSV 文件。
在数据分析中,经常需要从文件中读取数据或将数据写入文件,因此,学会读写文件操作是深入学习 NumPy 的基础。下面将分别介绍如何使用 NumPy 函数来读写一维或二维数组的文本文件、CSV 格式文件、二进制格式文件和多维数据文件。
使用 NumPy 读写文本文件
在 NumPy 中,loadtxt() 和 savetxt() 函数可以对文件后缀名为 .txt 和 .csv 的文件进行读写操作。
1. 将一维或二维数组写入 TXT 文件或 CSV 格式文件
在 NumPy 中,使用 savetxt() 函数可以将一维或二维数组写入后缀名为 .txt 或 .csv 的文件,该函数的格式如下:
numpy.savetxt(fname,array,fmt='%.18e',delimiter=None,newline='\n', header='', footer='', comments='#', encoding=None)
函数中参数说明如下:
fname:文件、字符串或产生器,可以是 .gz 或 .bz2 的压缩文件;
array:存入文件的数组(一维数组或者二维数组);
fmt:写入文件的格式,例如:%d,%.2f,%.18e,默认值是%.18e;
delimiter:分割符,默认是空格;
newline:换行符;
header:在文件开头写入的字符串;
footer:在文件末尾写入的字符串;
comments:为添加到页眉和页脚的字符串标记注释符,默认值为#;
encoding:设置输出文件的编码。如果编码不是 bytes 或 latin1,将无法在 NumPy 1.14 以下版本中加载该文件,默认为 latin1。
其中,newline 参数是 NumPy 1.5.0 版本中的新功能,header、footer、comments 参数是 NumPy 1.7.0 版本中的新功能,encoding 参数是 NumPy 1.14.0 版本中的新功能。这 5 个参数都是可选项。
【例 1】创建一个元素范围为 0~11 的 3 行 4 列的数组,然后设置不同的参数,将该数组写入 TXT 文件和 CSV 文件。代码如下。
# -*- coding: utf-8 -*-
import numpy as np
arr = np.arange(12).reshape(3,4)
#fmt默认取%.18e(浮点数),分割符默认是空格,写入文件保存在当前目录
np.savetxt('test1.txt',arr)
#写入文件的是十进制整数
np.savetxt('test2.txt',arr,fmt='%d',delimiter=',')
#在test3.txt文件头部和尾部都加#test3注释,写入的文件是字符串
np.savetxt('test3.txt',arr,fmt='%s',delimiter=',',header='test3',footer='test3')
#在test4.txt文件头部加##test4注释
np.savetxt('test4.txt',arr,fmt='%d',delimiter=',',header='test4',comments='##')
#将arr数组保存为CSV文件
np.savetxt('test.csv',arr,fmt='%d',delimiter=',',header='test')
2. 读取 TXT 文件和 CSV 格式文件
在 NumPy 中,读取 TXT 文件和 CSV 格式文件的函数是 loadtxt(),该函数格式如下:
numpy.loadtxt(fname,dtype=,comments='#',delimiter=None,convert
ers=None,skiprows=0,usecols=None,unpack=False,ndmin=0,encoding='byte
函数中参数说明如下:
fname:文件、字符串或产生器,可以是 .gz 或 .bz2 为扩展名的压缩文件;
dtype:数据类型;
delimiter:分割符,默认是空格;
usecols:选取数据的列;
unpack:如果 True,读入属性将分别写入不同变量;
comments:注释符,默认值为 #;
converters:转换器,数据列和转换函数之间进行映射的字典;
skiprows:跳过第一行的行数,默认值为 0;
ndmin:返回的数组至少具有ndmin维度。值为 0(默认值)、1 或 2;
encoding:用于解码输入文件的编码,默认为 bytes。
其中,除了 fname 参数外,其余参数为可选项。
【例 2】利用 NumPy 函数实现读取 TXT 文件和 CSV 格式文件的操作。
① 将上面中所创建的 test1.txt、test2.txt、test3.txt、test4.txt 和 test.csv文件的数据读取并保存到数组中。
② 创建学生通讯录的 CSV 文件,该文件中包含学生姓名、电话和 E-mail,并将其保存为 phone.csv 文件,然后从该文件中读取数据并保存到数组中。其中,学生通讯录 CSV 格式文件(列表形式,两值之间用逗号隔开)的数据如下。
id,name,tel,email
1,李明,13873321234,[email protected]
2,王红,13656722231,[email protected]
3,张艳,18534512367,[email protected]
其代码如下。
# -*- coding: utf-8 -*-
import numpy as np
#从test1.txt文件中读取数据
arr1 = np.loadtxt('test1.txt')
print(arr1)
#从test2.txt文件中读取数据
arr2 = np.loadtxt('test2.txt',delimiter=',')
#从test3.txt文件中读取数据
arr3 = np.loadtxt('test3.txt',dtype=np.int32,delimiter=',')
#从test4.txt文件中读取数据
arr4 = np.loadtxt('test4.txt',delimiter=',')
print(arr2,arr3,arr4)
#从csv文件中读取数据
arr5 = np.loadtxt('test.csv',delimiter=',')
arr6 = np.loadtxt('phone.csv',dtype=np.str,delimiter=',')
print(arr5,arr6)
使用 NumPy 读写二进制格式文件
在 NumPy 中,load() 和 save() 函数是专门用于读写二进制格式文件的,它们具有自动处理数组元素类型和形状的功能。savez() 函数能提供将多个数组存储至一个文件的能力,save() 函数保存之后后缀名为 npy,savez() 函数保存之后后缀名 .npz。
使用解压程序打开 npz 文件可以看到里面是若干个以“数组名称”命名的 NPY 格式的文件,数组名称默认为“arr_数字”的形式,在 savez() 函数中可以通过指明函数的参数名称来命名数组。
1. 使用 save() 或 savez() 函数写二进制格式文件
save() 或 savez() 函数的格式如下:
numpy.save(file,array) 或 numpy.savez(file,array)
函数中参数说明如下:
file:文件名,以 .npy 为扩展名,压缩扩展名为 .npz;
array:数组变量。
2. 使用 load() 函数读取二进制格式文件
load() 函数的格式如下:
numpy.load(file)
其中,file 为文件名,以 .npy 为扩展名,压缩扩展名为 .npz。
load()、save() 和 savez() 函数的示例代码 example1 如下。
# -*- coding: utf-8 -*-
import numpy as np
#load和save函数的示例代码
arr1 = np.arange(30).reshape(3,5,2)
np.save('arr1.npy',arr1)
arr_a = np.load('arr1.npy')
print(arr_a)
#load和savez函数的示例代码
arr2 = np.arange(20).reshape(4,5)
np.savez('arr2.npz',arr1,arr2)
arr_b = np.load('arr2.npz')
print(arr_b)
使用 NumPy 读写多维数据文件
在 NumPy 中,tofile() 和 fromfile() 函数可用于读写多维数据文件。
1. 使用 tofile() 函数写入多维数据文件
tofile() 函数的格式如下:
数组名.tofile(fid, sep='', format='%s')
函数中的参数说明如下:
fid:文件、字符串;
sep:数据分割符,如果是空串,写入文件为二进制,即默认为空串;
format:写入数据的格式。
2. 使用 fromfile() 函数读取多维数据文件
fromfile() 函数的格式如下:
numpy.fromfile(file,dtype=float,count=‐1,sep='')
函数中的参数说明如下:
file:文件、字符串;
dtype:读取的数据类型。读取数据的时候都需要指定数据类型,默认为浮点型;
count:读入元素个数,-1 表示读入整个文件;
sep:数据分割符,如果是空串,写入文件为二进制形式。
tofile() 和 fromfile() 函数的示例代码 example2 如下。
# -*- coding: utf-8 -*-
import numpy as np
#tofile和fromfile函数的示例代码
arr1 = np.arange(30).reshape(3,5,2)
arr1.tofile('arr.dat',sep=',',format='%d')
arr = np.fromfile('arr.dat',dtype=np.int32,sep=',').reshape((5,3,
print(arr)