Python读取含列表列的CSV:解析方法及存储优化咨询
处理含列表列的CSV文件读取与存储问题
先看你提供的CSV内容:
[0 1 2 3 4 5],2145004.491585603,5.784000000019773e-05 [0 1 2 3 4 5],4986045.063898375,1.771400000016854e-05 [0 1 2 3 4 5],2185254.9265346257,1.468399999993153e-05
你的核心需求:
读取上述CSV,每行提取出一个整数列表/NumPy数组,以及两个浮点数;尝试过
np.genfromtxt但不会处理字节数据,同时想知道有没有更优雅的单列数组存储方式。
一、读取现有CSV的可行方法
方法1:用Pandas配合字符串解析
Pandas能快速读入CSV,再通过简单的字符串处理把第一列转成数组:
import pandas as pd import numpy as np # 读入CSV,自定义列名 df = pd.read_csv('your_file.csv', header=None, names=['int_list', 'float1', 'float2']) # 清洗第一列:去掉方括号、按空格分割、转整数数组 df['int_list'] = df['int_list'].apply(lambda x: np.array(x.strip('[]').split(), dtype=int)) # 逐行提取数据示例 for _, row in df.iterrows(): int_array = row['int_list'] f1 = row['float1'] f2 = row['float2'] print(int_array, f1, f2)
方法2:纯NumPy处理字节数据
如果坚持用np.genfromtxt,可以手动解析字节格式的第一列:
import numpy as np # 以object类型读入,保留原始字符串(避免自动转成字节后丢失信息) raw_data = np.genfromtxt('your_file.csv', delimiter=',', dtype=object) # 逐行解析 parsed_data = [] for row in raw_data: # 把字节转成字符串,清洗后转整数数组 int_str = row[0].decode('utf-8').strip('[]') int_array = np.array(int_str.split(), dtype=int) # 后两列直接转浮点数 f1 = float(row[1]) f2 = float(row[2]) parsed_data.append( (int_array, f1, f2) ) # 查看解析结果 for item in parsed_data: print(item)
二、更优雅的单列数组存储方式
如果可以重新生成CSV,推荐以下几种格式,避免后续解析麻烦:
1. 用逗号分隔数组元素
把第一列改成0,1,2,3,4,5,这样CSV结构更规整,读取时可直接指定列类型:
0,1,2,3,4,5,2145004.491585603,5.784000000019773e-05 0,1,2,3,4,5,4986045.063898375,1.771400000016854e-05
读取时可以直接把前6列合并成数组:
data = np.genfromtxt('new_file.csv', delimiter=',', dtype=np.float64) int_arrays = data[:, :6].astype(int) floats1 = data[:, 6] floats2 = data[:, 7]
2. 用JSON格式存储数组
把第一列存为标准JSON数组字符串[0,1,2,3,4,5],读取时用json.loads解析:
"[0,1,2,3,4,5]",2145004.491585603,5.784000000019773e-05 "[0,1,2,3,4,5]",4986045.063898375,1.771400000016854e-05
解析示例:
import json import numpy as np with open('json_file.csv', 'r') as f: for line in f: parts = line.strip().split(',', 1) int_array = np.array(json.loads(parts[0]), dtype=int) f1, f2 = map(float, parts[1].split(',')) print(int_array, f1, f2)
3. 放弃CSV,用NumPy二进制存储
如果不需要人类可读,直接用np.savez打包存储,读取时无需任何字符串解析:
# 保存数据 int_arrays = np.array([[0,1,2,3,4,5]]*3) floats1 = np.array([2145004.491585603, 4986045.063898375, 2185254.9265346257]) floats2 = np.array([5.784000000019773e-05, 1.771400000016854e-05, 1.468399999993153e-05]) np.savez('data.npz', int_arrays=int_arrays, floats1=floats1, floats2=floats2) # 读取数据 loaded_data = np.load('data.npz') int_arrays = loaded_data['int_arrays'] floats1 = loaded_data['floats1'] floats2 = loaded_data['floats2']
内容的提问来源于stack exchange,提问作者Sebastian Becker
相关产品推荐
相关产品推荐

