当前位置:首页>python>【一起学Python】第88天:NumPy文件读写全攻略,数据持久化不再难!

【一起学Python】第88天:NumPy文件读写全攻略,数据持久化不再难!

  • 2026-10-11 08:01:46
【一起学Python】第88天:NumPy文件读写全攻略,数据持久化不再难!

前面 几天,我们把 NumPy 的创建、索引、运算、统计、排序、线性代数都过了一遍。

但只会在内存里算还不够。

真实场景里,数据总要写入文件,方便后面继续处理、交给别的工具,或者直接保存成果。

这一篇就讲一件事:NumPy 怎么读文件,怎么写文件。

一、为什么要学文件读写

在数据分析里,文件读写不是“附加技能”,而是基础动作。

你会经常遇到这几种场景:

  • 把处理后的结果保存下来,方便下次直接使用
  • 和 Excel、数据库、其他语言交换数据
  • 用 .npy 做中间缓存,加快后续处理速度
  • 跑完整的数据流程:读取 → 处理 → 保存

如果前面只是“会算”,那这一节就是让数据真正流动起来。

二、从文件读取数据:loadtxt 和 genfromtxt

1. np.loadtxt():适合干净、规则的文本文件

如果文件里没有缺失值,数据类型一致,分隔符也固定,loadtxt 就够用了。

import numpy as np# 假设 data.txt 内容如下:# 1.0 2.0 3.0# 4.0 5.0 6.0# 7.0 8.0 9.0data = np.loadtxt('data.txt')print("读取结果:\n", data)

输出:

[[1. 2. 3.] [4. 5. 6.] [7. 8. 9.]]
常用参数:
  • delimiter=',': 指定分隔符,CSV 常用
  • skiprows=1:跳过表头
  • dtype=np.float32:指定数据类型,节省内存

2. np.genfromtxt():更适合缺失值和不规则数据

现实里的数据通常没那么整齐,可能有空值、NaN,或者某些列类型不一致。

这种情况,genfromtxt 更稳一点。

# 假设 data_nan.txt 内容如下:# 1.0 2.0 3.0# 4.0 NaN 6.0# 7.0 8.0 9.0data_nan = np.genfromtxt('data_nan.txt', filling_values=0)print("处理缺失值后:\n", data_nan)
输出:
[[1. 2. 3.] [4. 0. 6.] [7. 8. 9.]]

常见用法:

  • filling_values:把缺失值补成指定内容
  • names=True:把表头当作字段名读取
  • 容错能力比 loadtxt 强,适合先做清洗

三、把数据保存到文件:文本和二进制

1. np.savetxt():保存为文本文件

如果你希望文件能直接被 Excel、BI 工具或者其他程序打开,savetxt 很方便。
arr = np.array([[10, 20, 30],                [40, 50, 60],                [70, 80, 90]])# 保存为 CSVnp.savetxt('output_data.csv', arr, delimiter=',', fmt='%d')print("已保存为文本文件: output_data.csv")

常用参数:

  • fmt='%d':控制输出格式,整数、小数、字符串都可以指定
  • header='A,B,C':添加表头
  • comments='':去掉默认的 # 注释符

2. np.save() 和 np.load():NumPy 自己的二进制格式

如果是中间结果、缓存数据、模型参数,这种格式更合适。

# 保存为 .npy 文件np.save('cache_data.npy', arr)print("已保存为二进制文件: cache_data.npy")# 读取回来loaded_arr = np.load('cache_data.npy')print("加载结果:\n", loaded_arr)

这个格式的好处很直接:

  • 读写速度通常比文本快很多
  • dtype、shape这些信息都能保住
  • 适合做临时缓存和脚本之间的数据传递

四、文本格式和二进制格式怎么选

项目
文本 (.txt/.csv)
二进制 (.npy)
是否可读
可以直接看
不能直接看
兼容性
很高
主要给 NumPy 用
速度
一般
较快
保留类型
需要手动处理
自动保留
适合场景
交换、报表、导出
缓存、保存中间结果

新手常见问题

  1. loadtxt遇到空行或 NaN直接报错,换 genfromtxt
  2. 保存整数数组时忘了写 fmt='%d',结果多出一堆 .0
  3. 路径里带空格或中文,调试时容易出问题,尽量统一路径写法
  4. 文件太大时一次性读写会慢,后面可以再看分块读取、parquet 这些方案

五、今日作业

基础题

  • 创建一个 3×3 的随机整数数组,保存为 test_data.txt,空格分隔
  • 用 np.loadtxt() 读取这个文件,打印形状和数据类型
  • 把数组保存成 test_data.npy,再用 np.load() 验证内容一致

进阶题

  • 手动写一个包含 NaN 的文本文件,用 genfromtxt 读取,并把缺失值替换成 -999
  • 用 savetxt 导出 CSV,添加表头 X,Y,Z,保留 2 位小数
  • 对比同一数组保存成 .txt 和 .npy 后的文件大小

挑战题

  • 读取原始数据,去掉缺失值,算每列均值,再分别保存成 CSV 和 NPY
  • 生成 10 万行数据,分批读取,统计总耗时
  • 用 Excel 打开导出的 CSV,再用 Python 重新加载,检查格式是否正常
参考代码:
import numpy as np# 1. 生成并保存原始数据raw = np.random.randn(100, 3)np.savetxt('raw.csv', raw, delimiter=',', fmt='%.4f')# 2. 读取并处理data = np.genfromtxt('raw.csv', delimiter=',')cleaned = np.nan_to_num(data, nan=0.0)# 3. 计算列均值并保存col_means = np.mean(cleaned, axis=0)np.savetxt(    'result.csv',    col_means.reshape(1, -1),    header='Mean_Col1,Mean_Col2,Mean_Col3',    delimiter=',',    fmt='%.4f',    comments='')print("流程完成")

【一起学Python】每天进步一点点,365天后遇见更优秀的自己!

👉 关注公众号,不错过每天的学习内容!

🎯 今日金句:

"矩阵是数据的骨架,线性代数是它的灵魂。掌握运算规则,让AI算法为你所用!" 🤖✨

明天见! 🌟

最新文章

随机文章