阅读csv,其中一列是python中的列表

wrrgggsh  于 2022-12-06  发布在  Python
关注(0)|答案(3)|浏览(125)

我在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

正如你所看到的,第一个条目是一个整数列表。我如何读入数据,以便我最终得到一个列表(或numpy.array)和2个浮点数?我尝试使用np.genfromtxt,但我不知道如何正确处理结果字节。
如果没有优雅的解决方案,有没有更好的方法来保存一列内的数组?

r7xajy2e

r7xajy2e1#

我注意到这个列表不是一个实际的列表(项目之间没有逗号),所以这应该可以工作

In [1]: with open('data.csv') as f:
   ...:     reader = csv.reader(f)
   ...:     data = []
   ...:     for line in reader:
   ...:         lst_of_nums = [int(x) for x in line[0][1:-1].split()]
   ...:         data.append([lst_of_nums, float(line[1]), float(line[2])])
   ...:

In [2]: data
Out[2]:
[[[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]]

如果这是一个有效的列表

import csv
from ast import literal_eval

In [1]: with open('data.csv') as f:
   ...:     reader = csv.reader(f)
   ...:     data = []
   ...:     for line in reader:
   ...:         data.append([literal_eval(line[0]), float(line[1]), float(line[2])])
   ...:

In [2]: data
Out[2]:
[[[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]]
uyhoqukh

uyhoqukh2#

你不需要一个file简单地尝试这个技巧。我知道这是很有趣的,但分享我的方式来阅读这篇文章。
只需将数据设置为str并读取即可。

import io
import pandas as pd

csv_data_as_str = '''[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 '''

df = pd.read_csv(io.StringIO(csv_data_as_str), sep=",",header = None)
    
print(df)

输出功率

0             1         2
0  [0 1 2 3 4 5]  2.145004e+06  0.000058
1  [0 1 2 3 4 5]  4.986045e+06  0.000018
2  [0 1 2 3 4 5]  2.185255e+06  0.000015
amrnrhlw

amrnrhlw3#

如果字符串的格式为“[0 1 2 3 4 5]”,并且有效数据为整数,则:

lv = '[0 1 2 3 4 5]'
mylist = list(map(int, lv[1:-1].split()))
print(mylist)

输出:

[0, 1, 2, 3, 4, 5]

相关问题