将csv转换成json多文档吗?

时间:2019-12-11 08:19:27

标签: python json csv

我使用Python有以下两个要求:

  1. 将csv转换为多文档json。
  2. 忽略“”或空对象。

已经提到了代码和csv。目前,我只获取json数组对象,但需要在多文档json中创建。

我的csv

_id,riderDetails.0.category,riderDetails.0.code,riderDetails.1.category,riderDetails.1.code
1111,re,remg,er,error
2111,we,were,ty,

代码

import csv
import json
def make_record(row):
    return  { 
    "_id" : row["_id"], 
    "riderDetails" : [
        {            
            "category" : row["riderDetails.0.category"], 
            "code" : row["riderDetails.0.code"],
        },
        {            
            "category" : row["riderDetails.1.category"] ,
            "code" : row["riderDetails.1.code"],
        }
    ]
}  


with open('N:/Exide/Mongo/rr22.csv', 'r', newline='') as csvfile:
     reader = csv.DictReader(csvfile, delimiter=',')

     with open('N:/Exide/Mongo/mm22.json', 'w') as jsonfile:       
       out = json.dumps([make_record(row) for row in reader])
       jsonfile.write(out)

代码输出

[{
    "_id": "1111",
    "riderDetails": [
        {
            "category": "re",
            "code": "remg"
        },
        {
            "category": "er",
            "code": "error"
        }
    ]
},
{
    "_id": "2111",
    "riderDetails": [
        {
            "category": "we",
            "code": "were"
        },
        {
            "category": "",
            "code": ""
        }
    ]
}]

预期产量

{
    "_id": "1111",
    "riderDetails": [
        {
            "category": "re",
            "code": "remg"
        },
        {
            "category": "er",
            "code": "error"
        }
    ]
}
{
    "_id": "2111",
    "riderDetails": [
        {
            "category": "we",
            "code": "were"
        }
    ]
}

有人可以帮助我实现预期的输出吗?

2 个答案:

答案 0 :(得分:0)

使用glob

import glob, os

pt = 'N:/Exide/Mongo/*.csv'

for file in glob.glob(pt):
    get_name = file.split("/")[-1].replace(".csv",".json")
    with open(file , 'r', newline='') as csvfile:
        reader = csv.DictReader(csvfile, delimiter=',')
        out = [make_record(row) for row in reader]

    saving_path = os.path.join('N:/Exide/Mongo/',get_name)
    with open(saving_path , 'w') as jsonfile:       
        json.dump(out , jsonfile)

由于您将字典列表写入文件中,因此得到[{},{}]

答案 1 :(得分:0)

问题中我的csv 文件中的数据不会产生显示的输出,但这可能是由于较小的发布错误,所以我将忽略它。

还请注意,您生成的文件不是严格有效的JSON格式文件-也许这就是术语“多文档json”的含义……

无论如何,您都可以通过修改make_record()函数来完成所需的工作,以便它“清理”记录并在返回记录之前删除所有空/缺失值。

这是分两个步骤完成的。

  1. 首先浏览riderDetails中的每个详细信息,并删除所有具有空值的键。
  2. 最后,再次遍历每个riderDetails并删除所有完全为空的详细信息(因为第一步删除了所有内容,或者正在读取的csv文件中未提供任何内容)。
import csv
import json

csv_inp = 'rr22.csv'
json_outp = 'mm22.json'

def make_record(row):
    # Reformat data is row.
    record = {
        "_id": row["_id"],
        "riderDetails": [
            {
                "category": row["riderDetails.0.category"],
                "code": row["riderDetails.0.code"],
            },
            {
                "category": row["riderDetails.1.category"],
                "code": row["riderDetails.1.code"],
            }
        ]
    }

    # Remove empty values from each riderDetail.
    record['riderDetails'] = [{key: value for key, value in riderDetail.items() if value}
                                for riderDetail in record['riderDetails']]

    # Remove completely empty riderDetails.
    record['riderDetails'] = [riderDetail for riderDetail in record['riderDetails']
                                if riderDetail]
    return record

with open(csv_inp, 'r', newline='') as csvfile, \
     open(json_outp, 'w') as jsonfile:

    for row in csv.DictReader(csvfile, delimiter=','):
        jsonfile.write(json.dumps(make_record(row), indent=4) + '\n')
#        jsonfile.write(json.dumps(make_record(row)) + '\n')