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 种文件读写方式:

  1. savetxt/loadtxt:文本格式(txt/csv,可读,仅支持 1D/2D 数组)
  2. save/load(.npy):二进制单数组文件,保留维度 shape 和数据类型 dtype,支持多维
  3. 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. 只能 1 维、2 维;多维数组要先 reshape 压平成二维才能保存
  2. 每次 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 优点:

  1. 支持多维数组
  2. 保留 shape、dtype
  3. 同一个文件可以存放多个数组,通过 key 区分 ❌缺点:
  • 一次性写入;每次 savez 会覆盖旧文件,不能追加新增数组

4 种方式对比总结表

表格

方式文件后缀可读 (记事本)支持多维保存多数组特点
savetxt/loadtxt txt/csv ✅能看 ❌仅 1D/2D ❌ 文本表格,Excel 打开;适合少量二维数据导出
save/load .npy ❌乱码 ✅任意维度 ❌只能 1 个 保留数组完整信息,程序内部读写首选
savez/load .npz ❌乱码 ✅任意维度 ✅多个数组 打包一批数组一起存储

容易踩坑的关键点

  1. fmt="%d":保存浮点数数组到文本时会截断为整数,如果需要保留小数,改为fmt="%.4f"
  2. delimiter读写必须一致,写逗号读也要逗号
  3. npy/npz 是二进制,不能用记事本修改;如果需要人工查看数据,选 csv/txt
  4. savez不支持追加:如果后续想再加数组,只能全部读出来,重新 savez 一次
  5. reshape(-1):-1 是自动推导维度,NumPy 自动计算,简化代码

 

posted @ 2026-10-21 10:05  emanlee  阅读(3)  评论(0)    收藏  举报