Нужно конвертировать эти строки из текстового файла в валидный json, чтобы извлечь из него каждую сущность - PullRequest
0 голосов
/ 04 октября 2019

Ниже приведены фактические строки из моего файла. В нем около 22 тыс. Таких строк.

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

***** Строки из файла *****

Gi: ACAT1#<>#Ti: Best Director#<>#Bp: 0#<>#Vt: award#<>#Xt: prize_normalized#<>#Cp: 0
Gi: ACAT10#<>#Ti: Best Screenplay#<>#Bp: 0#<>#Vt: award#<>#Xt: prize_normalized#<>#Cp: 0
Gi: ACAT11#<>#Ti: Best Score#<>#Bp: 0#<>#Vt: award#<>#Xt: prize_normalized#<>#Cp: 0

Из текстового файла ('test.txt'), содержащего эти файлы, я хочу прочитать каждую строку и получить значения атрибутов вроде "Ti" , "Gi", "Vt" ...

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

Как и сейчас, я заключил каждую строку с цветочными скобками '{}'.
А затем заменил разделитель '#<>#' на " , "

Теперь каждая строка выглядит примерно так:
******** После заключения в фигурные скобки и замены на ","*********

{Gi: ACAT1,Ti: Best Director,Bp: 0,Vt: award,Xt: prize_normalized,Cp: 0}
{Gi: ACAT10,Ti: Best Screenplay,Bp: 0,Vt: award,Xt: prize_normalized,Cp: 0}
{Gi: ACAT11,Ti: Best Score,Bp: 0,Vt: award,Xt: prize_normalized,Cp: 0}

Но все же эта строка не является допустимым json, поскольку объекты не являются String.

Итак, когда я выполняю итерациюкаждая строка и попытка загрузить содержимое json, выдает ошибку, поскольку очевидно, что это не Valid json без правильной строки.

****** Ниже приведен код ******

import json

with open("test.txt") as f:
     for line in f:
         a=json.loads(line)
         b=a.get('Vt')
         print(b)

Это приведет к ошибке

Так что не могли бы вы помочь мне в преобразовании каждогострока из текста в Valid json, чтобы я мог легко разобрать его?

******* Ожидаемый формат каждой строки ***********

{"Gi": "ACAT1","Ti": "Best Director","Bp": 0,"Vt": "award","Xt": "prize_normalized","Cp": 0}
{"Gi": "ACAT10","Ti": "Best Screenplay","Bp": 0,"Vt": "award","Xt": "prize_normalized","Cp": 0}
{"Gi": "ACAT11","Ti": "Best Score","Bp": 0,"Vt": "award","Xt": "prize_normalized","Cp": 0}

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

Ваш ответ высоко ценится. С уважением,

1 Ответ

0 голосов
/ 04 октября 2019

Вопрос : я считаю, что эти атрибуты можно легко получить, если я смогу преобразовать каждую строку в json.

Вы хотите, чтобы она былатип dict.

import io

DATA = """Gi: ACAT1#<>#Ti: Best Director#<>#Bp: 0#<>#Vt: award#<>#Xt: prize_normalized#<>#Cp: 0
Gi: ACAT10#<>#Ti: Best Screenplay#<>#Bp: 0#<>#Vt: award#<>#Xt: prize_normalized#<>#Cp: 0
Gi: ACAT11#<>#Ti: Best Score#<>#Bp: 0#<>#Vt: award#<>#Xt: prize_normalized#<>#Cp: 0"""

for line in io.StringIO(DATA):
    record = {}
    for k, v in (item.split(': ') for item in line.strip().split('#<>#')):
        try:
            record[k] = int(v)
        except ValueError:
            record[k] = v

    #print(record)
    print('Vt:{}, Bp:{}'.format(record.get('Vt'), record.get('Bp')))

Выход :

Vt:award, Bp:0
Vt:award, Bp:0
Vt:award, Bp:0
...