当前位置: 首页 > 知识库问答 >
问题:

在python中需要类似“if os.havefiles”的函数来搜索子文件夹

魏鸿哲
2023-03-14

for all folders in tutu:
    if os.havefiles in os.walk(current_path):#the 'havefiles' don´t exist, i think...
        for filename in os.walk(current_path):
            if 'adf' in filename:
                etc...
                #my code
    elif:
        while true:
            go deep
    else:
        os.chdir(parent_folder)

你认为这是调用我的代码来完成这项工作的最佳定义吗?

这是我尝试使用的代码,当然没有成功:

import csv
import os
import fnmatch

abs_path=os.path.abspath('.')
for dirname, subdirs, filenames in os.walk('.'):
    # print path to all subdirectories first.
    for subdirname in subdirs:
        print os.path.join(dirname, subdirname), 'os.path.join(dirname, subdirname)'
        current_path= os.path.join(dirname, subdirname)
        os.chdir(current_path)
        for filename in os.walk(current_path):
            print filename, 'f in os.walk'
            if os.path.isdir(filename)==True:
                break
            elif os.path.isfile(filename)==True:
                print filename, 'file'
        #code here

提前感谢...

共有2个答案

百里骏
2023-03-14

walk将自动递归地“向下挖掘”,因此您不需要自己递归树。

我认为这应该是代码的基本形式:

import csv
import os
import fnmatch

directoriesToMatch = [list here...]
filenamesToMatch = [list here...]

abs_path=os.path.abspath('.')
for dirname, subdirs, filenames in os.walk('.'):
    if len(set(directoriesToMatch).difference(subdirs))==0:     # all dirs are there
        if len(set(filenamesToMatch).difference(filenames))==0: # all files are there
            if <any other filename/directory checking code>:
                # processing code here ...

根据python文档,如果出于任何原因不想继续递归,只需从subdirs中删除条目:http://docs.python.org/2/library/os.html

如果要检查是否没有找到要处理的文件的子目录,还可以将dirs检查更改为:

    if len(subdirs)==0: # check that this is an empty directory

我不确定我是否完全理解这个问题,所以我希望这有帮助!

编辑:

好的,所以如果你需要检查没有文件,只需使用:

    if len(filenames)==0:

但是正如我上面所说的,最好只是寻找特定的文件,而不是检查空目录。

高山
2023-03-14

我需要一个函数,对于os.walk中的当前子文件夹,如果该子文件夹是空的,继续到该子文件夹内的子文件夹,如果它存在。

这没有任何意义。如果文件夹为空,则它没有任何子文件夹。

也许你的意思是,如果它没有常规文件,然后递归到它的子文件夹中,但是如果它有,不要递归,而是检查布局?

要做到这一点,你只需要这样的东西:

for dirname, subdirs, filenames in os.walk('.'):
    if filenames:
        # can't use os.path.splitext, because that will give us .txt instead of .adf.txt
        extensions = collections.Counter(filename.partition('.')[-1] 
                                         for filename in filenames)
        if (extensions['.adf.txt'] == 1 and extensions['.idf.txt'] == 1 and
            extensions['.sdrf.txt'] == 1 and extensions['.dat'] >= 1 and
            len(extensions) == 4):
            # got a match, do what you want

        # Whether this is a match or not, prune the walk.
        del subdirs[:]

我在这里假设您只希望找到包含指定文件的目录,而不希望找到其他目录。要删除最后一个限制,只需删除len(extensions)==4部分。

没有必要显式地迭代subdirs或任何东西,或者从os.walk内部递归调用os.walkplay的全部意义在于,它已经递归地访问了它找到的每个子目录,除非您明确地告诉它不要这样做(通过修剪它给您的列表)。

 类似资料:
  • 我跟随Simon Holmes的《变得卑鄙》一书,但是,我偶然发现了一个关于子文档ID的问题。我试图使用mongoose文档提供的“MongooseDocumentArray.id(id)helper函数在“Location document”中请求“review document”。但是,我的所有子文档都生成“id”,但前面提到的函数需要“_id”,因此返回“null”对象。 函数说明:搜索数组

  • 问题内容: 在Java中,您可以执行和接收目录中的所有文件。然后,您可以轻松地通过目录树进行递归。 在Python中有类似的方法吗? 问题答案: 就在这里。Python方式更好。 有三种可能性: 1)像File.listFiles()一样: Python具有函数os.listdir(path)。它的工作方式类似于Java方法。 2)使用glob扩展路径名模式: 模块glob包含使用Unix she

  • 问题内容: 因此,我有一个名为“ users。”的表的数据库。在该表中有一列名为“ IP”的列,我想查找具有相同IP的用户并将其禁止。 问题答案: 您应该利用查询分组。我写的一个老博客是《理解群居法》 但基本上这应该工作: 这将返回计数> 1的所有IP地址

  • 问题内容: 在Angular中,我在范围内有一个对象,该对象返回许多对象。每个都有一个ID(此ID存储在一个平面文件中,因此没有DB,而且我似乎无法使用) 在我的控制器中: 在我看来,我还有关于默认隐藏的鱼类的更多附加信息,但是当我单击简单的显示更多标签时,我想调用该函数。我的函数看起来像: 现在,在视图中将显示更多详细信息。但是,在搜索了文档之后,我无法弄清楚如何搜索该数组。 那么如何查询数组?

  • 问题 你想把多个数组连在一起,生成一个数组的数组。换句话说,你需要实现与 Python 中的 zip 函数类似的功能。 Python 的 zip 函数返回的是元组的数组,其中每个元组中包含着作为参数的数组中的第 i 个元素。 解决方案 使用下面的 CoffeeScript 代码: # Usage: zip(arr1, arr2, arr3, ...) zip = () -> lengthArr