Python: CSV файл в словарь - PullRequest
       1

Python: CSV файл в словарь

0 голосов
/ 09 сентября 2018

Это мой csv-файл (import_inventory.csv):

ruby ,  rope ,  ruby  , gold coin ,  ruby  , axe

Простой текст. CSV-файл находится в той же папке, что и мой скрипт.

Я хочу открыть его, затем добавьте эти элементы в мой словарь "inv":

inv = {'rope': 1, 'torch': 6, 'gold coin': 42, 'dagger': 1}

Я должен использовать эту функцию по умолчанию и определить ее (Это мое упражнение):

def import_inventory(inventory, filename="import_inventory.csv"):

Далее мне нужно напечатать это так:

Inventory:
 count    item name
   ----------------
    45    gold coin
    12        arrow
     6        torch
     2       dagger
     1         rope
     1         ruby
    ----------------
  Total number of items: 67

У меня есть функция с именем "print_table", которая делает для меня нечто подобное. Это просто для того, чтобы вы знали, что проблема сейчас только в открытии CSV-файла и объединении его с существующим словарем "inv"

Заранее спасибо. Если что-то неясно, дайте мне знать!

Ответы [ 2 ]

0 голосов
/ 09 сентября 2018

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

from collections import defaultdict
from contextlib import suppress

def import_inventory(inventory, filename):
    _inventory = defaultdict(int)
    with open(filename, encoding="UTF_8") as stream:
        for line in stream:
            for item in line.split(","):
                stock = inventory.get(item.strip(), 0)
                with suppress(KeyError):
                    del(inventory[item.strip()])
                _inventory[item.strip()] += stock + 1
    return _inventory

Интерес defaultdict заключается в том, что вам не нужно проверять, присутствует ли ваш товар, прежде чем увеличивать запас. Python defaultdict сделает это за вас.

Функция запускается в три этапа:

  1. Получить текущий запас для прочитанного элемента. Инициализируйте его на 0, если для этого товара нет запасов.
  2. Удалите предмет из текущего инвентаря, чтобы получить текущий запас только один раз. Исключение Monitor KeyError с функцией suppress .
  3. Увеличить новый запас на _inventory (без проверки, если предмет уже присутствует).
0 голосов
/ 09 сентября 2018

Я думаю, что должен делать то, что вы хотите. Если элемент отсутствует в словаре, вы должны создать этот элемент со значением один. Во всех остальных случаях вам просто нужно добавить один.

   def import_inventory(inventory, filename="import_inventory.csv"):
        file = open(filename, 'r')
        data = file.readline().split(',')
        inv = inventory
        for item in data:
            item = item.strip()
            if item in inv:
                inv.update({item: inv[item]+1})
            else:
                inv.update({item: 1})
        return inv

    def print_table(inventory):
        inv = inventory
        count = 0
        print('{:>5} {:>15}'.format('count', 'item name'))
        print('---------------------')
        for item in inv:
            print('{:>5} {:>15}'.format(inv[item], item))
            count = count + inv[item]
        print('---------------------')
        print('Total number of items: ' + str(count))


    given_inventory = {'sword': 100, 'rope': 4}
    new_inventory = import_inventory(given_inventory)
    print_table(new_inventory)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...