Используя только встроенные модули Python, можно ли читать только указанный набор столбцов, чтобы добавить его в словарь Python? - PullRequest
0 голосов
/ 31 октября 2018

У меня есть имя заголовка столбца из серии массивных CSV-файлов с более чем 50 полями. Для всех файлов индекс нужного мне столбца не всегда одинаков.

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

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

Итак, давайте возьмем это как пример данных:

FOODS;CALS
"PIZZA";600
"PIZZA";600
"BURGERS";500
"PIZZA";600
"PASTA";400
"PIZZA";600
"SALAD";100
"CHICKEN WINGS";300
"PIZZA";600
"PIZZA";600

Результат, который я хочу:

food_dict = {'PIZZA': 6, 'PASTA': 1, 'BURGERS': 1, 'SALAD': 1, 'CHICKEN WINGS': 1}

Теперь предположим, что мне нужны данные только из столбца FOODS, и в этом случае я установил значение индекса в качестве переменной food_index.

Вот что я пробовал, проблема в том, что столбцы не всегда находятся в одном и том же месте индекса в разных файлах, поэтому это решение не будет работать:

from itertools import islice


with open(input_data_txt, "r") as file:
    # This enables skipping the header line.
    skipped = islice(file, 1, None)
    for i, line in enumerate(skipped, 2):

        try:
            food, cals = line.split(";")

        except ValueError:
            pass

food_dict = {}

if food not in food_dict:
    food_dict[food] = 1

else:
    food_dict[food] += 1

Это решение работает только для этого образца - но только если я заранее знаю местоположение столбцов - и опять же, напоминание, что у меня более 50 столбцов, а позиция индекса нужного столбца отличается между файлами.

Возможно ли это сделать? Опять же, только встроенные модули - без Pandas, Numpy или других подобных пакетов.

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Важной частью здесь является то, что вы не пропустите строку заголовка! Вам нужно split этой строки и найти индексы нужных вам столбцов! Поскольку вы знаете заголовки столбцов для необходимой вам информации, поместите их в список ссылок:

wanted_headers = ["FOODS", "RECYCLING"]

with open(input_data_txt, "r") as infile:
    header = infile.read().split(';')
    wanted_cols = [header.index(label) for label in wanted_headers if label in header]
    # wanted_cols is now a list of column numbers you want

    for line in infile.readlines():    # Iterate through remaining file
        fields = line.split(';')
        data = [fields[col] for col in wanted_cols]

Теперь у вас есть данные в том же порядке, что и ваши существующие заголовки; Вы можете сопоставить его или переставить по необходимости.

Это решает твою точку блокировки? Я оставил для вас множество реализаций ...

0 голосов
/ 31 октября 2018

Использование Counter и csv:

from collections import Counter
import csv

with open(filename) as f:
    reader = csv.reader(f)
    next(reader, None)  # skips header
    histogram = Counter(line[0] for line in reader)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...