Как читать массив в текстовом файле? - PullRequest
0 голосов
/ 20 июня 2019

Мне нужно прочитать эти строки из файла .txt:

Turn  60 Player  -1
board: [[ 0  0  0  0  1  2  0  6 12  0  1  0  0  5  5 21]]
action p-values: [0.0, 0.0, 0.0, 0.0, 0.6326530612244898, 0.3673469387755102, 0.0]
nn: legal moves:[4, 5]
nn: select: 4
nn: db_lookup  0 0 0 0 1 2 0 6 12 0 1 0
nn: scores: [127, 127, 127, 127, -4, -5]
nn: best move selected

Как извлечь число в p-значениях действия массива?

Мне нужно создать тот же массив.

Это моя отправная точка:

with open(match, 'r') as searchfile:
        for line in searchfile:
            if 'Turn' in line:
                line = next(searchfile)
                line = next(searchfile)
                if 'p-values' in line:
                    line.rstrip('\n')
                    fields = line.split(": ")
                    pvalues.append(fields[1])

Но если я пытаюсь напечатать значения, я получаю массив со строками внутри (включая \ n).Как я могу иметь в pvalues ​​и массиве с внутренними массивами float?

Спасибо

Ответы [ 3 ]

2 голосов
/ 20 июня 2019

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

import ast
pvalues=[]
with open('match', 'r') as searchfile:
        for line in searchfile:
            if 'Turn' in line:
                line = next(searchfile)
                line = next(searchfile)
                if 'p-values' in line:
                    line=line.rstrip('\n')
                    fields = line.split(": ")
                    pvalues.append(ast.literal_eval(fields[1]))
pvalues

Result:
[[0.0, 0.0, 0.0, 0.0, 0.6326530612244898, 0.3673469387755102, 0.0]]
1 голос
/ 20 июня 2019

Вы можете сначала разделить на основе :, а затем убрать символ новой строки \n, а затем использовать literal_eval для преобразования строки в список

from ast import literal_eval

with open(match, 'r') as searchfile:
    for line in searchfile:
        if 'Turn' in line:
            line = next(searchfile)
            line = next(searchfile)
            if 'p-values' in line:
                fields = line.split(": ")
                print (fields)
                pvalues = literal_eval(fields[1].strip('\n'))

print (pvalues)
# [0.0, 0.0, 0.0, 0.0, 0.6326530612244898, 0.3673469387755102, 0.0]
0 голосов
/ 20 июня 2019

Точно с функцией re.findall:

import re

with open('file.txt') as f:
    pvalues = []
    pat = re.compile(r'\d+\.?\d+')
    for line in f:
        if 'Turn' in line:
            next(f)
            line = next(f)
            if 'p-values' in line:
                num_str = line.strip().split(": ")[1]
                pvalues.append(list(map(float, pat.findall(num_str))))

print(pvalues)

Вывод (список списков с числами с плавающей запятой):

[[0.0, 0.0, 0.0, 0.0, 0.6326530612244898, 0.3673469387755102, 0.0]]
...