Почему я не могу перебирать строковые объекты построчно - PullRequest
0 голосов
/ 17 апреля 2019

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

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

('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) я получаю

введите 'list'

Ответы [ 2 ]

2 голосов
/ 17 апреля 2019

В качестве альтернативы ответу @ 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 будет наиболее полезным для вас при попытке оценить данные types , которые не являются действительными json, то естьваш случай здесь

2 голосов
/ 17 апреля 2019

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

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

print(objects)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...