Python数据科学|Numpy简易教程7——读/写文件

读/写文件 NumPy的文件读/写主要有二进制的文件读/写和文件列表形式的数据读/写两种形式。学会读/写文件是利用NumPy进行数据处理的基础。NumPy提供了若干函数,可以把结果保存到二进制或文本文件中。除此之外,NumPy还提供了许多从文件读取数据并将其转换为数组的方法。
1. 二进制文件读/写
1.1 save函数:将一个numpy数组保存为二进制文件 save函数以二进制的格式保存数据。
save函数的语法格式为:numpy.save(file, arr, allow_pickle=True, fix_imports=True)
其中参数file 为要保存的文件的名称,需要指定文件保存的路径,如果未设置,则保存到默认路径下面;参数arr为需要保存的数组。简而言之,就是把数组arr保存至名称为“file”的文件中,其文件的扩展名.npy是系统自动添加的。
案例:将一个数组保存为二进制文件

import numpy as np#导入NumPy库 arr = np.arange(100).reshape(10,10)#创建一个数组 np.save("../save_arr",arr)#保存数组 print('保存的数组为:\n',arr)

保存的数组为: [[ 0123456789] [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] [40 41 42 43 44 45 46 47 48 49] [50 51 52 53 54 55 56 57 58 59] [60 61 62 63 64 65 66 67 68 69] [70 71 72 73 74 75 76 77 78 79] [80 81 82 83 84 85 86 87 88 89] [90 91 92 93 94 95 96 97 98 99]]

注意:保存路径中的目录一定要存在!save函数不会自动创建目录。
1.2 savez函数:将多个numpy数组保存为二进制文件 如果将多个数组保存到一个文件中,可以使用savez函数,其文件的扩展名为.npz
savez函数的语法格式为:numpy.savez(file, *args, **kwds)
其中:
  • file:要保存的文件,扩展名为.npz,如果文件路径末尾没有扩展名.npz,该扩展名会被自动加上。
  • args: 要保存的数组,可以使用关键字参数为数组起一个名字,非关键字参数传递的数组会自动起名为 arr_0, arr_1, … 。
  • kwds: 要保存的数组使用关键字名称。
案例:将多个数组保存为二进制文件
arr1 = np.array([[1,2,3],[4,5,6]]) arr2 = np.arange(0,1.0,0.1) np.savez('../savez_arr',arr1,arr2) print('保存的数组1为:',arr1) print('保存的数组2为:',arr2)

保存的数组1为: [[1 2 3] [4 5 6]] 保存的数组2为: [0.0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]

1.3 load函数:读取二进制文件 需要读取二进制文件的时候可以使用load函数,用文件名作为参数。
load函数的格式为:numpy.load(file, mmap_mode=None, allow_pickle=True, fix_imports=True, encoding=’ASCII’)
npy文件读取的结果为numpy数组对象ndarray
npz文件读取的结果为类字典对象,如果在savez函数中未指定键时,自动使用 arr_0, arr_1, …等键名称。
案例:读取.npy格式二进制文件
loaded_data = https://www.it610.com/article/np.load("../save_arr.npy")#读取含有单个数组的文件 print('读取的数组为:\n',loaded_data)

读取的数组为: [[ 0123456789] [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] [40 41 42 43 44 45 46 47 48 49] [50 51 52 53 54 55 56 57 58 59] [60 61 62 63 64 65 66 67 68 69] [70 71 72 73 74 75 76 77 78 79] [80 81 82 83 84 85 86 87 88 89] [90 91 92 93 94 95 96 97 98 99]]

案例:读取.npz格式二进制文件
loaded_data1 = np.load("../savez_arr.npz")#读取含有多个数组的文件 print('读取的数组1为:',loaded_data1['arr_0']) print('读取的数组2为:',loaded_data1['arr_1'])

读取的数组1为: [[1 2 3] [4 5 6]] 读取的数组2为: [0.0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]

注意!存储时可以省略扩展名,但读取时不能省略扩展名。
2. 文本文件读/写
在实际的数据分析任务中,更多地使用文本格式的数据,如TXTCSV格式,因此经常使用savetxt函数、loadtxt函数、genfromtxt函数执行对文本格式数据的读取任务。
2.1 savetxt函数:读取二进制文件 savetxt函数可将数组写到以某种分隔符隔开的文本文件中,语法格式如下。
np.savetxt(fname, X, fmt='%.18e', delimiter=' ', newline='\n',header='',footer='', comments='# ')
其中第一个参数是文件名fname,第二个参数X为数组数据,第四个参数为数据分隔符delimiter
案例:将数组保存为文本文件
arr = np.arange(0,12,0.5).reshape(4,-1) print('创建的数组为:',arr)#fmt ="%d"为指定保存为整数 np.savetxt("../arr.txt", arr, fmt="%d", delimiter=",")

创建的数组为: [[ 0.0.51.1.52.2.5] [ 3.3.54.4.55.5.5] [ 6.6.57.7.58.8.5] [ 9.9.5 10.10.5 11.11.5]]

2.3 loadtxt函数:读取二进制文件 loadtxt函数执行的是savetxt函数相反的操作,即把文件加载到一个二维数组中。
loadtxt函数的格式为:numpy.loadtxt(FILENAME, dtype=int, delimiter=' ')
其中参数delimiter可以指定各种分隔符、针对特定列的转换器函数、需要跳过的行数等。
案例:读取文本文件
arr = np.arange(0,12,0.5).reshape(4,-1) print('创建的数组为:',arr)#fmt ="%d"为指定保存为整数 np.savetxt("../arr.txt", arr, fmt="%d", delimiter=",") #读入的时候也需要指定逗号分隔 loaded_data = https://www.it610.com/article/np.loadtxt("../arr.txt",delimiter=",") print('读取的数组为:',loaded_data)

创建的数组为: [[ 0.0.51.1.52.2.5] [ 3.3.54.4.55.5.5] [ 6.6.57.7.58.8.5] [ 9.9.5 10.10.5 11.11.5]] 读取的数组为: [[ 0.0.1.1.2.2.] [ 3.3.4.4.5.5.] [ 6.6.7.7.8.8.] [ 9.9. 10. 10. 11. 11.]]

2.3 genfromtxt函数:读取二进制文件 genfromtxt函数和loadtxt函数相似,不过它面向的是结构化数组和缺失数据。它通常使用的参数有3个,即存放数据的文件名参数fname、用于分隔的字符参数delimiter和是否含有列标题参数names
案例:读取文本文件
loaded_data = https://www.it610.com/article/np.genfromtxt("../arr.txt", delimiter = ",") print('读取的数组为:',loaded_data)

读取的数组为: [[ 0.0.1.1.2.2.] [ 3.3.4.4.5.5.] [ 6.6.7.7.8.8.] [ 9.9. 10. 10. 11. 11.]]

【Python数据科学|Numpy简易教程7——读/写文件】输出的结果是一组结构化的数据(结构化数组可以用 dtype选项指定一系列用逗号隔开的说明符,指明构成结构体的元素以及它们的数据类型和顺序),数据从第二行开始。因为names参数默认第一行为数据的列名,所以数据从第二行开始。

    推荐阅读