2016-02-25 4 views
0

У меня есть json-файл, содержащий не менее 30 000 dicts. Его можно найти здесь:Ошибка при чтении из json-файла с несколькими dicts

http://openxcplatform.com.s3.amazonaws.com/traces/nyc/downtown-west.json

Я бичевал через Интернет и обнаружил, что это привело меня ближе к тому, что мне нужно, как мне нужно прочитать файл JSon один на один, вход в dicts как фактический dict в список:

with open("test.json") as data_file: 
    for x in data_file: 
     json.dumps(it.append(ast.literal_eval(x))) 

Я протестировал этот код, и он работал по большей части. Я тестировал с первых 2000 элементов, но, как только я проверить весь файл, я получаю эту ошибку:

File "converter.py", line 58, in <module> 
    if __name__ == "__main__": main() 
    File "converter.py", line 34, in main 
    json.dumps(it.append(ast.literal_eval(x))) 
    File "/usr/lib/python2.7/ast.py", line 80, in literal_eval 
    return _convert(node_or_string) 
    File "/usr/lib/python2.7/ast.py", line 63, in _convert 
    in zip(node.keys, node.values)) 
    File "/usr/lib/python2.7/ast.py", line 62, in <genexpr> 
    return dict((_convert(k), _convert(v)) for k, v 
    File "/usr/lib/python2.7/ast.py", line 79, in _convert 
    raise ValueError('malformed string') 
ValueError: malformed string 

Кто знает, почему это может происходить?

ответ

1

Вы не хотите использовать json.dumps, поскольку это преобразует dict в JSON. Вы делаете обратное - чтение JSON и преобразование в dict. Вы должны использовать json.loads() для этого:

it = [] 
failures = [] 

with open('you_file.json') as f: 
    for line in f: 
    try: 
     it.append(json.loads(line)) 
    except Exception: 
     failures.append(line) 

print 'Parsed {0} lines'.format(len(it)) 
print 'Failed {0} lines'.format(len(failures)) 
2

Во-первых, файл не JSON отформатирован, но JSON-lines.

Во-вторых, вы не хотите читать данные в формате JSON с ast.literal_eval, так как 1) очень небезопасно, 2) не является JSON парсер и выдает ошибку, когда он видит false или true.

Использование json.loads.

Смежные вопросы