2017-06-21 71 views
1

我在文件中有一系列类似的值。如何根据一个键对文件中的对象进行单独排序

{ 
    "canceled": false, 
    "complete_time": "2017-06-08T15:55:45.616942", 
    "create_time": "2017-06-08T15:55:44.370344", 
    "entity_list": [ 
    { 
     "entity_type": 2, 
     "uuid": "xxxxx" 
    }, 
    { 
     "entity_name": "", 
     "uuid": "xxxx" 
    } 
    ], 
    "last_updated_time": "2017-06-08T15:55:45.616942", 
    "progress_status": 3, 
    "request": { 
    "arg": { 
     "parent_task_uuid": "xxx", 
     "task_uuid": "xxxx", 
     "transition": 2, 
     "vm_uuid": "xxx" 
    }, 
    "method_name": """"" 
    }, 
    "response": { 
    "error_code": 0, 
    "error_detail": "", 
    "ret": {} 
    }, 
    "start_time": "2017-06-08T15:55:44.452703", 
    "uuid": "xxxxx" 
} 
{ 
    "canceled": false, 
    "complete_time": "2017-06-08T15:55:45.616942", 
    "create_time": "2017-06-08T15:55:44.370344", 
    "entity_list": [ 
    { 
     "entity_type": 2, 
     "uuid": "xxxxx" 
    }, 
    { 
     "entity_name": "", 
     "uuid": "xxxx" 
    } 
    ], 
    "last_updated_time": "2017-06-08T15:55:45.616942", 
    "progress_status": 3, 
    "request": { 
    "arg": { 
     "parent_task_uuid": "xxx", 
     "task_uuid": "xxxx", 
     "transition": 2, 
     "vm_uuid": "xxx" 
    }, 
    "method_name": """"" 
    }, 
    "response": { 
    "error_code": 0, 
    "error_detail": "", 
    "ret": {} 
    }, 
    "start_time": "2017-06-08T15:55:44.452703", 
    "uuid": "xxxxx" 
} 

我想根据'last_updated_field'对这些单独的块进行排序{}。如果它像一个JSON,我已经编写了代码在Python中工作,但由于这不是一个有效的JSON,我怎么能做到这一点。

while True: 
line = sys.stdin.readline() 
if not line: break 
line = line.strip() 
json_obj = json.loads(line) 
lines.append(json_obj) 

lines = sorted(lines, key=lambda k: k['last_updated_time'], reverse=True) 
+1

你必须在你的文件这样的吗?对象和列表中括号之间没有逗号? –

+0

是的。对象和括号之间没有逗号。 – HighlyCurious

+0

关于这种可怕格式的* only *正面的事情是JSON不允许'} {'在字符串之外的组合,并且您可以通过添加括号并执行正则表达式来替代'} \ s * {'→'},{'。 –

回答

0

所以你的问题是不完全排序这些对象,你的最后一行应该工作得很好。问题是如何读取稍微格式不正确的json文件。这是一种简单的方式来消化文件。你可以谷歌的一个json包,更好地容忍格式偏差。

import json 
chunks = list() 
temp_lines = list() 
fp = open(FILE_PATH) 
for line in fp: 
    line = line.replace(r'"""""', r'"\""') 
    temp_lines.append(line) 
    if line.startswith('}'): 
     chunks.append(json.loads(''.join(temp_lines))) 
     temp_lines.clear() 
chunks = sorted(chunks, key=lambda x: x['last_updated_time'], reverse=True) 

要回到原来的可怕的格式,加上这两条线

chunks = '\n'.join([json.dumps(x, indent=4) for x in chunks]) 
chunks = chunks.replace(r'"\""', r'"""""') 
+0

谢谢,这工作正常,但它不保存结构。它打印一些像 {u'internal_task':False,u'parent_task_uuid':u'xxx',u'progress_status':3,u'complete_time':u'2017-05-23T19:01:54.914895',u' entity_list':[{u'uuid':u'xxxx',u'entity_name':u'UM-EX',u'entity_type':2},{u'uuid':u'cbb4a1fa-f393-4878-a7d3 -41bf3f519b3b',u'entity_name':u'xxx',u'entity_type':1}] ...} 我想保留与文件中相同的结构,但只对整个块进行排序{}。 – HighlyCurious

+0

为什么你会想要保存这样一个可怕的格式?要感谢你可以把它变成半理智的数据格式,并从中输出一些实际的json。 无论如何,请参阅我的编辑答案。 –

0

你可以尝试积累行,直到你形成一个有效的json。把所有这些jsons放在一个列表中,然后像你知道如何排序像

import sys 
all_jsons = [] 
current_lines = [] 
counter = 0 
while True: 
    line = sys.stdin.readline() 
    if not line: 
     break 
    line = line.strip() 
    current_lines.append(line) 
    nb_inc = line.count("{") 
    nb_dec = line.count("}") 
    counter += nb_inc 
    counter -= nb_dec 
    if counter == 0: 
     # We have met as many opening bracket as closing, this is a full json 
     all_jsons.append("\n".join(current_lines)) 
     current_lines = [] 

# sort your json files 

在这里,我积累的行,直到我遇到尽可能多的结束括号作为开放。在这种情况下,我将所有行加入到一个json格式的字符串中。

相关问题