以python读取结构化文件

问题描述 投票:-1回答:1

我有一个文件,其数据与此类似:

[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有一些相似之处,但仍然非常不同)。是否有一种优雅而又快速的方式将这些数据读取到数据帧?

python pandas dataframe
1个回答
3
投票

优雅,我不知道,但是简单的方法,是的。 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
© www.soinside.com 2019 - 2024. All rights reserved.