我正在学习Python并编写一个应用程序,它将递归一个文件夹树并识别特定扩展名的文件。
测试文件夹结构如下,其中有10个文本文件:
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经过提取和简化的代码的业务端是:
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)}')运行时会打印:
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但是,如果我修改代码以删除对子目录的引用,它可以正常工作:
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)}')输出:
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中。我相信这是很简单的事情,但是我不能理解到底发生了什么。
发布于 2021-08-18 16:23:25
问题出在我对Python生成器的理解不完整,而且我的缩进也不正确。“for this_file in files”部分应该在与“for_ in subdirs”部分相同的级别缩进。
谢谢你的回复。
https://stackoverflow.com/questions/68835649
复制相似问题