Получение списков значений из CSV


У меня есть функция, которая принимает по заголовку столбца, и ответ.тело от urllib сделать (я уже знаю, что тело содержит текст/CSV-файла), и проходит через данные, чтобы создать список значений, которые должны быть возвращены. Мой вопрос к гуру: я написал это в наиболее эффективным способом? Можете ли вы предложить какие-либо улучшения?

def _get_values_from_csv(self, column_title, response_body):
    """retrieves specified values found in the csv body returned from GET
    @requires: csv
    @param column_title: the name of the column for which we'll build a list of return values.
    @param response_body: the raw GET output, which should contain the csv data
    @return: list of elements from the column specified.
    @note: the return values have duplicates removed. This could pose a problem, if you are looking for duplicates.
    I'm not sure how to deal with that issue."""
    dicts = [row for row in csv.DictReader(response_body.split("\r\n"))]
    results = {}
    for dic in dicts:
        for k, v in dic.iteritems():
            try:
                results[k] = results[k] + [v] #adds elements as list+list
            except: #first time through the iteritems loop.
                results[k] = [v]

    #one potential problem with this technique: handling duplicate rows
    #not sure what to do about it.
    return_list = list(set(results[column_title]))
    return_list.sort()
    return return_list


3128
9
задан 16 февраля 2011 в 07:02 Источник Поделиться
Комментарии
2 ответа

Вот короче функцию, которая делает то же самое. Он не создает списки для столбцов, которые вас не интересуют.

def _get_values_from_csv(self, column_title, response_body):
dicts = csv.DictReader(response_body.split("\r\n"))
return sorted(set(d[column_title] for d in dicts))

7
ответ дан 16 февраля 2011 в 07:02 Источник Поделиться

Мои предложения:

def _get_values_from_csv(self, column_title, response_body):
# collect results in a set to eliminate duplicates
results = set()

# iterate the DictReader directly
for dic in csv.DictReader(response_body.split("\r\n")):
# only add the single column we are interested in
results.add(dic[column_title])

# turn the set into a list and sort it
return_list = list(results)
return_list.sort()
return return_list

0
ответ дан 16 февраля 2011 в 07:02 Источник Поделиться