Прочитать структурированный файл в python - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть файл с данными, подобными этим:

[START]
Name  = Peter
Sex  = Male    

Age  = 34
Income[2020]  = 40000
Income[2019]  = 38500  
[END]

[START]
Name  = Maria
Sex  = Female    

Age  = 28
Income[2020]  = 43000
Income[2019]  = 42500 
Income[2018]  = 40000 
[END]

[START]
Name  = Jane
Sex  = Female    

Age  = 41
Income[2020]  = 60500
Income[2019]  = 57500 
Income[2018]  = 54000 
[END]

Я хочу прочитать эти данные в pandas фрейме данных, чтобы в конце он был похож на этот

Name   Sex        Age        Income[2020]   Income[2019]   Income[2018]
Peter  Male       34           40000          38500            NaN
Maria  Female     28           43000          42500            40000
Jane   Female     41           60500          57500            54000

До сих пор я не смог выяснить, является ли это стандартный формат файла данных (он имеет некоторые сходства с JSON, но все еще сильно отличается). Существует ли элегантный и быстрый способ считывания этих данных в информационный блок?

1 Ответ

3 голосов
/ 01 апреля 2020

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

Здесь [START] начинает новую запись, [END] заканчивает ее, и внутри записи у вас есть key = value строк. Вы можете легко создать собственный анализатор для генерации списка записей для передачи в pandas DataFrame:

inblock = False
fieldnames = []
data = []
for line in open(filename):
    if inblock:
        if line.strip() == '[END]':
            inblock = False
        elif '=' in line:
            k, v = (i.strip() for i in line.split('=', 1))
            record[k] = v
            if not k in fieldnames:
                fieldnames.append(k)
    else:
        if line.strip() == '[START]':
            inblock = True
            record = {}
            data.append(record)

df = pd.DataFrame(data, columns=fieldnames)

df, как и ожидалось:

    Name     Sex Age Income[2020] Income[2019] Income[2018]
0  Peter    Male  34        40000        38500          NaN
1  Maria  Female  28        43000        42500        40000
2   Jane  Female  41        60500        57500        54000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...