Как прочитать csv-файл, чтобы найти соответствующие значения в словаре на Python?

#python #csv #dictionary

Вопрос:

Я пытаюсь прочитать csv-файл, чтобы найти соответствующие значения в словаре. У меня есть два csv-файла. Я должен создать словарь с первым csv-файлом. Затем мне нужно прочитать другой файл csv, чтобы найти совпадающие или соответствующие значения словаря,который я создал с помощью первого файла csv,но я не могу создать словарь из второго файла csv, потому что во втором файле csv будет дубликат внутри него (MAC12, 4 и MAC12, 2).

Вот как выглядит первый csv-файл.

 Model #,Brand,Version
VB17,ASUS,14.0
AR51M,ALIEN WARE,15.5
MAC12,APPLE,13.7
XR55,ACER,17.1
 

Вот как выглядит второй csv-файл.

 Model #,Quantity
MAC12,4
AR51M,3
XR55,1
MAC12,2
 

Затем мне нужно, чтобы мои выходные данные отображали марку, количество и версию в том порядке, в котором они отображаются во втором csv-файле, например так:

 APPLE: 4 13.7
ALIEN WARE: 3 15.5
ACER: 1 17.1
APPLE: 2 13.7
 

Вот как выглядит мой код до сих пор:

 import csv

MODEL = 0
BRAND = 1
VERSION = 2 

def main():
    
    models = model_numbers("model.csv", MODEL)
    for i in models:
        print(i, models[i])

    with open("order.csv", ) as order_file:
        reader = csv.reader(order_file)
        next(reader)
        for key in models.keys():
            value = models[key]
            brand = value[0]
            quantity = value[1]

            print(f"{brand}: {quantity}")


def model_numbers(filename, key):

    models = {}
    with open(filename, "rt") as models_file:
        reader = csv.reader(models_file)
        next(reader)
        for key in reader:
            model = key[MODEL]
            brand_name = key[BRAND]
            version = key[VERSION]
            models[model] = [brand_name, version]
    
    return models 

if __name__ == "__main__":
    main()
 

Вот как выглядит мой текущий результат:

 VB17 ['ASUS', '14.0']
AR51M ['ALIEN WARE', '15.5']
MAC12 ['APPLE', '13.7']     
XR55 ['ACER', '17.1']       
ASUS: 14.0
ALIEN WARE: 15.5
APPLE: 13.7
ACER: 17.1
 

И это то, чего я хочу.

 VB17 ['ASUS', '14.0']
AR51M ['ALIEN WARE', '15.5']
MAC12 ['APPLE', '13.7']     
XR55 ['ACER', '17.1']
APPLE: 4 13.7
ALIEN WARE: 3 15.5
ACER: 1 17.1
APPLE: 2 13.7
 

Комментарии:

1. Почему APPLE количество 4, когда во втором файле у вас два MAC12: 4 и 2, что равно 6?

2. О, я вижу, у вас они разные, хотя это одна и та же версия.

Ответ №1:

Вот моя попытка использовать информацию о файлах и необходимых выходных данных, которые вы предоставили:

 import csv

def get_model_quantity():
    models = []
    with open("file_2.csv", "r") as f_in:
        reader = csv.reader(f_in, delimiter=",")
        next(reader)
        for row in reader:
            model = row[0]
            quantity = row[1]
            models.append((model, quantity))
    return models

def get_model_information():
    info = {}
    with open("file_1.csv", "r") as f_in:
        reader = csv.reader(f_in, delimiter=",")
        next(reader)
        for row in reader:
            model = row[0]
            brand = row[1]
            version = row[2]
            info[model] = {
                "brand": brand,
                "version": version
            }
    return info


model_quantity = get_model_quantity()
model_information = get_model_information()

for model, quantity in model_quantity:
    model_info = model_information[model]
    brand = model_info["brand"]
    version = model_info["version"]
    print(f"{brand}: {quantity} {version}")
 

Выход:

 APPLE: 4 13.7
ALIEN WARE: 3 15.5
ACER: 1 17.1
APPLE: 2 13.7