Запись данных расщепления Python - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть запись, как показано ниже:

29 16

A 1,2595034 0,82587254 0,7375044 1,1270138 -0,35065323 0,55985355 0,7200067 -0,889543 0,2300735 0,56767654 0,2789483 0,32296127 -0,6423197 0,26456305 -0,07363393 -1,0788593

B 1,2467299 0,78651106 0,4702038 1,204216 -0,5282698 0,13987103 0,5911153 -0,6729466 0,377103 0,34090135 0,3052503 0,028784657 -0,39129165 0,079238065 -0,29310825 -0,99383247

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

Вывод должен быть примерно таким: х = А, В

y = 1.2595034 0.82587254 0.7375044 1.1270138 -0.35065323 0.55985355 0.7200067 -0.889543 0.2300735 0.56767654 0.2789483 0.32296127 -0.6423197 0.26456305 -0.07363393 -1.0788593

1.2467299 0.78651106 0.4702038 1.204216 -0.5282698 0.13987103 0.5911153 -0.6729466 0.377103 0.34090135 0.3052503 0.028784657 -0.39129165 0.079238065 -0.29310825 -0.99383247

Я могу пренебречь первой строкой, используя следующий код:

f = open(fileName, 'r')
lines = f.readlines()[1:]

Теперь, как мне отделить остальные записи в Python?

Ответы [ 4 ]

0 голосов
/ 18 сентября 2018

Итак, вот мой дубль: D Полагаю, вы захотите также проанализировать числа?

def generate_kv(fileName):
    with open(fileName, 'r') as file:
        # ignore first line
        file.readline()
        for line in file:
            if '' == line.strip():
                # empty line
                continue
            values = line.split(' ')
            try:
                yield values[0], [float(x) for x in values[1:]]
            except ValueError:
                print(f'one of the elements was not a float: {line}')

if __name__ == '__main__':
    x = []
    y = []
    for key, value in generate_kv('sample.txt'):
        x.append(key)
        y.append(value)
    print(x)
    print(y)

предполагает, что значения в sample.txt выглядят так:

% cat sample.txt 
29 16

A 1.2595034 0.82587254 0.7375044 1.1270138 -0.35065323 0.55985355 0.7200067 -0.889543 0.2300735 0.56767654 0.2789483 0.32296127 -0.6423197 0.26456305 -0.07363393 -1.0788593

B 1.2467299 0.78651106 0.4702038 1.204216 -0.5282698 0.13987103 0.5911153 -0.6729466 0.377103 0.34090135 0.3052503 0.028784657 -0.39129165 0.079238065 -0.29310825 -0.99383247

и вывод:

% python sample.py
['A', 'B']
[[1.2595034, 0.82587254, 0.7375044, 1.1270138, -0.35065323, 0.55985355, 0.7200067, -0.889543, 0.2300735, 0.56767654, 0.2789483, 0.32296127, -0.6423197, 0.26456305, -0.07363393, -1.0788593], [1.2467299, 0.78651106, 0.4702038, 1.204216, -0.5282698, 0.13987103, 0.5911153, -0.6729466, 0.377103, 0.34090135, 0.3052503, 0.028784657, -0.39129165, 0.079238065, -0.29310825, -0.99383247]]

В качестве альтернативы, если вы хотите иметь словарь, выполните:

if __name__ == '__main__':
    print(dict(generate_kv('sample.txt')))

Это преобразует список в словарь и выдает:

{'A': [1.2595034, 0.82587254, 0.7375044, 1.1270138, -0.35065323, 0.55985355, 0.7200067, -0.889543, 0.2300735, 0.56767654, 0.2789483, 0.32296127, -0.6423197, 0.26456305, -0.07363393, -1.0788593], 'B': [1.2467299, 0.78651106, 0.4702038, 1.204216, -0.5282698, 0.13987103, 0.5911153, -0.6729466, 0.377103, 0.34090135, 0.3052503, 0.028784657, -0.39129165, 0.079238065, -0.29310825, -0.99383247]}
0 голосов
/ 18 сентября 2018

вы можете использовать этот скрипт, если ваш файл - текст

filename='file.text'
with open(filename) as f:
      data = f.readlines()
x=[data[0][0],data[1][0]]
y=[data[0][1:],data[1][1:]]
0 голосов
/ 18 сентября 2018

Если я правильно понял, вы хотите, чтобы числа собирались в списке.Один из способов сделать это:

import string

text = '''
29 16

A 1.2595034 0.82587254 0.7375044 1.1270138 -0.35065323 0.55985355 0.7200067 -0.889543 0.2300735 0.56767654 0.2789483 0.32296127 -0.6423197 0.26456305 -0.07363393 -1.0788593

B 1.2467299 0.78651106 0.4702038 1.204216 -0.5282698 0.13987103 0.5911153 -0.6729466 0.377103 0.34090135 0.3052503 0.028784657 -0.39129165 0.079238065 -0.29310825 -0.99383247
'''

lines = text.split('\n')
x = [
    line[1:].strip().split()
    for i, line in enumerate(lines)
    if line and line[0].lower() in string.ascii_letters]

Это создаст список списков, когда внешний список содержит A, B и т. Д., А внутренние списки содержат числа, связанные с A, B и т. Д.

Этот код предполагает, что вас интересуют строки, начинающиеся с любой отдельной буквы (без учета регистра).Для более сложных условий вам может потребоваться регулярные выражения .

Очевидно, что если ваш text находится в файле, вы можете заменить lines = ... на:

with open(filepath, 'r') as lines:
    x = ...

Кроме того, если элементы в x не должны быть разделены, а скорее в строке, вы можете изменить line[1:].strip().split() на line[1:].strip().

Вместо этого, если вы хотите, чтобы числакак float, а не строка, вы должны заменить line[1:].strip().split() на [float(value) for value in line[1:].strip().split()].

РЕДАКТИРОВАТЬ:

В качестве альтернативы line[1:].strip().split() вы можете сделать:

line.split(maxsplit=1)[1].split()

как предложено в другом ответе.Это будет лучше обобщать, если первый токен не будет одним символом.

0 голосов
/ 18 сентября 2018

Если вы счастливы хранить данные в словаре, вот что вы можете сделать:

records = dict()
with open(filename, 'r') as f:
    f.readline() # skip the first line
    for line in file:
        key, value = line.split(maxsplit=1)
        records[key] = value.split()

Структура records будет:

{
    'A': ['1.2595034', '0.82587254', '0.7375044', ... ]
    'B': ['1.2467299', '0.78651106', '0.4702038', ... ]
}

Что происходит

...