You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 08:45:50