Как получить доступ к элементам в списке словарей?

Я работаю с CSV-файлом, который выглядит следующим образом:

POS,Transaction id,Product,Quantity,Customer,Date
1,E100,TV,1,Test Customer,9/19/2022
2,E100,Laptop,3,Test Customer,9/20/2022
3,E200,TV,1,Test Customer,9/21/2022
4,E300,Smartphone,2,Test Customer,9/22/2022
5,E300,Laptop,5,New Customer,9/23/2022
6,E300,TV,1,New Customer,9/23/2022
7,E400,TV,2,ABC,9/24/2022
8,E500,Smartwatch,4,ABC,9/25/2022

Для того, чтобы выхватить из него элементы, это превращает каждую строку в вызываемую строку путем присваивания:

with open(obj.file_name.path, 'r') as f:
                rdr = csv.DictReader(f)
                for row in rdr:
                    pos = row['POS']
                    product = row['Product']
                    transaction_id = row['Transaction id']
                    quantity = row['Quantity']
                    customer = row['Customer']
                    date = row['Date']

                
                try:
                    product_obj = Product.objects.get(name__iexact=product)
                except Product.DoesNotExist:
                    product_obj = None
                

Например, для печати каждой строки из CSV я могу ввести:

pos, transaction_id, product, quantity, customer, transaction_id, date = row
print(row)

Приводит к такому выводу терминала:

file is being uploaded
{'POS': '1', 'Transaction id': 'E100', 'Product': 'TV', 'Quantity': '1', 'Customer': 'Test Customer', 'Date': '9/19/2022'}
{'POS': '2', 'Transaction id': 'E100', 'Product': 'Laptop', 'Quantity': '3', 'Customer': 'Test Customer', 'Date': '9/20/2022'}
{'POS': '3', 'Transaction id': 'E200', 'Product': 'TV', 'Quantity': '1', 'Customer': 'Test Customer', 'Date': '9/21/2022'}
{'POS': '4', 'Transaction id': 'E300', 'Product': 'Smartphone', 'Quantity': '2', 'Customer': 'Test Customer', 'Date': '9/22/2022'}
{'POS': '5', 'Transaction id': 'E300', 'Product': 'Laptop', 'Quantity': '5', 'Customer': 'New Customer', 'Date': '9/23/2022'}
{'POS': '6', 'Transaction id': 'E300', 'Product': 'TV', 'Quantity': '1', 'Customer': 'New Customer', 'Date': '9/23/2022'}
{'POS': '7', 'Transaction id': 'E400', 'Product': 'TV', 'Quantity': '2', 'Customer': 'ABC', 'Date': '9/24/2022'}
{'POS': '8', 'Transaction id': 'E500', 'Product': 'Smartwatch', 'Quantity': '4', 'Customer': 'ABC', 'Date': '9/25/2022'}

Итак, это полностью работает, но я не могу понять, как получить доступ к одному конкретному словарю скажем, я хочу получить доступ только к определенному словарю, содержащему POS: 1, или просмотреть все словари, содержащие продукт TV. Как бы я мог это сделать?

Редактирование:

Несмотря на возможность извлечения продукта, при использовании его в присваивании product_obj всегда возвращается None. Кто-нибудь знает, в чем может быть причина этого?

rdr = csv.DictReader(...) (вероятно) динамически создает записи по мере их считывания

Либо соберите их все в list() и проиндексируйте в нужной строке [index], либо break, когда найдете строку с нужным вам содержимым

for row in csv.DictReader(...):
    if row.get(search_key) == search_value:
        break  # or return from a function
raise ValueError(f"failed to find {search_key}")

Я не смог запустить вашу кодировку на своем компьютере, но есть много способов сделать то, что вы пытаетесь сделать. Я бы порекомендовал:

https://blog.finxter.com/how-to-filter-a-dictionary-in-python/#:~:text=The%20Most%20Pythonic%20Way%29%201%20Method%201%3A%20Simple,4%20Method%204%3A%20Filter%20By%20Dictionary%20Comprehension%20

По возможности, я бы рекомендовал использовать pandas.

import pandas as pd
file = "Your file path here"
df = pd.read_csv(file)

#To filter for 1
print(df[df['POS']==1])
#To filter for TV
print(df[df['Product']=='TV'])
Вернуться на верх