Преобразование txt файла в список словарей

Я пытаюсь преобразовать файл со строковыми словарями в список словарей. Файл можно найти здесь: https://github.com/szczor/sharing/blob/master/data.txt. Вот как я это делаю:

lista = []
with open(os.path.join(path_to_data, 'data.txt')) as filehandle:
    for line in filehandle:
        # remove linebreak which is the last character of the string
        currentPlace = line[:-1]

        # add item to the list
        lista.append(currentPlace)

Итак, у меня есть список, теперь с элементами, которые являются строками.

print(type(lista[0]))

Теперь пытаемся преобразовать эти строки в словари с помощью

lista = [json.loads(str(string.replace('\'','\"'))) for string in lista]

Но получить ошибку

    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

Я попробовал тот же метод с созданным вручную списком, и все сработало, но понятия не имею, почему он не работает с моим текстовым файлом.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
797
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

я не мог прокомментировать ваш вопрос из-за некоторых привилегий, пытаться

for line in filehandle.readlines(): #instead of just filehandle

Привет, спасибо за ваш комментарий, но получите ту же ошибку.

wychen 23.12.2020 20:10

Это должно помочь. ast.literal_eval() должен иметь возможность анализировать строки dict, подобные тем, что находятся в файле данных:

import ast


with open(os.path.join(path_to_data, 'data.txt')) as filehandle:
    lista = [
        ast.literal_eval(line.strip())
        for line
        in filehandle
    ]

Спасибо за ваш ответ, я получаю ValueError: «ValueError: неправильно сформированный узел или строка: объект <_ast.Name по адресу 0x00000210785710A0>»

wychen 23.12.2020 20:22
Ответ принят как подходящий

Вы можете использовать ast.literal_eval для этого:

import ast
with open(os.path.join(path_to_data, 'data.txt')) as fp:

    lines = fp.readlines()


# if there are irregularities, use a try/except to pass these (note, you may wish to use a logger in practice)    
output = []
for line in lines:
    try:
        output.append(ast.literal_eval(line))
    except ValueError:
        print("malformed string; skipping this line")
    except SyntaxError:
        print("looks like some encoding errors with this file...")

выход:

[{'Lines': '130',
  'Lon': 21.0082356,
  'VehicleNumber': '1000',
  'Time': '2020-12-23 14:19:31',
  'Lat': 52.207217,
  'Brigade': '2'},
 {'Lines': '213',
  'Lon': 21.1013111,
  'VehicleNumber': '1001',
  'Time': '2020-12-23 15:40:37',
  'Lat': 52.2230756,
  'Brigade': '2'},
 {'Lines': '130',
  'Lon': 21.003573,
  'VehicleNumber': '1002',
  'Time': '2020-12-23 15:40:39',
  'Lat': 52.2060591,
  'Brigade': '1'},
 {'Lines': '311',
  'Lon': 21.0807406,
  'VehicleNumber': '1003',
  'Time': '2020-12-23 15:40:35',
  'Lat': 52.2414656,
  'Brigade': '2'},
 {'Lines': '213',
  'Lon': 21.1746171,
  'VehicleNumber': '1004',
  'Time': '2020-12-23 15:40:24',
  'Lat': 52.186474,
  'Brigade': '3'},...

Спасибо за ваш ответ, вы использовали его в моем файле? Я получаю сообщение об ошибке: «ValueError: неправильно сформированный узел или строка: объект <_ast.Name по адресу 0x000001E4278689A0>».

wychen 23.12.2020 20:25

привет @wychen. Часть этого. Я могу воспроизвести ошибку, сейчас отладка

anon01 23.12.2020 20:27

в строке 23934 у вас есть какой-то забавный текст. вы можете обернуть попытку, кроме как избежать этого, я обновлю ответ

anon01 23.12.2020 20:31

Спасибо, @anon01, я загружал через API, и в какой-то момент что-то пошло не так, отсюда и этот странный текст, который на польском языке говорит, что что-то пошло не так.

wychen 23.12.2020 21:36

Вот как я бы подошел:

   f = open("data.txt", "r")
   my_list = []

   for x in f: #read the sheet line by line
      dict_x = eval(x) #convert each line to dict
      my_list.append(dict_x)

   f.close()

Кроме того, eval() также можно заменить на dict().

Другие вопросы по теме