Вот самый простой способ, которым я могу придумать, чтобы получить все имена файлов без каких-либо подпутей, используя просто os.listdir () :
import os
from pprint import pprint
def getAllFiles(dir, result = None):
if result is None:
result = []
for entry in os.listdir(dir):
entrypath = os.path.join(dir, entry)
if os.path.isdir(entrypath):
getAllFiles(entrypath ,result)
else:
result.append(entry)
return result
def main():
result = getAllFiles("/tmp/foo")
pprint(result)
main()
Это использует идею рекурсии Iупоминается в моем комментарии.
С тестовой структурой каталогов:
/tmp/foo
├── D
│ ├── G
│ │ ├── h
│ │ └── i
│ ├── e
│ └── f
├── a
├── b
└── c
Я получаю:
['a', 'c', 'i', 'h', 'f', 'e', 'b']
Если я изменю эту строку:
result.append(entry)
до:
result.append(entrypath)
тогда я получаю:
['/tmp/foo/a',
'/tmp/foo/c',
'/tmp/foo/D/G/i',
'/tmp/foo/D/G/h',
'/tmp/foo/D/f',
'/tmp/foo/D/e',
'/tmp/foo/b']
Чтобы получить точный результат, который вы хотели, вы можете сделать
dtry = [getAllFiles("/tmp/foo")]
dtry.append(list(dtry[0]))
dtry.append(list(dtry[0]))
И если вы хотитеиспользовать os.walk , который является более компактным, вот два варианта этого:
def getAllFiles2(dir):
result = []
for root, dirs, files in os.walk(dir):
result.extend(files)
return result
def getAllFilePaths2(dir):
result = []
for root, dirs, files in os.walk(dir):
result.extend([os.path.join(root, f) for f in files])
return result
Они дают те же результаты (в порядке порядка), что и рекурсивные версии.