【问题标题】:CSV to JSON Python, Append Group Category to DictionaryCSV 到 JSON Python,将组类别附加到字典
【发布时间】:2014-04-16 18:17:56
【问题描述】:

我将用“我是一个使用糟糕的‘数据库’的菜鸟”作为我要说的序言。下面是我从我的 csv 输出的当前 json 输出的结构(下面的大纲)。基本上我要做的是将A列(信息技术)中的“组”附加到每个“数据”字典中,所以有一个“组”键:看起来像“组”的值:“信息技术”。然后第 5 行(Consumer Discretionary)下的所有内容都将具有“group”:“Consumer Discretionary”键、值。

{
  "stocks": [
    {
      "data": {
        "portfolio_average_weight": "5.985"
        "portfolio_total_return": "27.948"
      },
      "name": "Google Inc              "
    },
    {
      "data": {
        "portfolio_average_weight": "2.896",
        "portfolio_total_return": "24.292"
      },
      "name": "Mastercard Inc          "
    }]
}

Column A                           Column B         Column C        Column D

Information Technology           [blank cell]     [blank cell]     [blank cell]
[blank cell]                        Google            5.985           27.948
[blank cell]                     Mastercard           2.896           24.292
Consumer Discretionary           [blank cell]     [blank cell]     [blank cell]
[blank cell]                        xxxxxx         xxxxxxxxx          xxxxxxxxx

这是我当前的代码:

with open('test.csv', 'rU') as csvfile:
    lines = csv.reader(csvfile)
    for line in lines:
      elif line[0] == "" and line[1] != "":
        data = test_two_level(line)
        bottom_level = {
        "name": line[2],
        "data": data}

def test_two_level(line):
  data = {
      "portfolio_average_weight":line[3],
      "portfolio_total_return":line[4]}
  return data

我希望最终输出的样子:

{
  "stocks": [
    {
      "data": {
        "portfolio_average_weight": "5.985",
        "portfolio_total_return": "27.948",
        "group": "Information Technology"
      },
      "name": "Google Inc              "
    },
    {
      "data": {
        "portfolio_average_weight": "2.896",
        "portfolio_total_return": "24.292",
        "group": "Information Technology"
      },
      "name": "Mastercard Inc          "
    }]
}

下面是 csv:

Information Technology,,,
,Google Inc              ,5.985,27.948
,Mastercard Inc          ,2.896,24.292
Consumer Discretionary,,,

【问题讨论】:

  • 你能在读取 csv 到 json 的地方添加你的 python 代码吗?
  • 所以,字典已经存在,您想通读 csv 文件,并在字典的 "stocks" 列表中的条目中添加一个 "group" 键,其 'name' 值与 Column B 匹配的csv?
  • @martineau 我想将 A 列中的“组”添加到每只股票的“数据”字典中。所以理想情况下,它看起来像我在原始帖子底部添加的内容
  • 这就是我想要描述的。我看到的唯一问题是您为“名称”键显示的值与“B 列”下的值不完全匹配。您能否将正在读取的 csv 文件中的实际行发布到您的问题中?
  • @martineau 感谢您的耐心等待。我添加了有问题的 csv 行。

标签: python json csv dictionary


【解决方案1】:

我倾向于使用csv.DictReaderovercsv.reader,因为生成的代码更易于阅读,而且将每一行读入字典也使代码更加统一——尤其是在处理 JSON 对象时,这些对象本身通常由一个或多个字典组成。

import csv, json

with open('csv_to_json_test.csv', 'rb') as csvfile:
    csvfields = 'group', 'name', 'average_weight', 'total_return'
    reader = csv.DictReader(csvfile, fieldnames=csvfields)
    database = {}
    stocks = database['stocks'] = []  # initialize item to be parsed
    group = None
    for row in reader:
        if row['group']:
            group = row['group']
        else:
            stocks.append(
                {
                    'data': {
                        "portfolio_average_weight": row['average_weight'],
                        "portfolio_total_return": row['total_return']
                    },
                    'name': row['name'].rstrip(),  # strips trailing spaces
                    'group': group,
                }
            )

print 'database =',
print json.dumps(database, indent=4)

输出:

database = {
    "stocks": [
        {
            "group": "Information Technology",
            "data": {
                "portfolio_average_weight": "5.985",
                "portfolio_total_return": "27.948"
            },
            "name": "Google Inc"
        },
        {
            "group": "Information Technology",
            "data": {
                "portfolio_average_weight": "2.896",
                "portfolio_total_return": "24.292"
            },
            "name": "Mastercard Inc"
        }
    ]
}

【讨论】:

  • user3208620:如果这回答了您的问题,请考虑接受。如果您对此不熟悉,请参阅 SO FAQ 中的How does accepting an answer work?
  • 太棒了,谢谢@martineau!你这样做的方式是有道理的。感谢您抽出时间并耐心等待
  • 您可以对数据库结构进行的一个可能的改进是让stocks 成为列表字典,而不是具有公共键值(组)的字典列表。这将使它更接近地匹配您的 csv 文件的结构。
猜你喜欢
  • 2012-09-26
  • 2013-11-14
  • 1970-01-01
  • 2016-12-30
  • 2015-08-22
  • 2020-10-14
  • 1970-01-01
  • 2018-05-29
  • 2015-10-22
相关资源
最近更新 更多