我正在学习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 = {}
?你知道吗
这个动作有名字吗?你知道吗
正如评论所指出的,第
modis[section] = this_section = {}
行是两行的缩写:但那需要更多的开箱货。你知道吗
前一行是
当变量
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
很微妙。基本上,它是用来检查错误的。程序的基本流程假定数据文件是一系列的节,每个节都以方括号中的节名开始。但是如果第一节没有节名呢?程序将第一个内部字典设置为外部字典,因此任何项目行都将直接放入外部字典。这样,即使没有内部字典,条目行仍有地方可去。如果第一个节确实有一个节名,那么这个初始行将不起任何作用,因为变量this_section
将立即成为一个新的空内部字典。不存在将modis
字典插入自身的情况。你知道吗另一种处理方法是创建一个初始的内部字典,使用空字符串或
None
值等空名称来保存任何不知名的初始部分。最后,程序可以检查该节是否被使用,如果没有就删除它。但这样会使用更多的代码行,看起来更复杂所使用的解决方案只添加了一行代码,而且外观简单,即使它的含义并不简单。你知道吗相关问题 更多 >
编程相关推荐