在python中将文本文件解析为数据框

时间:2019-05-22 17:56:19

标签: python parsing

我是python解析的新手。我想解析以下类型的文本

值一= 5

值2 = 10

此处有一些文字

值三= 15

%一些文字

值一= 12

值2 = 13

此处有一些文字

值三= 11 ..这继续 我想提取一个值。值二。和.value三个。并以表格格式排列它们进行处理。有关如何操作的任何想法

到目前为止,我尝试了以下方法。它给我一个错误:赋值之前引用了两个本地值

import re
import pandas as pd
val_dict = { 'value_one':re.compile(r'value one = (?P<value_one>.*)\n'),
           'value_two':re.compile(r'value two = (?P<value_two>.*)\n'),
           'value_three':re.compile(r'value three = (?P<value_three>.*)\n')}

def _parse_line(line):


    for key, val in val_dict.items():
        match = val.search(line)
        if match:
            return key, match
# if there are no matches
    return None, None


def parse_file(filepath):


    data = []  
    with open(filepath, 'r') as file_object:
        line = file_object.readline()
        while line:

            key, match = _parse_line(line)

            if key == 'value_one':
                value_one = match.group('value_one')
                value_one = int(value_one)

            if key == 'value_two':
                value_two = match.group('value_two')
                value_two = int(value_two)

            if key == 'value_three':
                value_three = match.group('value_three')
                value_three = int(value_three)

            row = {
                        'value one': value_one,
                        'value two': value_two,
                        'value three': value_three 
                    }
                # append the dictionary to the data list
            data.append(row)
            line = file_object.readline()


        data = pd.DataFrame(data)

        data.set_index(['value one', 'value two', 'value three'], inplace=True)

        data = data.groupby(level=data.index.names).first()

        data = data.apply(pd.to_numeric, errors='ignore')
        return data

if __name__ == '__main__':
    filepath = 'test3.txt'
    data = parse_file(filepath)

2 个答案:

答案 0 :(得分:1)

您的问题是,在一行上,您只能有naive_time.timestamp()'value one''value two'中的一个,因此在第一行上仅定义了变量'value_three',但是您尝试使用所有这三种方法,因此会出现错误。

只有在具有完整序列时,才应追加一行。您可以尝试将代码更改为:

value_one

我还删除了最后一部分,因为恕我直言,这不再是解析文本文件来构建数据框的问题,而仅仅是熊猫数据框的处理。

答案 1 :(得分:0)

您可以尝试以下操作:

import re
import pandas as pd

with open('text.txt') as fd:
    data = fd.read()

val_to_pattern = {
    'value_one': r'value one = (\d+)',
    'value_two': r'value two = (\d+)',
    'value_three': r'value three = (\d+)',
}

val_dict = {}
for key, patt in val_to_pattern.items():
    val_dict[key] = re.findall(patt, data)

df = pd.DataFrame.from_dict(val_dict)
print(df)

结果:

  value_one value_two value_three
0         5        10          15
1        12        13          11