I want to iterate through a directory with several 'levels' of subfolders (please excuse me if I use the wrong term for it), see the following list as an example:
$ tree folder/
folder/
├── lever1_1
│ └── level2_1
│ └── level3_1
│ ├── file1.txt
│ └── file2.txt
└── lever1_2
└── level2_1
└── level3_1
6 directories, 2 files
I want to check if there are .txt-files in the directory and if yes, I would like to modify the directory they are in (i.e. level3_1 in this example). This means it would be causing duplicates if I did something like
for dirs, files in os.walk("/home/user/folder"):
for file in files:
if file.endswith(".txt"):
# do something to the directory they are in
because there are several .txt-files in level3_1, but I only want to modify it once.
If I use for dirs, files in os.walk("/home/user/folder")
I get the error "too many values to unpack (expected 2)" , which I understand, but I cannot work with a fixed set of directory levels as they can vary throughout the use cases.
Does anybody have an idea how to do this in an efficient way?
Kind regards
You need to adjust how you're iterating through the results. Since os.walk()
returns a tuple of (dirpath, dirnames, filenames)
for each directory , you need to unpack this tuple accordingly:
import os
root_folder = "./folder"
if __name__ == '__main__':
for dirpath, dirnames, filenames in os.walk(root_folder):
if any(file.endswith(".txt") for file in filenames):
# Do something to the directory
print(f'Found {filenames[0]} file in: {dirpath}')