【问题标题】:Retrieve JSON from CSV using python in desired format使用 python 以所需格式从 CSV 中检索 JSON
【发布时间】:2022-01-24 08:13:09
【问题描述】:

非常感谢,我一直热衷于收集一些关于从其相应输入中获取以下输出的见解。希望通过使用 python 脚本将表格转换为所需的格式,因为我必须在稍后阶段使用巨大的 CSV。任何意见都非常感谢。

输入 CSV:

reference mcc value currency
10000 5300 134.09 USD
10001 5651 128.95 USD
10002 5912 104.71 USD

使用的python代码:

from csv import DictReader
from itertools import groupby
from pprint import pprint
import json

with open('Test_bulk_transactions_data.csv') as csvfile:
    r = DictReader(csvfile, skipinitialspace=True)
    data = [dict(d) for d in r]

    group = []
    uniquekeys = []

    for k, g in groupby(data, lambda r: (r['reference'], r['mcc'])):
        group.append({
            "reference": k[0],
            "mcc": k[1],
            "amount": [{k:v for k, v in d.items() if k not in ['reference','mcc']} for d in list(g)]})
        uniquekeys.append(k)

print(json.dumps(group, indent = 3) + '}')

电流输出:

  {
   "reference": "10000",
   "mcc": "5300",
   "amount": [
    {
     "value": "134.09",
     "currency": "USD"
    }
   ]
  },
  {
   "reference": "10001",
   "mcc": "5651",
   "amount": [
    {
     "value": "128.95",
     "currency": "USD"
    }
   ]
  },
  {
   "reference": "10002",
   "mcc": "5912",
   "amount": [ 
    {
     "value": "104.71",
     "currency": "USD"
    }
   ]
  }

所需的输出 JSON:

  {
   "reference": "10000",
   "mcc": "5300",
   "amount": {
     "value": 134.09,
     "currency": "USD"
    }
  },
  {
   "reference": "10001",
   "mcc": "5651",
   "amount": {
     "value": 128.95,
     "currency": "USD"
    }
  },
  {
   "reference": "10002",
   "mcc": "5912",
   "amount": {
     "value": 104.71,
     "currency": "USD"
    }
  }
  • 重要提示: 金额不应落入 [],并且该值应作为数字输出而不是字符串。

【问题讨论】:

  • 请检查How to Ask。到目前为止,您尝试过什么以及您无法解决的具体问题是什么?您在打开/读取/解析 csv、文件、创建所需的数据结构、将其转储到 JSON 时遇到问题吗?
  • 我已经编辑了这个问题,希望现在它可以工作了吗? @buran

标签: python json python-3.x automation csvtojson


【解决方案1】:
import csv

csv_filepath =  "/home/mhs/test.csv"
 
output = []


with open(csv_filepath) as cd:
    csvReader = csv.DictReader(cd)
    for r in csvReader:
        r["amount"] = {"value": float(r.pop("value")), "currency": r.pop("currency")}
        output.append(r)

【讨论】:

    【解决方案2】:

    不依赖导入的模块,您可以这样做:

    J = []
    
    with open('input.csv') as csv:
        cols = next(csv).split()
        assert len(cols) == 4
        for row in csv:
            t = row.split()
            if len(t) == 4:
                J.append({cols[0]: t[0], cols[1]: t[1], "amount": {cols[2]: float(t[2]), cols[3]: t[3]}})
    
    
    print(J)
    

    【讨论】:

    • 嗨,我试过了,它给出了一个错误:'IndexError: list index out of range'
    • 您的输入文件可能包含空行。我将编辑代码以添加完整性检查。此外,在没有相反信息的情况下,此代码假定列是用空格分隔的
    • 嗨,我尝试了更新的代码,现在它给出了“AssertionError:”:)
    • 这是因为 csv 文件的第一行不包含 4 个空格分隔的标记。如果你能展示你的 csv 文件实际上是什么样子,你会好很多
    • 好的,我会努力解决的,谢谢大家的帮助 :)
    猜你喜欢
    • 2022-01-19
    • 2016-05-26
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多