这是代码
import csv
def csv_dict_reader(file_obj):
"""
read a CSV file using csv.DictReader
"""
reader = csv.DictReader(file_obj, delimiter=',')
for line in reader:
print(line['first_name']),
print(line['last_name']),
if __name__== "__main__":
with open("dummy.csv") as f_obj:
csv_dict_reader(f_obj)
我想尝试快速分解,看看我是否理解这是如何工作的。我们走了:
1)import csv引入了csv方法
2)我们定义了一个函数,它采用了' file_obj'作为其论点
3)reader变量调用csv中的一个名为" DictReadre"的函数,该函数随后从' file_obj'中获取参数。并指定一个'分隔符'
4)我对这个for循环感到困惑,为什么我们不必预先定义行?这条线是否已被定义为“读者”的一部分?
5)当谈到' 名称'时,我真的很困惑。和' 主要',这些与我们如何指定' file_obj'?我对如何最终指定' file_obj'同样感到困惑。到底;我一直在假设' f_obj'以某种方式设法填补这个角色。
- 编辑 -
太棒了,这对我来说开始变得更有意义了。所以,当我上课时,#39;调用DictReader(),我在变量' reader'中创建它的实例
也许我走得太远了,但是DictReader()类中的内容允许它确定像#last;'这样的字段的结构。或' first_name'?我假设它与CSV文件的结构有关,但我并不完全确定。
答案 0 :(得分:4)
1)import csv引入了csv方法
嗯,不完全;它带来了csv
模块。*
* ...其中包含csv.DictReader
类,其中包含您隐式调用的csv.DictReader.__next__
方法,但这里并不重要。 < / p>
2)我们定义一个函数,它将'file_obj'作为参数
完全。*
*从技术上讲,参数和参数之间或实际与形式参数/参数之间存在区别。你可能还不想学习。但是如果你这样做,形式参数会进入函数定义;实际参数在函数调用中进行。
3)reader变量调用csv中一个名为“DictReadre”的函数,该函数随后从'file_obj'中获取参数并指定'delimiter'
同样,不完全;它调用类 DictReader
。调用类构造该类的实例。参数的传递方式与函数调用相同。*您可以在the help中查看DictReader
所需的参数。
*实际上,构建一个类实际上调用了类的__new__
方法,然后(通常)调用了它的__init__
方法。但是,当你写新课时,这才是最重要的;当您刚刚使用课程时,您并不关心__new__
或__init__
。这就是文档显示的原因,例如class csv.DictReader(csvfile, fieldnames=None, restkey=None, restval=None, dialect='excel', *args, **kwds)
。
4)我对这个for循环感到困惑,为什么我们不必预先定义行?这条线是否已被定义为“读者”的一部分?
不,这正是for
语句的作用:每次循环时,line
都会被分配到reader
中的下一个值。 The tutorial更详细地解释了。
一个更简单的例子可能会有所帮助:
for a in [1, 2, 3]:
print(a)
这会将1
分配给a
,打印出1
,然后将2
分配给a
,打印出2
,然后将3
分配给a
,打印出3
,然后就完成了。
此外,您可能会对其他语言感到困惑,这些语言需要变量才能被声明才能使用。 Python不这样做;您可以在任何地方分配任何名称,如果没有具有该名称的变量,现在就可以。
5)当谈到'name'和'main'时,我真的很困惑
这是一个特殊情况,你必须尽早学习合理进步的东西。
相同的源代码文件可以用作脚本,在命令行上运行,也可以作为模块,由其他代码导入。区分两者的方法是检查__name__
。如果您作为脚本运行,它将是'__main__'
。如果你被其他一些脚本用作模块,它将是你模块的名称。
因此,在惯用的情况下,您定义了可能对其他人有用的所有公共类和函数以及常量,然后执行if __name__ == '__main__':
并将所有“顶级脚本”代码放在那里以便执行如果有人以脚本的形式运行你。
再次,the tutorial更详细地解释。