Откройте текстовый файл и получите данные за двоеточием в python - PullRequest
1 голос
/ 22 марта 2019

Это мой список примеров для вас, который хранится в текстовом файле:

DEVICE:           Test

HW-RELEASE:       Test

SERIAL-NUMBER:    Test

MAC-ADDRESS:      Test

IP-ADDRESS:       Test

IP-NETMASK:       Test

INTRANET-ADDRESS: Test

INTRANETMASK:     Test

VERSION:          Test

NAME:             Test

CONFIG-STATUS:    Test

FIRMWARE-STATUS:  Test

HW-MASK:          Test

FEATUREWORD:      Test

REGISTERED-WORD:  Test

FEATURE-LIST:     Test

FEATURE-LIST:     Test

FEATURE-LIST:     Test

FEATURE-LIST:     Test

FEATURE-LIST:     Test

FEATURE-LIST:     Test

FEATURE-LIST:     Test

FEATURE-LIST:     Test

FEATURE-LIST:     Test

TIME:            Test

HTTP-PORT:       Test

HTTPS-PORT:       Test

TELNET-PORT:      Test

TELNET-SSL-PORT:  Test

SSH-PORT:         Test

SNMP-PORT:        Test

TFTP-PORT:        Test

LOCATION:         Test

COUNTRY-CODE:     Test

COMMENT:          Test

MYVPN:            Test

MYVPN-HOSTNAME:   Test

EXTENDED-NAME:    Test

Поэтому я хочу вывести данные за двоеточием, но всегда только одну строку.Я хочу определить эту строку с помощью словаря в сценарии, чтобы я мог, например, ввести только «Устройство», и оно дает мне имя после двоеточия, чтобы имена перед двоеточием действовали как ключ.Поскольку я делаю целое вместо этого, я только приблизительно знаю, что я придумал до сих пор.К сожалению, этот код не работает так, как мне хотелось бы:

data = {}

with open('C:/example/example/example/example/example.txt') as fh:
    for line in fh:
        key, value = line.strip().split(':', 1)
        data[key] = value

for x in data:
    print(x)

Вывод этого кода:

ValueError: недостаточно значений для распаковки (ожидается 2, получено 1)

Что я ожидаю, так это то, что когда я различаю что-то вроде:

x = data ["DEVICE"], оно должно вывести свое значение, которое безусловно "Test"

Ответы [ 4 ]

2 голосов
/ 22 марта 2019

Вы не пропускаете пустые строки.

Если приведенный вами пример верен между "записями", есть пустая строка, которую вы пытаетесь разделить:

try:

for line in fh:
   if line:
    key, value = line.strip().split(':', 1)
    data[key] = value
2 голосов
/ 22 марта 2019

Во-первых, не могли бы вы попробовать распечатать, что в line?

Если он соответствует ожиданиям (т. Е. Содержит DEVICE: Test), убедитесь, что пробельные символы обрабатываются следующим образом.

for line in fh:
    if line.strip(): # Ignore blank lines
        key, value = [x.strip() for x in line.strip().split(':', 1)]
        ...
1 голос
/ 22 марта 2019

Это один из вариантов:

item = 'DEVICE'

filepath = '/home/will/testing/stuff.txt'

with open(filepath) as f:
    data = f.read().splitlines()
    data = [line for line in data if line != '']
    data_dict = {line.split()[0][:-1]:line.split()[1] for line in data}

print(data_dict[item])
# Test
1 голос
/ 22 марта 2019

Ваша проблема заключается в формате вашего текстового файла.

Пустые строки между строками значения приводят к key, value = line.strip().split(':', 1) краху.Просто переформатируйте ваш текстовый файл или обработайте пустые строки соответственно.

...