Как получить доступ к элементам в списке словарей?
Я работаю с 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}")
Я не смог запустить вашу кодировку на своем компьютере, но есть много способов сделать то, что вы пытаетесь сделать. Я бы порекомендовал:
По возможности, я бы рекомендовал использовать 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'])