将csv持久化的浮点列表读回浮点列表中

时间:2018-06-06 21:14:09

标签: python abstract-syntax-tree

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

1 个答案:

答案 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。举一个明显的例子,想象一个有两个不同任意长度列表的表......