了解字典的此用例

时间:2018-10-26 22:50:16

标签: python dictionary

我正在研究python教程,并遇到了字典的这种用法。不幸的是,关于到底发生了什么的解释为零,我很难弄清楚到底发生了什么。

要解析以下数据:

[TERRA]
dir  = /data/geospatial_19/ucfajlg/fire/Angola/MOD09
name = MODIS TERRA data
year = 2004
doy_start = 214
doy_end = 245
file_list = files/data/modis_files2a.txt

[AQUA]
dir  = /data/geospatial_19/ucfajlg/fire/Angola/MYD09
name = MODIS AQUA data
year = 2004
doy_start = 214
doy_end = 245
file_list = files/data/modis_files2b.txt

我们正在使用以下代码:

fp = open(r'c:\files_folder\modis.txt', 'r')

modis = {}
this_section = modis

for line in fp.readlines():
    line = line.strip()

    if len(line) and line[0] == '[' and line [-1] == ']':
        section = line[1:-1]
        modis[section] = this_section = {}

    elif len(line) and line.find("=") != -1:
        key,value = line.split("=")
        this_section[key.strip()] = value.strip()   

print modis

它在下面产生嵌套的字典,但是我不知道如何。

{'AQUA': {'doy_end': '245', 'doy_start': '214', 'name': 'MODIS AQUA data', 'year': '2004', 'file_list': 'files/data/modis_files2b.txt', 'dir': '/data/geospatial_19/ucfajlg/fire/Angola/MYD09'}, 'TERRA': {'doy_end': '245', 'doy_start': '214', 'name': 'MODIS TERRA data', 'year': '2004', 'file_list': 'files/data/modis_files2a.txt', 'dir': '/data/geospatial_19/ucfajlg/fire/Angola/MOD09'}}

这里发生了什么:modis[section] = this_section = {}

这个动作有名字吗?

1 个答案:

答案 0 :(得分:1)

正如评论所指出的那样,行modis[section] = this_section = {}是表示等效的两行的简短方法:

this_section = {}
modis[section] = this_section

但这可能需要更多的拆箱操作。

上一行是

section = line[1:-1]

,当变量line是以方括号开头和结尾的字符串时达到。换句话说,line保留数据文件中节的名称。然后section = line[1:-1]复制除方括号外的所有内容,因此变量section现在包含节的名称。 (例如,第一次执行时,结果为'TERRA'。)该变量的名称很不正确-应该将其命名为section_name,因为它实际上不是该部分,但我会继续使用给定的名称。

然后this_section = {}以空字典的形式创建一个新的空部分。之后,modis[section] = this_section立即将新的空字典放入较大的modis字典中,并将该节与节名相关联。这样'TERRA': {...}就会在结果字典中结束。

接下来的几行以elif len(line) and line.find("=") != -1:开头,然后填充内部字典,仍然命名为this_section。在从文件行中解析出键名和键值之后,文件部分中的每一行都一次放入该内部词典中。

这是程序的整体流程。将打开数据文件,并将结果字典modis创建为空字典。找到数据文件中的第一个部分名称,以便使用正确的部分名称创建内部的空字典。然后,将数据文件中该部分的每一行以所需的格式放入内部字典中。找到新的节名称后,将为该新节创建一个新的内部空字典。依此类推。

清楚吗?


您最近的评论询问fp = open(行之后的两行。语句modis = {}很清楚:它将整个字典创建为空,稍后再填充。

下一行this_section = modis很微妙。基本上,它用于错误检查。该程序的基本流程假设数据文件是一个节序列,每个节都以方括号中的节名开头。但是如果第一部分没有部分名称怎么办?该程序将第一个内部词典设置为 outer 词典,因此任何项目行都将直接放入外部词典中。这样,即使项目行不存在内部字典,也可以找到它们。如果第一节确实具有节名,则该初始行将无任何结果,因为变量this_section将立即成为新的空内部字典。 modis字典不会插入其自身。

处理该问题的另一种方法是创建一个初始内部词典,使用一个空名称(例如空字符串或None值)保存任何无名无名的初始节。然后,最后,程序可以检查是否使用了该部分,如果不删除,则可以将其删除。但这将使用更多的代码行,并且看起来也更加复杂-所使用的解决方案仅增加了一行代码,并且即使其含义并不简单,其外观也很简单。