Разбор текстового файла на фрейм данных в python - PullRequest
0 голосов
/ 22 мая 2019

Я новичок в разборе в Python. Я хочу разобрать следующий тип текста

значение один = 5

значение два = 10

% текста здесь

значение три = 15

% текста

значение один = 12

значение два = 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 ]

1 голос
/ 22 мая 2019

Ваша проблема в том, что в одной строке вы можете иметь только одну из 'value one', 'value two' или 'value_three', поэтому в первой строке будет определена только переменная value_one, но вы попытаетесь использовать все три, следовательноошибка.

Строка должна добавляться только при наличии полной последовательности .Вы можете попытаться изменить свой код на:

def parse_file(filepath):
    data = []  
    with open(filepath, 'r') as file_object:
        row = {}                                # prepare an empty row
        for line in file_object:
            key, match = _parse_line(line)
            # search for keys in the line
            if key == 'value_one':
                value_one = match.group('value_one')
                value_one = int(value_one)
                if 'value one' in row:          # we always have a full row
                    data.append(row)            # append it to the data liest
                    row = {}                    # and reset it
                row['value one'] = value_one    # we have a match: store the value in row

            if key == 'value_two':
                value_two = match.group('value_two')
                value_two = int(value_two)
                if 'value two' in row:
                    data.append(row)
                    row = {}
                row['value two'] = value_two

            if key == 'value_three':
                value_three = match.group('value_three')
                value_three = int(value_three)
                if 'value three' in row:
                    data.append(row)
                    row = {}
                row['value three'] = value_three

        if row != {}:                      # do not forget the last row
            data.append(row)
        data = pd.DataFrame(data)
        return data

Я также удалил последнюю часть, так как ИМХО это больше не вопрос синтаксического анализа текстового файла для создания кадра данных, а просто обработка данных pandas.

0 голосов
/ 23 мая 2019

Вы можете попробовать что-то вроде этого:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...