Основная проблема заключается в том, что рядом есть несколько столбцов.Поскольку и ключи, и значения содержат пробелы, вы не можете разделить их.Вместо этого необходимо сначала разделить столбцы, а затем проанализировать данные.
Если длина столбцов неизвестна
Используйте первую строку для определения длины столбцов.Разделяя столбцы, вы можете легко разделять ключи и значения в двоеточии.
Если размещение ключей стабильно, вы можете использовать, чтобы в первой строке были только ключи без пробелов.
lines = input_string.splitlines()
key_values = lines[0].split() # split first line into keys and values
column_keys = key_values[::2] # extract the keys by taking every second element
column_starts = [lines[0].find(key) for key in column_keys] # index of each key
Достигнув этой точки, действуйте так, как если бы длина столбцов была известна.
Если длина столбцов известна
Отдельностолбцы в их начальных индексах.
column_ends = column_starts[1:] + [None]
# separate all key: value lines
key_values = [
line[start:end]
# ordering is important - need to parse column-first for the next step
for start, end in zip(column_starts, column_ends)
for line in lines
]
Поскольку Sample
использует многострочное значение, мы не можем аккуратно разделить ключи от значений в двоеточии.Вместо этого мы должны отследить ранее увиденный ключ, чтобы вставить его для значений без ключа.
data = {}
for line in key_values:
if not line:
continue
# check if there is a key at the start of the line
if line[0] != ' ':
# insert key/value pairs
key, value = line.split(':', 1)
data[key.strip()] = value.strip()
else:
# append dangling values
value = line
data[key.strip()] += '\n' + value.strip()
Это дает вам словарь-ключ словарь строк:
{'Model': 'ARIMA',
'Dependent Variable': 'D.Sales of shampoo over a three year period',
'Date': '2018-09-24 13:20',
'No. Observations': '35',
'Df Model': '6',
'Df Residuals': '29',
'Converged': '1.0000',
'No. Iterations': '19.0000',
'AIC': '406.3399',
'BIC': '417.2273',
'Log-Likelihood': '-196.17',
'Scale': '1.0000',
'Method': 'css-mle',
'Sample': '02-01-1901\n12-01-1903',
'S.D. of innovations': '64.241',
'HQIC': '410.098'}
Если вам нужноЧтобы преобразовать значения в не-строки, я предлагаю явно преобразовать каждое поле.Вы можете использовать таблицу отправки для каждого ключа для определения преобразования.
import time
converters = {
'Model': str, 'Dependent Variable': str,
'Date': lambda field: time.strptime(field, '%Y-%m-%d %H:%M'),
'No. Observations': int, 'Df Model': int, 'Df Residuals': int,
'Converged': float, 'No. Iterations': float, 'AIC': float,
'BIC': float, 'Log-Likelihood': float, 'Scale': float,
'Method': str, 'Sample': str, 'S.D. of innovations': float,
'HQIC': float
}
converted_data = {key: converters[key](data[key]) for key in data}