【问题标题】:Extract a string value of a key into another key/value in nested json and insert onto sql db将键的字符串值提取到嵌套 json 中的另一个键/值中并插入到 sql db
【发布时间】:2020-07-03 17:06:24
【问题描述】:

从嵌套的 json 文件中提取数据并插入到 sql db。 从关键细节我想获取下面的信息并插入到 sql db;

json文件数据和key/value示例如下

{
  "response": {
   "client_log": {
      "data": [
        {
          "city": "LONDON",
          "login": "AAAAAAAAAAAAAA",
          "state": "MC",
          "details": "Please find report below:\r\n\r\n------Report Information------\r\n\r\nEmail Id: user1@gmail.com\r\nServ Id: 1101ar12\r\nServ Num: 11111\r\nServ Details: Super-A\r\nState: LONDON\r\nCity: LONDON\r\n\r\n------Service Information------\r\n\r\nUser Name: John Clark\r\nMobile Number: 000111222\r\n\r\n------Reported Form------\r\n\r\nForm-1: zzzzz\r\nType: 111\r\n\r\nRemarks: Remarks 123.",
          "log_number": "1",
          "department": "Sales",
          "staff_id": "S123",
          "staff_name": "EricY",
          "timestamp": "2020-02-27 15:57:24"
        },
        {
          "city": "SINGAPORE",
          "login": "BBBBBBBBBBBBB",
          "state": "XX",
          "details": "Please find report below:\r\n\r\n------Report Information------\r\n\r\nEmail Id: user2@gmail.com\r\nServ Id: 903oa112\r\nServ Num: 12345\r\nServ Details: Super-B\r\nState: Sydney\r\nCity: Sydney\r\n\r\n------Service Information------\r\n\r\nUser Name: Peter\r\nMobile Number: 333444555\r\n\r\n------Reported Form------\r\n\r\nForm-2: xxxxxxxxxx\r\nType: 111\r\n\r\nRemarks: Remarks 890.",
          "log_number": "1",
          "department": "Eng",
          "staff_id": "S456",
          "staff_name": "YongG",
          "timestamp": "2020-02-27 15:57:24"
        }
      ],
      "query": "13"
    },
    "response_time": "0.723494",
    "transaction_id": "909122",
    "transaction_status": "OK",

  }
}

这是我用来提取数据并插入到 sql 中的 sn-p 代码

myfile = 'sample.json'

with open(myfile, 'r') as f:
   mydata = json.load(f)


sql = "INSERT INTO `table1` (`city`, `login`, `state`, `details`, `log_number`, `department`, `staff_id`, `staff_name`, `timestamp`) VALUES ( %(city)s, %(login)s, %(state)s, %(details)s, %(log_number)s, %(department)s, %(staff_id)s, %(staff_name)s, %(timestamp)s )"
cursor.executemany( sql, mydata['response']['client_log']['data'])

db.commit()
db.close()

从上面的代码中,我能够获取包含数据的关键详细信息,但是我得到的详细信息值以 1 个大块数据(sql 列详细信息)的形式呈现并插入到 sql 中...谢谢。

【问题讨论】:

    标签: python mysql json list dictionary


    【解决方案1】:

    您可以使用split() 和/或find() 方法轻松解析与details 键关联的str。逐行查看,假设: 左侧的所有内容都是键,而右侧的所有内容都是值。

    例如:

    import json
    
    myfile = 'sample.json'
    
    with open(myfile, 'r') as f:
       mydata = json.load(f)
    
    for entry in mydata['response']['client_log']['data']:
        parsed_details = {}
        for line in entry['details'].split('\r\n'):
            split = line.find(': ') # find() returns -1 if no match is found
            if split != -1:
                key = line[:split]
                value = line[split+2:] # 2 = len(': ')
                parsed_details[key] = value
        entry['parsed_details'] = parsed_details
    

    import json
    
    myfile = 'sample.json'
    
    with open(myfile, 'r') as f:
       mydata = json.load(f)
    
    for entry in mydata['response']['client_log']['data']:
        parsed_details = {}
        for line in entry['details'].split('\r\n'):
            try:
                key, value = line.split(': ', maxsplit=1)
                parsed_details[key] = value
            except ValueError:
                # This error is only thrown when the line doesn't have ': ' in it, 
                # which means there aren't enough values to unpack. It is safe to pass.
                pass
        entry['parsed_details'] = parsed_details
    

    dictmydata['response']['client_log']['data'] list 的每个项目现在有一个 parsed_details 键,其值是一个 dict 键和值对从 details 键中提取,你可以在此输出中查看:

    mydata
    Out[2]: 
    {'response': {'client_log': {'data': [{'city': 'LONDON',
         'login': 'AAAAAAAAAAAAAA',
         'state': 'MC',
         'details': 'Please find report below:\r\n\r\n------Report Information------\r\n\r\nEmail Id: user1@gmail.com\r\nServ Id: 1101ar12\r\nServ Num: 11111\r\nServ Details: Super-A\r\nState: LONDON\r\nCity: LONDON\r\n\r\n------Service Information------\r\n\r\nUser Name: John Clark\r\nMobile Number: 000111222\r\n\r\n------Reported Form------\r\n\r\nForm-1: zzzzz\r\nType: 111\r\n\r\nRemarks: Remarks 123.',
         'log_number': '1',
         'department': 'Sales',
         'staff_id': 'S123',
         'staff_name': 'EricY',
         'timestamp': '2020-02-27 15:57:24',
         'parsed_details': {'Email Id': 'user1@gmail.com',
          'Serv Id': '1101ar12',
          'Serv Num': '11111',
          'Serv Details': 'Super-A',
          'State': 'LONDON',
          'City': 'LONDON',
          'User Name': 'John Clark',
          'Mobile Number': '000111222',
          'Form-1': 'zzzzz',
          'Type': '111',
          'Remarks': 'Remarks 123.'}},
        {'city': 'SINGAPORE',
         'login': 'BBBBBBBBBBBBB',
         'state': 'XX',
         'details': 'Please find report below:\r\n\r\n------Report Information------\r\n\r\nEmail Id: user2@gmail.com\r\nServ Id: 903oa112\r\nServ Num: 12345\r\nServ Details: Super-B\r\nState: Sydney\r\nCity: Sydney\r\n\r\n------Service Information------\r\n\r\nUser Name: Peter\r\nMobile Number: 333444555\r\n\r\n------Reported Form------\r\n\r\nForm-2: xxxxxxxxxx\r\nType: 111\r\n\r\nRemarks: Remarks 890.',
         'log_number': '1',
         'department': 'Eng',
         'staff_id': 'S456',
         'staff_name': 'YongG',
         'timestamp': '2020-02-27 15:57:24',
         'parsed_details': {'Email Id': 'user2@gmail.com',
          'Serv Id': '903oa112',
          'Serv Num': '12345',
          'Serv Details': 'Super-B',
          'State': 'Sydney',
          'City': 'Sydney',
          'User Name': 'Peter',
          'Mobile Number': '333444555',
          'Form-2': 'xxxxxxxxxx',
          'Type': '111',
          'Remarks': 'Remarks 890.'}}],
       'query': '13'},
      'response_time': '0.723494',
      'transaction_id': '909122',
      'transaction_status': 'OK'}}
    

    我对 SQL 不是很熟悉,因此无法帮助您完成更新数据库的最后一步。

    【讨论】:

    • 您好,先生。谢谢..它看起来和我预期的一样..我还没有测试它..但我可以从上面的代码执行中知道如何将 parsed_details 添加到 mydata 中吗?....最初 mydata 只得到了详细信息并且没有t has parsed_details...我不明白那部分...如果你能告诉我很感激...
    • 不用担心。 parsed_details dictfor 循环底部的这一行中添加到mydataentry['parsed_details'] = parsed_detailsentry,在那一行,实际上是这个列表中的项目之一(这是一个dict):mydata['response']['client_log']['data']。因此,在for 循环的第一次迭代中修改entry 实际上是在修改mydata['response']['client_log']['data'][0]。当然,Python 会为您处理所有的内存管理,所以就这么简单。
    • 如果您不希望将这些解析详细信息放在自己单独的 dict 中(通过键 'parsed_details' 访问),您可以将它们直接添加到主 dict 以及所有其他键/values 将此行 (entry['parsed_details'] = parsed_details) 替换为:entry.update(parsed_details)
    • 嗨 @GordonAitchJay ... 是否可以将 parsed_details 键设置为下划线而不是空格,例如“Serv Id”到“Serv_Id”?
    • 嗨...在 parsed_details[key] = value 一行之后.....我添加 ---> parsed_details = { x.translate({32:'_'}) : y for x , y in parsed_details.items()}
    猜你喜欢
    • 1970-01-01
    • 2021-02-19
    • 2022-07-07
    • 2021-08-26
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 2021-04-01
    相关资源
    最近更新 更多