【问题标题】:Create a JSON per row of csv每行 csv 创建一个 JSON
【发布时间】:2017-10-16 17:34:05
【问题描述】:

我正在尝试弄清楚如何调整我的代码,以便它将 csv 的每一行写入它自己的 json,然后将其发布(我想如何尝试并循环遍历这个 json 文件每次都被覆盖是没有问题的)。

我的代码会根据需要生成结构化的 json,并将所有内容格式化为正确的数据类型,但我终其一生都无法弄清楚如何明智地循环遍历这一行。我有另一段代码可以实现第二个目标,但到目前为止我所有尝试组合它们的尝试都失败了。

对我如何循环这段代码有什么建议吗?

output = []
with open('Test3.csv') as csv_file:
    for a in csv.DictReader(csv_file):
        output.append({
            'OrderType': a['OrderType'],
            'OrderStatus': a['OrderStatus'],
            'OrderDateTime': a['OrderDateTime'],
            'SettlementDate': a['SettlementDate'],
            'MarketId': int(a['MarketId']),
            'OrderRoute': a['OrderRoute'],
            'OrderEntityType': a['OrderEntityType'],
            'SecurityId': a['SecurityId'],
            'CurrencyISOCode': a['CurrencyISOCode'],
            'Price': float(a['Price']),
            'TotalCommission': float(a['TotalCommission']),
            'SettlementStatus': a['SettlementStatus'],
            'QuantitySettled': float(a['QuantitySettled']),
            'SecurityOrderAllocations': {
                'Reference': a['Account Number'],
                'InvestmentCollectiveId': a['Account Number'],
                'NominalAmount': float(a['QuantitySettled']),
                'InvestmentAmount': float(a['InvestmentAmount']),
                'OpenNominal': float(a['QuantitySettled']),
                'SettlementCurrencyISOCode': 'USD',
                'SettlementAccountId': a['Account Number'],
                'OrderToSettlementExchangeRate': float('1'),
                'SettlementToPortfolioExchangeRate': float('1'),
                'OrderToPortfolioExchangeRate': float('1')
            }
        })

output_json = json.dumps(output)
with open ('Test.json', 'w') as f:
    f.write(output_json)

【问题讨论】:

  • 您希望将每一行写入不同的 JSON 文件,例如 test1.jsontest2.json 等?
  • 澄清一下 - 您的目标是将每个(当前附加的)字典保存为自己的 json 文件吗?
  • @Barmar 我很高兴将这些写入单个文件,或者将它们写入一个文件,该文件在发布后不断被覆盖 - 此代码当前设置为编写一个非常长的 json一次通话即可完成所有工作,而不是单独进行。
  • 如果你覆盖一个文件,它只会包含 CSV 的最后一行,那么为什么还要写所有其他行呢?
  • @Barmar 目标是在循环内包含一个对 API 的 POST 命令,以便在创建每个 json 后将其发布,然后创建并发布下一个等,直到底部的 csv 已被击中。

标签: python json python-3.x csv


【解决方案1】:

将您从 CSV 行创建的每个 dict 转换为 JSON,并将其写入文件(或将其 POST 到 URL,或任何您想要对其执行的操作)。

filenum = 1
with open('Test3.csv') as csv_file:
    for a in csv.DictReader(csv_file):
        json = json.dumps({
            'OrderType': a['OrderType'],
            'OrderStatus': a['OrderStatus'],
            'OrderDateTime': a['OrderDateTime'],
            'SettlementDate': a['SettlementDate'],
            'MarketId': int(a['MarketId']),
            'OrderRoute': a['OrderRoute'],
            'OrderEntityType': a['OrderEntityType'],
            'SecurityId': a['SecurityId'],
            'CurrencyISOCode': a['CurrencyISOCode'],
            'Price': float(a['Price']),
            'TotalCommission': float(a['TotalCommission']),
            'SettlementStatus': a['SettlementStatus'],
            'QuantitySettled': float(a['QuantitySettled']),
            'SecurityOrderAllocations': {
                'Reference': a['Account Number'],
                'InvestmentCollectiveId': a['Account Number'],
                'NominalAmount': float(a['QuantitySettled']),
                'InvestmentAmount': float(a['InvestmentAmount']),
                'OpenNominal': float(a['QuantitySettled']),
                'SettlementCurrencyISOCode': 'USD',
                'SettlementAccountId': a['Account Number'],
                'OrderToSettlementExchangeRate': float('1'),
                'SettlementToPortfolioExchangeRate': float('1'),
                'OrderToPortfolioExchangeRate': float('1')
            }
        })
        with open('Test' + str(filenum) + '.csv', 'w') as f:
            f.write(json)
    filenum += 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多