Многострочный ввод в Python массивы


Я сколочу несколько строк на Python, чтобы прочитать в статистику за обслуживание (к HAProxy), и хранить их в массив (чтобы сделать некоторый анализ позже). Это в основном занимает многострочного вывода, и разбивает его на несколько подмассивов. Вот как я сделал это - кто может предложить улучшения для меня?

def build_array():
        services=[]
        for line in data.split('\n'):           # split out each line of raw input
                holding=[]                      # start a temp array
                for var in line.split(','):     # for each value append it to the temp array
                        holding.append(var)
                services.append(holding)        # append the temp array to the services array
        return services

Необработанные данные в формате:

data="""web,FRONTEND,,,0,0,4096,0,0,0,0,0,0,,,,,OPEN,,,,,,,,,1,2,0,,,,0,0,0,0,,,,0,0,0,0,0,0,,0,0,0,,,
    mysql,FRONTEND,,,0,0,4096,0,0,0,0,0,0,,,,,OPEN,,,,,,,,,1,3,0,,,,0,0,0,0,,,,,,,,,,,0,0,0,,,
    web-https,FRONTEND,,,0,0,4096,0,0,0,0,0,0,,,,,OPEN,,,,,,,,,1,4,0,,,,0,0,0,0,,,,,,,,,,,0,0,0,,,
    web,web2-NEW,0,0,0,0,,0,0,0,,0,,0,0,0,0,UP,1,0,1,0,0,19,0,,1,5,1,,0,,2,0,,0,L4OK,,0,0,0,0,0,0,0,0,,,,0,0,
    web,web1-OLD,0,0,0,0,,0,0,0,,0,,0,0,0,0,UP,1,1,0,0,0,19,0,,1,5,2,,0,,2,0,,0,L4OK,,0,0,0,0,0,0,0,0,,,,0,0,
    web,BACKEND,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,UP,1,1,1,,0,19,0,,1,5,0,,0,,1,0,,0,,,,0,0,0,0,0,0,,,,,0,0,"""


3648
1
задан 21 июня 2011 в 11:06 Источник Поделиться
Комментарии
3 ответа

Это похоже на КШМ. Вы, вероятно, лучше использовать модуль Python CSV-файл.

            holding=[]                      # start a temp array
for var in line.split(','): # for each value append it to the temp array
holding.append(var)
services.append(holding) # append the temp array to the services arra

Может быть записан как

services.append( line.split(',') )

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

4
ответ дан 21 июня 2011 в 04:06 Источник Поделиться

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

def build_array(data):
# ...whatever

Кроме того, вы не удалите пробелы из первого элемента в каждой строке - помните, что Python """ цитаты оставит отступов пробелы в строке (даже если они удаляются комментарии).

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

holding.append(var.strip())

2
ответ дан 21 июня 2011 в 03:06 Источник Поделиться

Я думаю, что библиотеки библиотеки numpy существует как раз для случаев использования такой. Это довольно хорошо известно, создана библиотека питона, которая обеспечивает численное функции в Python. Она имеет очень активное сообщество с частыми релизами. В пакете numpy, я бы просто сделать это:

from numpy import genfromtxt
from StringIO import StringIO

genfromtxt(StringIO(data), delimter=',', dtype=None)

Очень лаконичный и более читабельным. Гораздо легче поддерживать с меньшим количеством строк кода и, следовательно, меньшим количеством ошибок :)

Кроме того, я попытался исполнения кода и genfromtxt код и, похоже, для данной данные genfromtxt медленнее, чем код, чуть ли не на порядок, но думаю, выбрав тип данных столбцов в данных улучшит производительность genfromtxt немного.
Также, если вы можете дать характер анализа, который вы пытаетесь проанализировать, какие столбцы вы хотите, специально для этого анализа, код можно сделать намного быстрее.

И над всем этим, питона делает упор на читабельность, потому что время разработчика стоит дороже, чем процессорное время сегодня!

1
ответ дан 21 июня 2011 в 08:06 Источник Поделиться