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

os.walk()访问同一文件夹两次

殳睿
2023-03-14

我写简单的脚本使用诱变库,其中计数文件夹中的音频文件量和文件夹的整个音频播放时间(包括子文件夹的音频文件)。

import os,sys
from datetime import datetime,timedelta
from mutagen.mp3 import MP3
from mutagen.flac import FLAC
from mutagen.aac import AAC
from mutagen.aiff import AIFF
from mutagen.asf import ASF

audio_ext={"mp3":lambda x: MP3(x).info.length,
           "aac":lambda x: AAC(x).info.length,
           "wmv":lambda x: ASF(x).info.length,
           "wma":lambda x: ASF(x).info.length,
           "asf":lambda x: ASF(x).info.length,
           "flac":lambda x: FLAC(x).info.length,
           "aiff":lambda x: AIFF(x).info.length,}

def scan_lib(path):
    playtime = 0
    audio_files = 0
    for root,dirs,files in os.walk(path,followlinks=False):
        for f in files:
           try:
               playtime += audio_ext[f[len(f)-f[::-1].index('.'):]](os.path.join(root,f))
               audio_files += 1
           except (KeyError,ValueError):
               pass

        for d in dirs:
            dir_playtime,dir_audios = scan_lib(os.path.join(root,d))
            playtime +=dir_playtime
            audio_files += dir_audios

    print("\nLibrary:",path)
    print("Amount of audio files:",audio_files)
    print("Total playing time:\nDays\tHours\tMin\tSec\n%d\t%d\t%d\t%d\n" % convert_pt(playtime))
    return playtime,audio_files

def convert_pt(sec):
    t = datetime(1,1,1) + timedelta(seconds=int(sec))
    return t.day-1, t.hour,t.minute,t.second

main_path = sys.argv[1]
playtime,audio_files = scan_lib(main_path)

经过一些测试,我发现我的脚本访问了一些文件夹两次。通常这些目录是另一个子文件夹中的子文件夹。结果它打印了这样的结果:

$ python3 music_scan.py 

Library: ~/Music/
Amount of audio files: 3520
Total playing time:
Days    Hours   Min Sec
9   7   30  26

但实际上,如果将所有音频曲目移动到一个文件夹中,并在该测试文件夹上运行脚本,则会显示不同的结果:

$ python3 music_scan.py ~/test
Library: ~/test/
Amount of audio files: 885
Total playing time:
Days    Hours   Min Sec
2   15  49  9

实际上,测试文件夹中的音频曲目数量是885。我用ls | wc-l命令检查了它,那么为什么os.walk()会访问一些子文件夹两次呢?

共有1个答案

徐友樵
2023-03-14

os.walk已经递归地遍历整个目录树。

但是,您可以递归地调用方法scan_lib

def scan_lib(path):
    ...
    for root,dirs,files in os.walk(path,followlinks=False):
        ...
        for d in dirs:
            dir_playtime,dir_audios = scan_lib(os.path.join(root,d))
            ...

使用os.listdir而不是os.walk并保留递归调用,或者简单地删除dirs:中以开头的d的4行。

 类似资料:
  • 问题内容: 我需要列出文件夹中包含目录路径的所有文件。我尝试使用,这显然是完美的解决方案。 但是,它还会列出隐藏的文件夹和文件。我希望我的应用程序不列出任何隐藏的文件夹或文件。有没有可以用来使其不产生任何隐藏文件的标志? 跨平台对我而言并不是很重要,如果只适用于linux(。*模式)就可以了 问题答案: 不,没有选择会跳过这些。您需要自己这样做(这很容易): 注意切片分配;递归遍历中列出的子目录。

  • 我刚刚开始使用JSP,遇到了一个问题。 据我所知,WEB-INF下的JSP页面可以通过浏览器在localhost中使用URL进行访问: 但是,如果我在WEB-INF文件夹(即'MyFolder')中创建另一个子文件夹,并尝试通过URL访问相同的JSP页面: 它给出了一个错误404。JSP文件导航系统与HTML文件导航系统有区别吗? 编辑:我正在使用servlet来显示我的JSP页面: EDIT2:

  • 我正在使用path标准(使用maven war)将webapp部署到tomcat instalation目录。问题是我在webapp路径和浏览器中有一个javascript文件夹,我无法访问该文件夹。我已经检查了文件是否创建到正确的文件夹,他们在那里! 如果我尝试在浏览器上运行 给我“404页未找到”错误。 如果我把js文件夹放在根目录(而不是标准目录)中,一切都正常。

  • 我正在从主类访问资源文件夹中的文件 我收到了这个错误: 我甚至打开了jar文件,remoteUnitsIdsInOldServer.txt文件就在那里,在类内部

  • 我试图做一个Python代码,遍历父文件夹中的所有子文件夹,并将子文件夹内容移动到父文件夹。我在python中使用os.walk函数,但它也一直选择父文件夹中的文件。有没有办法解决这个问题...

  • 我有一个资源文件夹/包在我的项目的根,我"不"想要加载某个文件。如果我想加载某个文件,我会使用class.getResourceAsStream,我会没事的!!我实际上想做的是在资源文件夹中加载一个“文件夹”,循环该文件夹中的文件,并获得每个文件的流,并在内容中读取...假设在运行时之前没有确定文件名...那我该怎么办?有没有一种方法来获得一个文件夹中的文件列表在您的jar文件?请注意,带有资源的