我在csv文件中保留了一个浮点列表,因此显示(单行)。
"[6.61501123e-04 1.23390303e-04 1.59454121e-03 2.17852772e-02
:
3.02987776e-04 3.83064064e-03 6.90607396e-04 3.30468375e-03
2.78064613e-02]"
现在,当将回读转换回列表时,我正在使用ast
literal_eval方法:
probs = [float(p) for p in ast.literal_eval(row['prob_array'])]
我收到了这个错误:
probs = [float(p) for p in ast.literal_eval(row['prob_array'])]
File "/Users/santino/anaconda/lib/python2.7/ast.py", line 49, in literal_eval
node_or_string = parse(node_or_string, mode='eval')
File "/Users/santino/anaconda/lib/python2.7/ast.py", line 37, in parse
return compile(source, filename, mode, PyCF_ONLY_AST)
File "<unknown>", line 1
[6.61501123e-04 1.23390303e-04 1.59454121e-03 2.17852772e-02
^
SyntaxError: invalid syntax
不确定如何指示ast读取指数语法,或者我错误地认为它是导致异常的指数语法。
编辑:我使用csv.DictWriter来持久存入csv文件。我应该坚持不同的方式吗?
EDIT2:
with open("./input_file.csv","w") as r:
writer = csv.DictWriter(r,fieldnames=["item_id","item_name","prob_array"])
writer.writeheader()
res_list = ...
for i,res in enumerate(res_list):
row_dict = {}
row_dict['item_id'] = id_list[i]
row_dict['prob_array'] = res
row_dict['item_name'] = item_list[i]
writer.writerow(row_dict)
答案 0 :(得分:1)
CSV仅存储字符串列。使用它来存储字符串,整数,浮点数和一些其他基本类型是可以的,只要你手动转换对象:每当你对int str(i)
执行时,你都可以用{{1 }}
但对于浮动列表而言,这不是真的。没有任何函数可以用来在任意列表中取回int(s)
的结果。 1 并且它不是真的......无论你有什么,这似乎很可能是一个numpy数组或Pandas系列......要么。 2
如果您可以将每个浮动存储为单独的列,而不是将它们的列表存储在单个列中,那么这是最简单的答案。但这可能不合适。 3
因此,您只需要选择一些其他函数来代替隐式str(lst)
,通过简单的函数调用可以反转 。有一些格式设计用于将数据保存到字符串-JSON,XML,甚至是嵌套的CSV,因此这是首先要查看的内容。
通常JSON应该是你看到的第一个。只要它可以处理你的所有数据(它肯定可以在这里),它使用起来很简单,有人已经想过扔掉所有恼人的边缘情况,并且有代码可以为宇宙中的每个平台解析它。
所以,你写下这样的值:
str
然后你可以这样读回来:
row_dict['prob_array'] = json.dumps(res)
如果prob_array = json.loads(row['prob_array'])
实际上是一个numpy数组或Pandas系列或其他东西而不是列表,那么你想要转换prob_array
,或者使用numpy或Pandas JSON方法而不是stdlib模块。
唯一真正的问题是,如果您希望CSV是人类可读/可编辑的,则转义的逗号和引号可能非常难看。
在这种情况下,您可以定义一种更简单的格式,它仍然可以轻松编写和解析您的特定数据,并且更易于人工阅读,就像空格分隔的浮点数一样:
list
<子> 1。有时您可以使用row_dict['prob_array'] = ' '.join(map(str, res))
prob_array = [float(val) for val in row['prob_array'].split()]
,但依赖于此绝不是一个好主意,并且它不在此处工作。
<子> 2。 numpy和Pandas使用的人类可读格式比Python列表使用的格式更难解析。您可以切换到他们的ast.literal_eval
而不是repr
,但它仍然没有转到str
。
<子> 3。举一个明显的例子,想象一个有两个不同任意长度列表的表......