我正在使用我的应用程序中的CSV数据。 CSV文件中的一列包含一个名称。对于每一行,我需要检查该名称是否已经注册。如果是这样,我将存储一个变量并在以后使用它:
data = []
with open(path) as f:
reader = csv.reader(f)
for row in reader:
user = False
check_user = User.objects.filter(name=row[0])
if check_user:
user = check_user[0] # This will only return a single row so I want that one to be stored in the user variable instead of a list
data.append({'name': row[0], 'age': row[1], 'phone': row[2], 'user': user})
然后在我看来,我将执行以下操作:
{% for info in data %}
<td>{{ data.name }}</td>
<td>{% if data.user %}} {{ data.user.name }} {% else %} No user {% endif %}</td>
{% endfor %}
问题
一切正常。但是,问题在于CSV文件中的列表包含许多重复的名称。因此,我可以有1000条记录,只有10个不同的名称。但是在当前情况下,将有1000个查询到数据库。我正在尝试执行的操作(但我不确定如何执行)是以某种方式检查名称是否已经查找,如果已查找,则应使用先前的查询结果而不是执行新的查询。
澄清
在用户表中,我有爱丽丝,鲍勃,玛塔
在我的CSV文件中,我有如下记录:
name,age,phone
marta,30,12345
marta,30,12345
marta,30,12345
marta,30,12345
bob,22,33555
alice,55,1939
alice,55,1939
alice,55,1939
alice,55,1939
alice,55,1939
alice,55,1939
alice,55,1939
alice,55,1939
alice,55,1939
alice,55,1939
alice,55,1939
alice,55,1939
在上述情况下,我只有三个唯一的名称,因此我只想对数据库进行3个不同的查询。在我当前的设置中,每一行都会导致查询的浪费,这是浪费资源的(而且CSV文件很大,并且有很多重复的名称,这使情况更加复杂)。
答案 0 :(得分:1)
您可以使用numpy执行以下操作
使用numpy加载csv文件
<input class="form-control" type="text" name="studentid" id="studentid" autocomplete="off" required value="<?php echo strtoupper($_POST['studentid']); ?>" />
询问numpy,从数据列中返回唯一的data = np.loadtxt(path)
names
names_column = data[:,0] # if the names are in 0th column
unique_names = np.unique(names_column,return_index=True)
将为您提供该列中唯一名称的索引,您可以将其用于进一步处理。
编辑
具体对于您粘贴的示例输入,您可以执行以下操作
return_index
输出如下:
data = np.genfromtxt('in_data',dtype=None,names=True,delimiter=',')
print np.unique(data['name'],return_index=True)
答案 1 :(得分:1)
data = []
with open(path) as f:
reader = csv.reader(f)
for row in reader:
...
data.append({'name': row[0], 'age': row[1], 'phone': row[2], 'user': user})
将整个CSV加载到Python列表中时,应尝试将list
转换为set
;一组仅包含唯一值。您随时可以转换回列表。
data_set = set(data)
unique_data_list = list(data_set)
在模板中,
{% for info in unique_data_list %}
<td>{{ info.name }}</td>
<td>{% if info.user %}} {{ info.user.name }} {% else %} No user {% endif %}</td>
{% endfor %}