繁体   English   中英

与传统循环相比,目录中文件列表理解的结果不同

[英]Different results for list comprehension of files in directory compared to traditional loop

我需要获取的所有文件是一个目录及其子目录。 我很好奇为什么我得到的结果与我认为应该是两个等效的python表达式不同的结果。 如果有人可以解释差异,那将是有帮助的。 并不是说我偏爱任何特定的方法,但我至少想知道如何为此编写一个列表理解。

这是给我所需结果的循环表达式:

result = []
for dirpath,subdir,files in os.walk(directory):
    for filename in files:
        if '.nc' in filename:
            result.append(filename)

因此,在我的情况下,结果列表的长度为1533,这是正确的数字。 现在使用我认为等效的列表理解将是:

result = [filename for filename in files if '.nc' in filename for dirpath,subdir,files in os.walk(directory)]

该结果列表的长度为2480,其原因是其中包含重复的文件。 为什么这个表达不等于上面的表达? 我知道这个示例不太具体,因为它取决于所使用的directory ,但是您可以尝试使用给定文件夹的文件路径以及'.nc''.txt'或目录中存在的某些字符串替换directory 。文件夹中的一堆文件。

我想你想要这个:

import os.path

result = [
    os.path.join(dirpath, filename)
    for dirpath, _, files in os.walk(directory)
    for filename in files if '.nc' in filename
]

您在列表理解中的循环顺序错误。 看看这个问题以供参考。 我的快速经验法则是,如果不是列表理解,则按顺序编写循环,然后将输出表达式放在开始位置。

我添加了os.path.join因为您似乎想要完整的路径。

如果仅需要此类匹配文件的总数,则可以执行以下操作:

result = sum(1
    for dirpath, _, files in os.walk(directory)
    for filename in files if '.nc' in filename
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM