【问题标题】:read a csv with multiple values in one cell在一个单元格中读取具有多个值的 csv
【发布时间】:2021-11-19 23:55:41
【问题描述】:

我有这个 csv:

Type,ID,Value1,Value2,Name,Text
TypeA,1231,"value1,value2,value3","value7,value8, value9",name1,
TypeA,2123,,,name2,textA
TypeA,4242,,,name3,
TypeA,5135,,,name4,
TypeA,2123,,,name5,
TypeA,7525,,,name6,
TypeA,6869,value4,,name7,
TypeB,9654,"value5, value6",,name8,textB
TypeB,3225,,,name9,
TypeB,6545,,value10,name10,

如果有多个值,我如何将其放入包含一些列表的字典中?我试过这个:

with open(csv_file,'r') as f:
    csv_list = [[val.strip() for val in r.split(",")] for r in f.readlines()]

(_, *header), *data = csv_list
print(csv_list)
csv_dict = {}
for row in data:
    key, *values = row

    if key not in csv_dict:
        csv_dict[key] = []

    csv_dict[key].append({key: value for key, value in zip(header, values)})

例如,我要csv_dict['TypeB'][0] 打印:

{'ID': '9654', 'Value1': ["value5, value6"], 'Value2': [], 'Name': 'name8', 'Text': 'textB'}

但它会打印:

{'ID': '9654', 'Value1': '"value5', 'Value2': 'value6"', 'Name': '', 'Text': 'name8'}

【问题讨论】:

标签: python list csv dictionary


【解决方案1】:

试试:

import csv

with open("your_file.csv", "r") as f_in:
    reader = csv.DictReader(f_in)
    data = list(reader)

    for row in data:
        row["Value1"] = [
            ss for s in row["Value1"].split(",") if (ss := s.strip())
        ]
        row["Value2"] = [
            ss for s in row["Value2"].split(",") if (ss := s.strip())
        ]


print(data)

打印:

[
    {
        "Type": "TypeA",
        "ID": "1231",
        "Value1": ["value1", "value2", "value3"],
        "Value2": ["value7", "value8", "value9"],
        "Name": "name1",
        "Text": "",
    },
    {
        "Type": "TypeA",
        "ID": "2123",
        "Value1": [],
        "Value2": [],
        "Name": "name2",
        "Text": "textA",
    },
    {
        "Type": "TypeA",
        "ID": "4242",
        "Value1": [],
        "Value2": [],
        "Name": "name3",
        "Text": "",
    },

...and so on.

编辑:没有:= 运算符:

import csv

with open("your_file.csv", "r") as f_in:
    reader = csv.DictReader(f_in)
    data = list(reader)

    for row in data:
        row["Value1"] = [
            s for s in map(str.strip, row["Value1"].split(",")) if s
        ]
        row["Value2"] = [
            s for s in map(str.strip, row["Value2"].split(",")) if s
        ]


print(data)

【讨论】:

  • 如何在python 3.7中写ss := s.strip()
  • @cy614 查看我的编辑。
【解决方案2】:

使用csv.DictReader 读取您的文件,而不是手动用逗号分隔行。 csv.DictReader 负责处理引号转义的逗号。

with open(csv_file, 'r') as f:
    reader = csv.DictReader(f)
    for data in reader:
        print(data)

它为文件中的每一行创建字典,引号中的字段读取为单个字符串,如下所示:

{'Type': 'TypeA', 'ID': '1231', 'Value1': 'value1,value2,value3', 'Value2': 'value7,value8, value9', 'Name': 'name1', 'Text': ''}

现在,由于您希望您的 Value1 项目是一个列表,如果值包含逗号,您可以用逗号分隔它。

csv_dict = {}
with open(csv_file, 'r') as f:
    reader = csv.DictReader(f)
    for data in reader:
        # Overwrite with split result if data["Value1"] is not an empty string
        # Else, make an empty list
        data["Value1"] = data["Value1"].split(",") if data["Value1"] else []
        data["Value2"] = data["Value2"].split(",") if data["Value2"] else []

        if data["Type"] not in csv_dict:
            csv_dict[data["Type"]] = [data]
        else:
            csv_dict[data["Type"]].append(data)

现在,csv_dict["TypeB"][0] 是:

{'Type': 'TypeB',
 'ID': '9654',
 'Value1': ['value5', ' value6'],
 'Value2': [],
 'Name': 'name8',
 'Text': 'textB'}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    相关资源
    最近更新 更多