如何识别并正确解析由 Python 创建的 csv 数据中的列表
Posted
技术标签:
【中文标题】如何识别并正确解析由 Python 创建的 csv 数据中的列表【英文标题】:How to recognize and appropriately parse a list within csv data that was created by Python 【发布时间】:2017-10-08 19:30:15 【问题描述】:我正在使用 Python 在 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(',') 稍微好一点,因为它可以更好地处理转义字符,但感觉很hacky:
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 库中存在一些选项或参数。
【问题讨论】:
使用ast.literal_eval
模块。
@ManishGupta - 你是个传奇!请将其发布为答案,我会接受。我知道这会很简单。
Convert string representation of list to list in Python的可能重复
虽然您可以在这些情况下使用eval
或ast.literal_eval
将数据作为列表的字符串表示形式写入,但您可能应该考虑如何保存数据。如果你想保存数据结构,也许像 JSON 这样的东西更合适。 CSV 用于表格、数字/文本数据。您可能不想要列表文字的 csv。
@juanpa.arrivillaga 我同意,但是数据需要由使用 VBA 的同事解析。据我所知,VBA 中没有原生 JSON 支持。
【参考方案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)
【讨论】:
以上是关于如何识别并正确解析由 Python 创建的 csv 数据中的列表的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Python pandas 在 read_csv 期间识别不良记录?