Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 函数返回生成器对象_Python_Python 3.x_Dictionary - Fatal编程技术网

Python 函数返回生成器对象

Python 函数返回生成器对象,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,我试图用文件路径填充嵌套字典。首先,我解压缩集群中每个节点的文件包。然后我有一个函数,为每个zip文件创建一个字典。 这是针对Python3.8的 结构如下: ZipFile_2020-01-22-09-11-24_2020-01-22T14_56_54.905{'node':无,'xml':无,'perops':无,'access':无,'logs':无} 现在,我尝试查找并添加xml文件的路径。我可以找到文件ok,也可以填充嵌套字典,但它是: 处理这个问题的最好方法是什么?如何将生成器对象转

我试图用文件路径填充嵌套字典。首先,我解压缩集群中每个节点的文件包。然后我有一个函数,为每个zip文件创建一个字典。 这是针对Python3.8的

结构如下:
ZipFile_2020-01-22-09-11-24_2020-01-22T14_56_54.905{'node':无,'xml':无,'perops':无,'access':无,'logs':无}

现在,我尝试查找并添加xml文件的路径。我可以找到文件ok,也可以填充嵌套字典,但它是:

处理这个问题的最好方法是什么?如何将生成器对象转换为文件路径

以下是函数:

def nodefile():
    supportzips = {}.fromkeys(list((filter(lambda x: os.path.isdir(x), os.listdir('.')))),{}.fromkeys(list(['node','xml','perops','access','logs'])))
    for k,v in supportzips.items():
        supportzips[k]['xml'] = glob.iglob('./**/application-properties/application.xml')
    return supportzips
输出:

Bitbucket_支持_2020-01-22-09-11-24_2020-01-22T14_56_54.905{'node':无,'xml':,'perops':无,'access':无,'logs':无}
Bitbucket_支持_2020-01-22-09-14-11_2020-01-22T14_56_49.965{'node':无,'xml':,'perops':无,'access':无,'logs':无}
Bitbucket_支持_2020-01-22-09-11-57_2020-01-22T14_56_53.231{'node':无,'xml':,'perops':无,'access':无,'logs':无}
Bitbucket_支持_2020-01-22-09-12-49_2020-01-22T14_56_51.505{'node':无,'xml':,'perops':无,'access':无,'logs':无}
```
应该以一种内存有效的方式使用
glob.iglob()
函数,即在需要求值之前,它不会在内存中创建数据。从文件中:

返回一个迭代器,该迭代器生成与glob()相同的值,而实际上不同时存储所有值

如果对
iglob
的调用真正需要的是单个文件,那么最好使用
glob
,它返回匹配项的
列表,或者通过将生成器包含在
列表
元组
构造函数中来强制对其求值

#部队评估
supportzips[k]['xml']=tuple(glob.iglob('./**/application-properties/application.xml'))[-1]
#改用glob
supportzips[k]['xml']=glob.glob('./**/application-properties/application.xml')[-1]

iglob
中的
i
表示您需要迭代器而不是列表。如果您想立即使用迭代器,只需在一个不相关的注释上使用
glob.glob
,六个月后您会因为这样编写函数而痛恨自己。考虑把它拆装成几行代码,当不可避免的出错时,这两个代码更容易调试。两个代码> IGLUBLE()和代码>(和<代码> GULL()/代码>)有效地返回多个东西,所以不清楚为什么你期望它们返回到一个项目(一个XML文件的路径)。(过滤器(os.path.isdir、os.listdir('.')、dict.fromkeys(['node'、'xml'、'perops'、'access'、'logs']))
相当于你函数的第一行,但它更简短,更容易阅读。感谢大家的建议和信息。我会尝试清理一下。谢谢你的信息。这对我来说很有用。唯一的问题是我有相同的文件。不客气。别忘了选择解决你问题的答案当前位置做一个有良好基础的斯塔克沃夫社区公民是你的责任,没有人能代替你做到这一点。谢谢。