将两个CSV转换为一个json文件

问题描述 投票:0回答:1

这段代码在终端产生记录,但当我打开json时,它是空白的。谁能帮帮我?

import csv
import json

refcsvfile = open('referralsource.csv', 'r')
jsonfile = open('redrock.json', 'w')

concsvfile = open('contacts.csv', 'r')

reffieldnames = ("ReferralSource_Name","OrganizationType","PrimaryRelationshipManager","ReferralSourceStatus","RSContactSourceType"
)
confieldnames = ("ReferralSource_Name","OrganizationName","IsOrganizationContact","FirstName","Middle","LastName","Role","Line1","City","State","Zip","Phone","PhoneType","PhonePrimary","OkToLeaveVM","PhoneActive","E-mail","OkToSendEmail","ContactPrimaryRelationshipManager","IsPrimaryContact","ContactSourceType"
)

refreader = csv.DictReader( refcsvfile, reffieldnames)
conreader = csv.DictReader( concsvfile, confieldnames)

output=[];
refcount=0
for refrow in refreader:
    refrow['ReferralSourceContacts'] = []
    output.append(refrow)
    concsvfile.seek(0)
    for conrow in conreader:
        if(conrow["ReferralSource_Name"]==refrow["ReferralSource_Name"]):
            refrow['ReferralSourceContacts'].append(conrow)
            output.append(refrow)
    refcount = refcount +1
print(output)
json.dump(output, jsonfile,sort_keys=True)

我想让json显示出这样的结果。

{
    "ReferralSource_Name": "Demo Facility",
    "OrganizationType": "Hospital",
    "RSContactSourceType": "DirectInboundTelephone",
    "ReferralSourceStatus": "Active",
    "PrimaryRelationshipManager": "John Doe",

    },
    "ReferralSourceContacts": [
      {
        "IsOrganizationContact": true,
        "OrganizationName": "Demo Facility",
        "FirstName": "John",
        "LastName": "Smith",
        "Role": "Doctor",
        "Line1": "123 abc Street",
        "Zip": "44720",
        "City": "Canton",
        "State": "OH",
        "Phone": "555-555-555",
        "PhoneType": "Office",
        "PhonePrimary": "True",
        "PhoneActive": "True",
        "Email": "[email protected]",
        "OkToLeaveVm": true,
        "OkToSendEmail": true,
        "ContactSourceType": "DirectInboundTelephone"
        "ContactPrimaryRelationshipManager": "John Doe"
      }

        "IsOrganizationContact": true,
        "OrganizationName": "Test Facility",
        "FirstName": "Jane",
        "LastName": "Smith",
        "Role": "Doctor",
        "Line1": "123 abc Street",
        "Zip": "44720",
        "City": "Canton",
        "State": "OH",
        "Phone": "555-555-555",
        "PhoneType": "Office",
        "PhonePrimary": "True",
        "PhoneActive": "True",
        "Email": "[email protected]",
        "OkToLeaveVm": true,
        "OkToSendEmail": true,
        "ContactSourceType": "DirectInboundTelephone"
        "ContactPrimaryRelationshipManager": "John Doe"
      }
    ]

基本上,我有一个文件用于父实体推荐源(认为是公司),另一个csv用于联系人(认为他们是公司的人)。我需要将这两个文件合并成上述JSON文件进行导入。

python json csv
1个回答
0
投票

类似这样的东西应该可以用...

  • 使用 with 来管理文件。
  • 假设联系人列表不是很大,那么将其加载到内存中,而不是每行都寻找文件的起点,这样会更好。
  • 更妙的是,既然它已经在内存中了,我们可以使用一个 collections.defaultdict 来预分组,使得创建输出只需简单的dict查找。
import csv
import json
import collections

reffieldnames = (
    "ReferralSource_Name",
    "OrganizationType",
    "PrimaryRelationshipManager",
    "ReferralSourceStatus",
    "RSContactSourceType",
)
confieldnames = (
    "ReferralSource_Name",
    "OrganizationName",
    "IsOrganizationContact",
    "FirstName",
    "Middle",
    "LastName",
    "Role",
    "Line1",
    "City",
    "State",
    "Zip",
    "Phone",
    "PhoneType",
    "PhonePrimary",
    "OkToLeaveVM",
    "PhoneActive",
    "E-mail",
    "OkToSendEmail",
    "ContactPrimaryRelationshipManager",
    "IsPrimaryContact",
    "ContactSourceType",
)

# Read contacts into memory to avoid slow seek/re-read
with open("contacts.csv", "r") as concsvfile:
    conreader = csv.DictReader(concsvfile, confieldnames)
    con_rows = list(conreader)

# Group contacts by referrer for faster lookup
con_map = collections.defaultdict(list)
for con_row in con_rows:
    con_map[con_row["ReferralSource_Name"]].append(con_row)

with open("referralsource.csv", "r") as refcsvfile:
    output = []
    for refrow in csv.DictReader(refcsvfile, reffieldnames):
        refrow["ReferralSourceContacts"] = con_map[refrow["ReferralSource_Name"]]
        output.append(refrow)
    print("len(output):", len(output))

with open("redrock.json", "w") as jsonfile:
    json.dump(output, jsonfile, sort_keys=True)
© www.soinside.com 2019 - 2024. All rights reserved.