我正在研究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 = {}
?
这个动作有名字吗?
答案 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
值)保存任何无名无名的初始节。然后,最后,程序可以检查是否使用了该部分,如果不删除,则可以将其删除。但这将使用更多的代码行,并且看起来也更加复杂-所使用的解决方案仅增加了一行代码,并且即使其含义并不简单,其外观也很简单。