了解字典的这个用例

2024-05-16 20:33:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习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 = {}?你知道吗

这个动作有名字吗?你知道吗


Tags: nametxtdatadirlinesectionfilesmodis
1条回答
网友
1楼 · 发布于 2024-05-16 20:33:03

正如评论所指出的,第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很微妙。基本上,它是用来检查错误的。程序的基本流程假定数据文件是一系列的节,每个节都以方括号中的节名开始。但是如果第一节没有节名呢?程序将第一个内部字典设置为外部字典,因此任何项目行都将直接放入外部字典。这样,即使没有内部字典,条目行仍有地方可去。如果第一个节确实有一个节名,那么这个初始行将不起任何作用,因为变量this_section将立即成为一个新的空内部字典。不存在将modis字典插入自身的情况。你知道吗

另一种处理方法是创建一个初始的内部字典,使用空字符串或None值等空名称来保存任何不知名的初始部分。最后,程序可以检查该节是否被使用,如果没有就删除它。但这样会使用更多的代码行,看起来更复杂所使用的解决方案只添加了一行代码,而且外观简单,即使它的含义并不简单。你知道吗

相关问题 更多 >