如何识别并适当地解析由Python创建的csv数据中的列表

时间:2017-05-10 08:45:52

标签: python list csv python-3.5

我正在使用Python从CSV导出数据和从CSV导入数据。当写入CSV时,某些单独的段/值最初是列表。 python CSV库将这些值输出为CSV,用方括号括起来。

当我读回数据时,也使用CSV库,它无法识别列表的存在,而是将其作为单个字符串读取。

有什么方法可以将列表作为列表而不是字符串读回?我宁愿不使用split(',')手动操作字符串。

import csv

dummy_data = [['list value 1', 2, 'list value 3', '',], 'string 1', 'string 2', 3, ]
dummy_csv = 'c:\\temp\\out.csv'
with open(dummy_csv, 'w') as file:
    cw = csv.writer(file)
    cw.writerow(dummy_data)

这将写到c:\ temp \ out.csv:

"['list value 1', 2, 'list value 3', '']",string 1,string 2,3

从文件中读回来:

with open(dummy_csv) as file:
    cr = csv.reader(file)
    for row in cr:
        print(row[0])

...将列表值打印为单个文字字符串:

"['item 1', 2, 'item 3']"

如何干净利落地将此字符串转换回列表?

我提出的最好的方法是在检测并剥离方括号后使用csv库重新解析字符串。这比使用split(',')稍微好一点,因为它会更好地处理转义字符,但感觉很糟糕:

with open(temp_csv) as file:
    cr = csv.reader(file)
    for row in cr:
        for segment in row:
            if segment and segment[:1] == '[' and segment[-1:] == ']':
                for list_segment in csv.reader([segment.strip('[] ')]):
                    print([e.strip(" '""") for e in list_segment])

这将返回带有值的所需列表:

['item 1', '2', 'item 3']

是的,遗憾的是,数据必须以CSV格式保存到文件中;如果由我决定我会使用JSON,这不会是一个问题。

感谢您的帮助!

更新 我不相信这是一个重复的问题,因为我假设(并希望)在我忽略的csv库中有一些选项或参数。

1 个答案:

答案 0 :(得分:1)

您可以使用

import ast
your_string = "['item 1', 2, 'item 3']"
ast.literal_eval(your_string)

如果引用了所有字符串,则还可以使用

import json
your_string = u'["item 1", "2", "item 3"]'
json.loads(your_string)

或者你可以使用numpy

import numpy
your_string = "['item 1', 2, 'item 3']"
np.array(your_string)