【问题标题】:formatting .csv to json in python for individual key:value pairs在 python 中为单个键:值对将 .csv 格式化为 json
【发布时间】:2014-06-02 22:28:09
【问题描述】:

我正在尝试将单个键:值对从 csv 文档格式化为 JSON,并使用 json.dump()。虽然它在大多数情况下似乎运行良好,但它正在将我的整数转换为字符串(或者我可能需要将我的字符串转换为整数,这取决于它的查看方式),这是我不想要的,我也需要一个键:值对变成一个 JSON 数组。

我的代码目前基本上是这样的:

import csv
import json

csvfile = open('spreadsheet.csv', 'r')
jsonfile = open('fileTo.json', 'w') 

fieldnames = ("Id","name","TypeId","Type", "listHere")
reader = csv.DictReader( csvfile, fieldnames)

for row in reader:
    json.dump(row, jsonfile, sort_keys=True, indent=4, separators=(',', ':'))
    jsonfile.write(',')
    jsonfile.write('\n') 

其中我需要 Id 和 TypeId 为整数,listHere 为 JSON 数组。

目前的输出是这样的:

[
    {
        "name":"someName",
        "Id":"1",
        "Type":"someType",
        "TypeId":"2",
        "listHere":"someList"
    },
]

我需要的是:

 [
    {
        "name":"someName",
        "Id":1,
        "Type":"someType",
        "TypeId":2,
        "listHere":
        [
             "someList"
        ]       
    },
]

我通读了文档,但并没有真正了解如何使用包含数千个条目的电子表格来执行此操作。任何帮助将不胜感激。谢谢

【问题讨论】:

  • 当您使用 csv 模块读取项目时,它们始终显示为字符串值。
  • 感谢您的确认,这正是我的想法。

标签: python json csv


【解决方案1】:

csv 不支持列类型,虽然那很好。

以下代码(未经测试)对某些字段具有“修复”功能。在将每一行转换为 JSON 之前,一些字段的值会使用固定器函数进行转换。 int(field) 在这种情况下。

注意:虽然每一行都输出为 JSON,但整个列表不是。目前它有一个尾随的“,”。考虑使用json.iterencode() 将数据“流式传输”到 JSON 文件。

import csv
import json

csvfile = open('spreadsheet.csv', 'r')
jsonfile = open('fileTo.json', 'w') 

fieldnames = ("Id","name","TypeId","Type", "listHere")
fieldfixers = {
    'Id': int,
    'Type': int,
}
reader = csv.DictReader( csvfile, fieldnames)

for row in reader:
    for key,value in row.iteritems():
        ffunc = fieldfixers.get(key)
        if ffunc:
            row[key] = ffunc(value)
    json.dump(row, jsonfile, sort_keys=True, indent=4, separators=(',', ':'))
    jsonfile.write(',')
    jsonfile.write('\n') 

【讨论】:

  • 太棒了,感谢您的输入,解决了整数问题。将“listHere”转换为 JSON 数组的任何技巧?
  • @shavenwarthog 你可以用defaultdict 让它更干净一点,就像this pastebin 一样。我没有发布单独的答案,因为它只是一个清理。 (请注意,我省略了顶部的字段名/其他仪式。)
  • 感谢@syrion 的替代方法。我对python很陌生,所以还在学习所有的技巧。另外,我仍然不知道如何使我的最后一个字段显示为 JSON 数组...
  • @v3rbal 如果您的最后一列是单个字段中的列表——假设是用逗号分隔的整数列表,在 csv 中显示为"1,2,3"——您可以简单地创建一个转换器函数也为它。在我的 pastebin 中,您可以将 'listHere': lambda x: map(int, x.split(',')) 添加到 update 调用的字典参数中。
  • 啊,再次感谢@syrion,我知道这是如何工作的。非常感谢。
猜你喜欢
  • 2019-06-02
  • 2016-07-27
  • 1970-01-01
  • 2012-11-02
  • 2020-08-18
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 2018-03-06
相关资源
最近更新 更多