Numpy 06-Python实验六-3 文件读写.py
import numpy as np # 1. 保存为TXT文本文件,可以用记事本查看 a=np.arange(0,10,0.5).reshape(4,-1) np.savetxt("out.txt",a,fmt="%d",delimiter=",") # 改为保存为整数,以逗号分隔 b = np.loadtxt("out.txt",delimiter=",") # load 时也要指定为逗号分隔 print(b) # 2. 保存为CSV文件,可以用Excel查看 # 缺点: # 只能保存一维和二维 numpy 数组,当 numpy 数组 a 有多维时,需要将其 a.reshape((a.shape[0], -1)) 后才能用这种方式保存。 # 不能追加保存,即每次 np.savetxt() 都会覆盖之前的内容。 a = np.array(range(20)).reshape((4, 5)) print(a) # 后缀改为 .txt 一样 filename = 'a.csv' # 写文件 np.savetxt(filename, a, fmt='%d', delimiter=',') # 读文件 b = np.loadtxt(filename, dtype=np.int32, delimiter=',') print(b) # 3. 保存为npy二进制文件,用记事本打开是乱码 # 优点: # npy 文件可以保存任意维度的 numpy 数组,不限于一维和二维; # npy 保存了 numpy 数组的结构,保存的时候是什么 shape 和 dtype,取出来时就是什么样的 shape 和 dtype。 # 缺点: # 只能保存一个 numpy 数组,每次保存会覆盖掉之前文件中存在的内容(如果有的话)。 a = np.array(range(20)).reshape((2, 2, 5)) print(a) filename = 'b.npy' # 写文件 np.save(filename, a) # 读文件 b = np.load(filename) print(b) print(b.shape) # 4. 保存为npz二进制文件,用记事本打开是乱码 # 优点: # npy 文件可以保存任意维度的 numpy 数组,不限于一维和二维; # npy 保存了 numpy 数组的结构,保存的时候是什么 shape 和 dtype,取出来时就是什么样的 shape 和 dtype; # 可以同时保存多个 numpy 数组; # 可以指定保存 numpy 数组的 key,读取的时候很方便,不会混乱。 # 缺点: # 保存多个 numpy 数组时,只能同时保存,即 np.savez(filename, a, b=b)。每次保存会覆盖掉之前文件中存在的内容(如果有的话)。 a = np.array(range(20)).reshape((2, 2, 5)) b = np.array(range(20, 44)).reshape(2, 3 ,4) print('a:\n', a) print('b:\n', b) filename = 'c.npz' # 写文件, 如果不指定key,那么默认key为'arr_0'、'arr_1',一直排下去。 np.savez(filename, a, b=b) # 读文件 c = np.load(filename) print('keys of NpzFile c:\n', c.keys()) print("c['arr_0']:\n", c['arr_0']) print("c['b']:\n", c['b'])

代码逐段详细解释
这段代码演示 NumPy 4 种文件读写方式:
savetxt/loadtxt:文本格式(txt/csv,可读,仅支持 1D/2D 数组)save/load(.npy):二进制单数组文件,保留维度 shape 和数据类型 dtype,支持多维savez/load(.npz):二进制压缩包,可以一次性保存多个 ndarray 数组
import numpy as np
导入 numpy 库,简写np
1. savetxt /loadtxt:保存读取 TXT 文本文件
a=np.arange(0,10,0.5).reshape(4,-1)
np.arange(0,10,0.5):从 0 开始到 10(不含 10),步长 0.5,生成:0,0.5,1,1.5 … 9.5,一共 20 个浮点数.reshape(4,-1):重塑数组形状为4 行;-1代表让 numpy自动计算列数:20/4=5 列,最终shape=(4,5)
np.savetxt("out.txt",a,fmt="%d",delimiter=",")
np.savetxt(文件名,数组,fmt=格式,delimiter=分隔符)
fmt="%d":以整数格式写入文本,会自动把浮点数取整保存(0.5→0,1.5→1)delimiter=",":元素之间用逗号隔开
生成的 out.txt 可以直接用记事本打开查看内容
b = np.loadtxt("out.txt",delimiter=",")
np.loadtxt读取文本文件,delimiter=","必须和写入时保持一致,按逗号切分数据,还原成 numpy 数组。
print(b)
打印读取回来的数组 b。
⚠️ savetxt 限制:只支持一维、二维数组,不支持三维及以上
2. savetxt 保存 CSV 文件(Excel 可打开)
a = np.array(range(20)).reshape((4, 5))
print(a)
创建 0~19,重塑为 4 行 5 列二维数组。
filename = 'a.csv'
np.savetxt(filename, a, fmt='%d', delimiter=',')
保存为 csv,逗号分隔,整数格式。CSV 可以用 Excel/WPS 直接打开表格查看。
b = np.loadtxt(filename, dtype=np.int32, delimiter=',')
print(b)
读取 csv,dtype=np.int32指定读取后数组元素类型为 32 位整型。
注释里两个缺点重点:
- 只能 1 维、2 维;多维数组要先 reshape 压平成二维才能保存
- 每次 savetxt 直接覆盖原文件,不能追加写入
3. save / load:.npy 二进制文件
a = np.array(range(20)).reshape((2, 2, 5))
print(a)
0~19,重塑成三维数组 shape=(2,2,5),savetxt无法直接保存三维,但npy可以。
filename = 'b.npy'
np.save(filename, a)
np.save()保存 ndarray 到.npy二进制文件。 ✅优点:
- 原生支持任意维度数组
- 自动保存数组 shape 和 dtype,读取时原样恢复,不需要手动指定形状 ❌缺点:
- 一个 npy 文件只能存 1 个数组;新 save 会覆盖旧文件
- 二进制文件,记事本打开是乱码,不能人工阅读
b = np.load(filename)
print(b)
print(b.shape)
np.load读取 npy,直接还原三维数组,打印 shape 验证。
4. savez / load:.npz 压缩包,一次性保存多个数组
a = np.array(range(20)).reshape((2, 2, 5))
b = np.array(range(20, 44)).reshape(2, 3 ,4)
print('a:\n', a)
print('b:\n', b)
创建两个不同形状、不同维度的三维数组 a 和 b。
filename = 'c.npz'
np.savez(filename, a, b=b)
np.savez(文件名, 数组1, key=数组2)
- 不传 key:默认自动命名
arr_0, arr_1, arr_2... b=b:手动指定 key 名字为b,读取时用c['b']取出这个数组
npz 本质是一个压缩包,内部包含多个独立 npy 文件。
c = np.load(filename)
print('keys of NpzFile c:\n', c.keys())
np.load读取 npz,返回一个类似字典的NpzFile对象。.keys()查看里面所有保存的数组名称。
print("c['arr_0']:\n", c['arr_0'])
print("c['b']:\n", c['b'])
用字典索引:c['key名']取出对应的数组。
✅ npz 优点:
- 支持多维数组
- 保留 shape、dtype
- 同一个文件可以存放多个数组,通过 key 区分 ❌缺点:
- 一次性写入;每次 savez 会覆盖旧文件,不能追加新增数组
4 种方式对比总结表
表格
| 方式 | 文件后缀 | 可读 (记事本) | 支持多维 | 保存多数组 | 特点 |
|---|---|---|---|---|---|
| savetxt/loadtxt | txt/csv | ✅能看 | ❌仅 1D/2D | ❌ | 文本表格,Excel 打开;适合少量二维数据导出 |
| save/load | .npy | ❌乱码 | ✅任意维度 | ❌只能 1 个 | 保留数组完整信息,程序内部读写首选 |
| savez/load | .npz | ❌乱码 | ✅任意维度 | ✅多个数组 | 打包一批数组一起存储 |
容易踩坑的关键点
fmt="%d":保存浮点数数组到文本时会截断为整数,如果需要保留小数,改为fmt="%.4f"delimiter读写必须一致,写逗号读也要逗号- npy/npz 是二进制,不能用记事本修改;如果需要人工查看数据,选 csv/txt
savez不支持追加:如果后续想再加数组,只能全部读出来,重新 savez 一次reshape(-1):-1 是自动推导维度,NumPy 自动计算,简化代码

浙公网安备 33010602011771号