Как изменить данные, отличные от json, в определенный формат в Python?

У меня есть входной файл, содержащий такие данные:

{
0/2 = [
"test_server_101:99904"
,"test_server_103:99907"
,"test_server_106:99906"
];
1/2 = [
"test_server_203:99906"
,"test_server_303:99902"
,"test_server_403:99906"
];
}

И я пытаюсь преобразовать это в...

{"test_server_101:99904": '0' ,"test_server_103:99907": '0' ,"test_server_106:99906": '0' "test_server_203:99906": '1' ,"test_server_303:99902": '1' ,"test_server_403:99906": '1' }

Поскольку я не могу контролировать ввод, и это неправильные данные JSON или неправильный словарь, поскольку ключ не имеет одинарных или двойных кавычек. Трудно обработать входные данные. До сих пор я пробовал приведенный ниже код, но он не работает согласно моим требованиям. Есть какие-нибудь предложения по этому поводу?

server_data = {}
with open('file.txt', 'r') as f:
  lines = f.readlines()
  print(lines) 

  for line in lines:
    parts = line.strip().split(" = ")
    print(parts)
    value_str = value_str.strip()[1:]
    for server in server_list:
      server_name, *port = server.strip().split(":")
      server_data[server_name] = key
print(server_data)

Я предполагаю, что есть и другие программы, которые могут читать этот файл... Вы знаете, как они это делают?

tdelaney 15.06.2024 00:44

О какой программе вы говорите, я не совсем уловил ваш вопрос. Вы предлагаете jsonlint?

VIPIN KUMAR 15.06.2024 00:59

@VIPINKUMAR Я думаю, вопрос в том, предположительно, какая-то другая программа использует этот формат (почему еще он создается таким образом?), так как именно это происходит?

juanpa.arrivillaga 15.06.2024 01:12

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

tdelaney 15.06.2024 02:44

Я понятия не имею о нисходящем и восходящем потоке этих данных.

VIPIN KUMAR 16.06.2024 06:32
Почему в 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
5
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать регулярное выражение для получения каждой группы и соответствующих серверов, затем удалить ненужные символы и разделить серверы в каждой группе на список:

import re

with open("file.txt", "r") as file:
    input_data = file.read()

matches = re.findall(r"(\d+)/\d+ = \[(.*?)\];", input_data, re.DOTALL)

output_dict = {}

for group, servers in matches:
    servers_list = servers.replace("\n", "").replace('"', "").split(",")

    for server in servers_list:
        output_dict[server] = group

print(output_dict)
{
    "test_server_101:99904": "0",
    "test_server_103:99907": "0",
    "test_server_106:99906": "0",
    "test_server_203:99906": "1",
    "test_server_303:99902": "1",
    "test_server_403:99906": "1",
}

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