2015-01-24 2 views
0

В основном, я пытаюсь сделать ввод (см. Ниже) и преобразовать формат в следующий вывод (см. Ниже). Результат - список словарей. Я играл с .split() и .strip(), но у меня все еще возникают проблемы с разделением IP-адреса с номером номера. (См мой код ниже)Python преобразует строку в список, а затем

вход:

"bromine ";" 00:23:AE:90:FA:C6 ";" 144.38.198.130";151 #(this is just one line in the file, there are several lines with this exact format) 

выход:

[{'ip': '144.38.198.130', 'mac': '00:23:AE:90:FA:C6', 'name': 'bromine', 'room': '151'}] #(again this would be just one of the lines) 

Мой код:

import sys 

my_list = [] 
file = sys.stdin 
for line in file: 
    # d = {} 
    line = line.strip('"') 
    line = line.split() 

    name = line[0] 
    macAddress = line[2] 
    ipAddress = line[4] 
    #roomNum = [?] 

    d={'ip': ipAddress, 'mac': macAddress, 'name': name, 'room': None} 
    my_list.append(d) 
    #print line 

print d 

Это выход я получаю: {» ip ':' 144.38.196.157 "; 119 ',' mac ': '00: 23: AE: 90: FB: 5B', 'name': 'telurium', 'room': None}

Закрыть, но не сигару, пытаясь отделить 119

ответ

2

Приведенное ниже описание удаляет двойные кавычки из line, затем разбивается на полуколоны, затем полосы ведут &, заканчивая пробелы из каждого поля в строке. Затем он извлекает поля для названных переменных, используя назначение кортежей.

#! /usr/bin/env python 

line = '"bromine ";" 00:23:AE:90:FA:C6 ";" 144.38.198.130";151' 
print line 

line = [s.strip() for s in line.replace('"', '').split(';')] 
print line 

name, macAddress, ipAddress, roomNum = line 
d = {'ip': ipAddress, 'mac': macAddress, 'name': name, 'room': roomNum} 

print d 

выход

"bromine ";" 00:23:AE:90:FA:C6 ";" 144.38.198.130";151 
['bromine', '00:23:AE:90:FA:C6', '144.38.198.130', '151'] 
{'ip': '144.38.198.130', 'mac': '00:23:AE:90:FA:C6', 'name': 'bromine', 'room': '151'} 

Следует отметить, что каждая линия, выходящая из вашего for line in file: закончится символами новой строки; мой код удаляет это вместе с другим пробелом с s.strip() в понимании списка. Невозможность удалить строки из строк ввода текстового файла может привести к таинственным &/или раздражающему поведению ...

+0

@Wrenzoe: С удовольствием! Пожалуйста, не стесняйтесь [принимать] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) мой ответ ... :) –

1

Try:

line.replace(';',' ').split() 

Split Strings with Multiple Delimiters?

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

0

Извлечение с помощью замены/полосы:

import sys 

my_list = [] 
f = sys.stdin 

for line in f: 
    line = line.split('";') 
    result = dict(
        zip(["name", "mac", "ip", "room"], 
        [field.replace('"', "").strip() for field in line])) 
    my_list.append(result) 

print my_list 

Извлечение используя регулярное выражение:

import sys 
import re 

my_list = [] 
f = sys.stdin 

pattern = r'"(\w*)\W*([\w:]*)\W*([\w\.]*)";(\w*)' 
for line in f: 
    result = dict(
     zip(["name", "mac", "ip", "room"], 
      re.match(pattern, line).groups())) 
    my_list.append(result) 

print my_list 

Выход:

[{'ip': '144.38.198.130', 'mac': '00:23:AE:90:FA:C6', 'name': 'bromine', 'room': '151'}, 
{'ip': '144.38.196.157', 'mac': '00:23:AE:90:FB:5B', 'name': 'tellurium', 'room': '119'}] 
+3

Regex не является решением всех проблем , и для вступительного вопроса, подобного этому, это слишком сложно. Не говоря уже о том, что эта схема значительно труднее читать, чем соответствующий код Python ... – sapi

0

Чтобы удалить 119, который предшествует ;, просто split в пол-двоеточия:

line.split(';') 

Return a list of the words in the string, using sep as the delimiter string.

В коде:

import sys 

my_list = [] 
file = sys.stdin 
for line in file: 
    # d = {} 
    line = line.strip('"') 
    line = line.split()[0] 
    name = line.split(';')[0] 

    macAddress = line[2] 
    ipAddress = line[4] 
    #roomNum = [?] 

    d={'ip': ipAddress, 'mac': macAddress, 'name': name, 'room': None} 
    my_list.append(d) 
    #print line 

print d 
0

После сохранения оцененный в переменной

import re 
input = '"a";"b";"c";"d"' 
keys = ['x','y','z','w'] 
inputlist = input.split(';') 
for x in range(0, len(inputlist)): 
    inputlist[x] = re.sub(r'"','',inputlist [x]) 
output = dict(zip(keys,inputlist))