У меня есть текстовый файл со строковыми объектами на каждой строке. Я могу перебирать файл строка за строкой. Но доступ к каждому объекту в отдельности дает мне ошибку.

Мои файлы выглядят следующим образом.

('19.04.17', '[{"fields": {"a": 5, "b": 1}, "tags": {"device": "PM" "}," series ": "q"}] ') ('19 .04.19', '[{"fields": {"a": 5, "b": 1}, "tags": {"device": "PM" "}," series ":" q "}] ') ('19 .04.21', '[{" fields ": {"a": 5, "b": 1}, "tags": {"device": "PM" "}," series ":" q "}] ')

Я могу прочитать строку файла

with open('data') as f:
      lines = f.readlines()

Это дает вывод в виде каждой строки. Когда я делаю type(lines), я получаю, но я хотел бы прочитать каждый объект отдельно от объекта строки. Например, obj1 = '19.04.17' и

obj2 = '[{"fields": {"a": 5, "b": 1}, "tags": {"device": "PM""}, "series": "q"}]'

Я пытался сделать json.loads(lines), но получаю, что он ожидает строку или буфер.

При выполнении type(lines) я получаю

введите «список»

-1
humble_pie 17 Апр 2019 в 16:37

2 ответа

Лучший ответ

В качестве альтернативы ответу @ DroidX86 вы можете использовать ast модуль как альтернатива json:

import ast

with open('data') as f:
    lines = [ast.literal_eval(line) for line in f]

Однако ast наиболее полезен для оценки типов данных, таких как кортежи, тогда как json более оптимизирован для анализа фактического json, который является более жестко ограниченным форматом. Вы определенно получаете лучшую производительность от json, чем ast:

python -m timeit -s 'import json; x = "{\"1\": 2}"' 'json.loads(x)'
100000 loops, best of 3: 2.09 usec per loop

python -m timeit -s 'import ast; x = "{\"1\": 2}"' 'ast.literal_eval(x)'
100000 loops, best of 3: 8.08 usec per loop

ast больше всего вам пригодится, когда вы пытаетесь оценить типы данных , которые не являются допустимыми в формате json.

2
C.Nivs 17 Апр 2019 в 13:50

Каждая строка может быть json. Но список, содержащий все строки, не

objects = []
with open('data') as f:
    for line in f:
        objects.append(json.loads(line))

print(objects)
2
rdas 17 Апр 2019 в 13:43