首页 > NumPy 阅读数:43

使用NumPy读写文件

通常情况下,数据是以文件形式存储的。常用的存储文件的格式有文本文件、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=<type'float'>,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,liming@163.com
2,王红,13656722231,wanghong@163.com
3,张艳,18534512367,zhangyan@sina.com


其代码如下。
# -*- 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)