前面 几天,我们把 NumPy 的创建、索引、运算、统计、排序、线性代数都过了一遍。
但只会在内存里算还不够。
真实场景里,数据总要写入文件,方便后面继续处理、交给别的工具,或者直接保存成果。
这一篇就讲一件事:NumPy 怎么读文件,怎么写文件。
一、为什么要学文件读写
在数据分析里,文件读写不是“附加技能”,而是基础动作。
你会经常遇到这几种场景:
如果前面只是“会算”,那这一节就是让数据真正流动起来。
二、从文件读取数据: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:把表头当作字段名读取
三、把数据保存到文件:文本和二进制
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)
这个格式的好处很直接:
四、文本格式和二进制格式怎么选
新手常见问题
loadtxt遇到空行或 NaN直接报错,换 genfromtxt- 保存整数数组时忘了写
fmt='%d',结果多出一堆 .0 - 路径里带空格或中文,调试时容易出问题,尽量统一路径写法
- 文件太大时一次性读写会慢,后面可以再看分块读取、
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
- 用 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算法为你所用!" 🤖✨
明天见! 🌟