用于阅读器中行的Python csv阅读器-该代码中的一次性下划线表示什么?

问题描述 投票:0回答:2

我正在从csv文件读取数据。我得到的“行”是代表我正在经历的循环的变量,但是这里扔掉的“ _”是什么?

for row in csv_reader:
  _, Student.objects.get_or_create(
      first_name=row[0],
      last_name=row[1],
      email=row[2],
      organisation=row[3],
      enrolled=row[4],
      last_booking=row[5],
      credits_total=row[6],
      credits_balance=row[7],
      )

例如,此代码也适用:

for row in csv_reader:
  Student.objects.get_or_create(
    first_name=row[0],
    last_name=row[1],
    email=row[2],
    organisation=row[3],
    enrolled=row[4],
    last_booking=row[5],
    credits_total=row[6],
    credits_balance=row[7],
    )

所以我也可以问,为什么“ _”即使在第一位也出现在这里?

我在另一个问题的答案中找到了这个主意,但没有说明下划线的目的。

更新说明

所以看来,从另一篇文章中复制原始代码时,我犯了一个小错误。原始代码为:

  for row in csv_reader:
    _, result = Student.objects.get_or_create(...

现在,我看到this answer更有意义。该代码旨在解压缩get_or_create的RESULT并丢弃元组的一个值。我错误地没有将结果变量复制为代码的一部分。

python django csv
2个回答
2
投票

我感觉这里可能会有轻微的语法错误。

get_or_create()返回一个元组;对象和一个布尔值(如果已创建对象,则为true)。

下划线有时用于该元组中的元素之一(例如bool)

instance, _ = MyObject.objects.get_or_create()

所以_, Student.objects.get_or_create实际上是有效的python,我只是认为您可能缺少第二个变量来解压缩返回的元组。如果打印类型print(type(_)),它将返回"tuple",如果您输入print(_),则应该看到一个包含对象和布尔值的元组。

在_后面加上,使元组成为_,这就是为什么它没有给您错误的原因,如果删除,,它将抛出错误,而如果您执行_,instance,则将抛出一个错误。错误,因为如果要拆开整个元组,则需要= Student....


1
投票

_必须在代码块的前面定义,如果该代码没有产生语法错误。它可以一起在循环外部定义,并且可以是带有变量的“范围”问题。

为了给您一个如何使用它的怪异例子,我们可以在另一个循环中使用它,而只是“捕获”该变量而对其不执行任何操作:

d = {1:"A", 2:"B", 3:"C"}
for _, value in d.items():
    print(value)

输出:

A
B
C
© www.soinside.com 2019 - 2024. All rights reserved.