CSV解析,尝试理解一些代码

时间:2014-12-03 02:36:54

标签: python csv

这是代码

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文件的结构有关,但我并不完全确定。

1 个答案:

答案 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更详细地解释。