根据时间戳对列表中的Json数据进行排序

时间:2017-07-03 06:52:04

标签: python json file caching lru

我正在加载数据(20个元素)加载到另一个文件...这里我想根据我在list元素中使用的时间戳对这20个元素进行排序。

import json
from collections import OrderedDict
import datetime
import os

if os.path.exists("qwerty.json"):
    record = json.load(open("qwerty.json", "r"), object_pairs_hook=OrderedDict)
else:
    record = OrderedDict({})

fo = open("foo.txt", "wb")
abc = list(record.items())[:20] 
print(abc)

command = ""
while command != 'exit':
    command = input('Enter a command(options: create,read,save): ')
    if command == "create":
        name = input('Enter name of the Student:')
        p = input('Student ID: ')
        a = input('Class: ')
        n = input('Marks: ')
        time = datetime.datetime.now().isoformat()

        record[name] = {'Student ID:': p, 'Class:': a, 'Marks': n, 'time': time }

    elif command == 'read':
        z = json.load(open("qwerty.json", "r"), object_pairs_hook=OrderedDict)
        print(z)

    elif command == 'save':
        json.dump(record, open('qwerty.json', "w"))

fo.close()

1 个答案:

答案 0 :(得分:4)

花絮:

由于您使用的是OrderedDict - 您的记录已按时间戳排序(说实话 - 它们不是,但记录订单已保留)。

您的代码唯一出现的意外行为 - 当您“创建”(覆盖)时,现有一名学生排队:

record[name] = {'Student ID:': p, 'Class:': a, 'Marks': n, 'time': time }

并且已经if name in record: - 订单被破坏了,所以你对排序的想法并不是没有意义的,但我认为,确保记录顺序比每次排序记录更好更合理

解决方法:

变量名后的方括号表示此对象是可订阅(例如,元组,列表,字典,字符串等等)。 Subscriptable 表示此对象至少实现__getitem__()方法(以及您的__setitem__()方法)。

第一种方法处理大小写,当你试图从可订阅的对象(通过索引/键/任何东西)和第二种方法 - 当你试图覆盖某些东西时。

我建议用自定义类实现这样的功能:

class OrderedTimeDict(OrderedDict):
    def __setitem__(self, key, value):
        if key in self:
            # if key is already exist - move it to the end
            self.move_to_end(key)
        # standard behaviour
        OrderedDict.__setitem__(self, key, value)

并且在你的代码中只使用这个有序字典而不是基本命令!

结论:

专业人士:无需对事情进行排序,因为我们保持了理想的秩序。

缺点:如果您已经拥有“无序”数据 - 您需要对其进行一次排序。

要按时间戳对有序字典进行排序,您可以使用此功能:

def sort_by_timestamp(dict):
    return OrderedDict(sorted(dict.items(), key=lambda get_time_stamp: get_time_stamp[1]['time']))

参考文献: