首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果引用目录名,os.walk()会有不同的行为

如果引用目录名,os.walk()会有不同的行为
EN

Stack Overflow用户
提问于 2021-08-18 15:56:20
回答 1查看 48关注 0票数 0

我正在学习Python并编写一个应用程序,它将递归一个文件夹树并识别特定扩展名的文件。

测试文件夹结构如下,其中有10个文本文件:

代码语言:javascript
复制
C:\TEMP\ROOT
├───dir1
│   │   dir1file1.txt
│   │   dir1file2.txt
│   │
│   ├───subdir1
│   │       dir1subdir1file1.txt
│   │       dir1subdir1file2.txt
│   │
│   └───subdir2
│           dir1subdir2file1.txt
│           dir1subdir2file2.txt
│
└───dir2
    │   dir2file1.txt
    │   dir2file2.txt
    │
    └───subdir1
        │   dir2subdir1file1.txt
        │
        └───subdir1
            └───subdir1
                    dir2subdir1subdir1subdir1file1.txt

经过提取和简化的代码的业务端是:

代码语言:javascript
复制
def scan_for_txt_files(start_from):
    for root_path, subdirs, files in os.walk(start_from):
        for _ in subdirs:
            # In the real application I update a progress bar here.
            for this_file in files:
                ext = str.lower(os.path.splitext(this_file)[1]).replace('.', '')
                if ext == 'txt':
                    print(f'{os.path.join(root_path, this_file)}')

运行时会打印:

代码语言:javascript
复制
c:\temp\root\dir1\dir1file1.txt
c:\temp\root\dir1\dir1file2.txt
c:\temp\root\dir1\dir1file1.txt
c:\temp\root\dir1\dir1file2.txt
c:\temp\root\dir2\dir2file1.txt
c:\temp\root\dir2\dir2file2.txt
c:\temp\root\dir2\subdir1\dir2subdir1file1.txt

但是,如果我修改代码以删除对子目录的引用,它可以正常工作:

代码语言:javascript
复制
def scan_for_txt_files(start_from):
    for root_path, subdirs, files in os.walk(start_from):
        for this_file in files:
            ext = str.lower(os.path.splitext(this_file)[1]).replace('.', '')
            if ext == 'txt':
                print(f'{os.path.join(root_path, this_file)}')

输出:

代码语言:javascript
复制
c:\temp\root\dir1\dir1file1.txt
c:\temp\root\dir1\dir1file2.txt
c:\temp\root\dir1\subdir1\dir1subdir1file1.txt
c:\temp\root\dir1\subdir1\dir1subdir1file2.txt
c:\temp\root\dir1\subdir2\dir1subdir2file1.txt
c:\temp\root\dir1\subdir2\dir1subdir2file2.txt
c:\temp\root\dir2\dir2file1.txt
c:\temp\root\dir2\dir2file2.txt
c:\temp\root\dir2\subdir1\dir2subdir1file1.txt
c:\temp\root\dir2\subdir1\subdir1\subdir1\dir2subdir1subdir1subdir1file1.txt

代码的第一种形式是因为我的目的是预先确定子文件夹的数量,然后在“for ... in subdirs”部分,根据扫描的文件夹数量更新进度条。

这要么发生在真实的文件系统中,要么发生在pytest\pyfakefs中。我相信这是很简单的事情,但是我不能理解到底发生了什么。

EN

回答 1

Stack Overflow用户

发布于 2021-08-18 16:23:25

问题出在我对Python生成器的理解不完整,而且我的缩进也不正确。“for this_file in files”部分应该在与“for_ in subdirs”部分相同的级别缩进。

谢谢你的回复。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68835649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档