【问题标题】:Convert text file to JSON in Python在 Python 中将文本文件转换为 JSON
【发布时间】:2020-06-12 02:48:59
【问题描述】:

我有一个文本文件 (record.txt),其内容如下:

12-34,Doe,John:Art101,98:History201,56
56-78,Smith,Bob,bobsmith@email.com:Calculus300,45:Economics214,78:ECE415,84

电子邮件字段是可选的,因此可能会或可能不会包含每个人。

这就是 JSON 格式的样子:

[{
    "id": "12-34", "lastname": "Doe", "firstname": "John",
    "classes":[{
        "classname":"Art101", "grade":"98"},{
        "classname":"History201","grade":"56"}]
 },
 {
    "id": "56-78", "lastname": "Smith", "firstname": "Bob", 
    "email":"bobsmith@email.com,
    "classes":[{
        "classname":"Calculus300", "grade":"45"},{
        "classname":"Economics214","grade":"78"},
        "classname":"ECE415", "grade":"84"}]
 }]

我是 Python 和 JSON 的新手,所以我很难思考如何以电子邮件可以作为可选字段的方式转换内容,以及如何为每个人序列化类。经过多次尝试,我无法将数据转换为 JSON。

任何有关如何解决此问题的建议或意见将不胜感激。

提前致谢!

【问题讨论】:

  • 到目前为止您尝试过什么?给我们看一些代码!
  • 获取行并首先在: 上拆分,然后在, 上拆分每个元素。您可以使用len() 检查第一部分是否有 3 个或 4 个元素 - 如果 4 则有电子邮件。

标签: python json serialization


【解决方案1】:

我不确定你是如何尝试的。 读取每一行,根据冒号 (:) 拆分。 如果电子邮件的长度为 4 个进程,则用 (,) 拆分第 0 个索引。否则忽略。

希望这很清楚

【讨论】:

    【解决方案2】:

    : 上获取行和第一个拆分,然后在, 上拆分每个元素。您可以使用len() 检查第一部分是否有 3 或 4 个元素 - 如果 4 则有电子邮件。

    import json
    
    text = '''12-34,Doe,John:Art101,98:History201,56
    56-78,Smith,Bob,bobsmith@email.com:Calculus300,45:Economics214,78:ECE415,84'''
    
    all_data = []
    
    for line in text.split('\n'):
        line = line.strip()
        parts = line.split(':')
    
        data = parts[0].split(',')
        classes = parts[1:]
    
        item = {
            'id': data[0],
            'lastname': data[1],
            'firstname': data[2],
            'classes': [],
        }
    
        if len(data) > 3:
            item['email'] = data[3]
    
        for class_ in classes:
            name, grade = class_.split(',')
            item['classes'].append({'classname': name, 'grade': grade})
    
        all_data.append(item)
    
    print(json.dumps(all_data, indent=2))
    

    结果:

    [
      {
        "id": "12-34",
        "lastname": "Doe",
        "firstname": "John",
        "classes": [
          {
            "classname": "Art101",
            "grade": "98"
          },
          {
            "classname": "History201",
            "grade": "56"
          }
        ]
      },
      {
        "id": "56-78",
        "lastname": "Smith",
        "firstname": "Bob",
        "classes": [
          {
            "classname": "Calculus300",
            "grade": "45"
          },
          {
            "classname": "Economics214",
            "grade": "78"
          },
          {
            "classname": "ECE415",
            "grade": "84"
          }
        ],
        "email": "bobsmith@email.com"
      }
    ]
    

    【讨论】:

    • 抱歉回复晚了,但是如果"lastname" :data[1] 给我一个“列表索引超出范围”错误怎么办
    • 那么首先你可以使用print() 来检查你有什么排队。接下来您可以添加try/except 来捕获错误并跳过它。或者使用if len(data) > 1: 来检查索引是否存在。顺便说一句:您也可以使用if line.strip(): 仅在行不为空时运行代码。
    • if len(data)>1: 完美运行!我真的很感激帮助。谢谢!
    • if line.strip():是什么意思
    • line.strip() 删除空格、制表符、输入 - 所以你只得到行中的字符,或者如果没有其他字符则为空字符串。当您检查if line.strip(): 时,空字符串会给出False。当您检查if line.strip(): 时,非空字符串给出True - 这是检查行/字符串是否不为空的常用方法。 BTW:您也可以查看print( bool(line.strip()) ) 来查看。或print( bool(""), bool("text") )
    猜你喜欢
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多