【问题标题】:Return line of largest field in list of dictionaries text file with Python?用Python返回字典文本文件列表中最大字段的行?
【发布时间】:2021-03-10 14:32:04
【问题描述】:

我正在编写一个 Python 脚本。我需要从文本文件中返回包含最大“uid”字段的行。 例如,在下面的文本文件示例中:

{
    "uid": 683,
    "user_id": "2",
    "timestamp": datetime.datetime(2020, 5, 17, 16, 39, 54),
    "status": 1,
    "punch": 0,
}, {
    "uid": 684,
    "user_id": "4",
    "timestamp": datetime.datetime(2020, 5, 17, 16, 41, 20),
    "status": 1,
    "punch": 0,
}

返回文本文件例如:

{
    "uid": 684,
    "user_id": "4",
    "timestamp": datetime.datetime(2020, 5, 17, 16, 41, 20),
    "status": 1,
    "punch": 0,
}

【问题讨论】:

    标签: python python-3.x erpnext


    【解决方案1】:

    这是我的解决方案,我没有读取文本文件,而是使用字符串变量 text 中的文本。

    最终结果(具有最大 uid 的条目)包含在 max_entry 变量中。我将此结果作为字符串写入文本文件result.txt

    Try it online!

    import datetime
    
    text = """
    {
        "uid": 683,
        "user_id": "2",
        "timestamp": datetime.datetime(2020, 5, 17, 16, 39, 54),
        "status": 1,
        "punch": 0,
    }, {
        "uid": 684,
        "user_id": "4",
        "timestamp": datetime.datetime(2020, 5, 17, 16, 41, 20),
        "status": 1,
        "punch": 0,
    }
    """
    
    data = eval('[' + text + ']')
    max_entry = max(data, key = lambda e: e['uid'])
    print(max_entry)
    
    with open('result.txt', 'w', encoding = 'utf-8') as f:
        f.write(str(max_entry))
    

    输出:

    {'uid': 684, 'user_id': '4', 'timestamp': datetime.datetime(2020, 5, 17, 16, 41, 20), 'status': 1, 'punch': 0}
    

    【讨论】:

    • eval() 方法的使用真的很有趣,以前没见过
    • 这是一个非常优雅的解决方案
    【解决方案2】:

    您表明您的“文本文件”是一个字典列表。 所以你可以这样做:

    import datetime
    
    text_file = {
        "uid": 683,
        "user_id": "2",
        "timestamp": datetime.datetime(2020, 5, 17, 16, 39, 54),
        "status": 1,
        "punch": 0,
    }, {
        "uid": 684,
        "user_id": "4",
        "timestamp": datetime.datetime(2020, 5, 17, 16, 41, 20),
        "status": 1,
        "punch": 0,
    }
    
    def return_highest_ui_line(text_file):
        temp = []
        for i,sub_dict in enumerate(text_file):
            temp.append([sub_dict['uid'],i])
        return text_file[sorted(temp)[-1][1]]
    
    
    return_highest_ui_line(text_file)
    
    output:
    {'uid': 684,
     'user_id': '4',
     'timestamp': datetime.datetime(2020, 5, 17, 16, 41, 20),
     'status': 1,
     'punch': 0}
    
         
    

    【讨论】:

    • 我试过这个但我得到一个错误:TypeError: string indices must be integers
    • 我认为它是一个字典,我没有使用 eval()
    【解决方案3】:

    我通过以下方式解决了这个问题:

    import datetime
    with open('C:/Users/UI UX/Desktop/newss.txt') as infile:
        for line in infile:
            data = eval('[' + line + ']')
            max_entry = max(data, key=lambda e: e['uid'])
            print(max_entry)
    
            with open('result.txt', 'w', encoding='utf-8') as f:
                f.write(str(max_entry))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-24
      • 1970-01-01
      • 2023-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多