Итерация / цикл по всем папкам файлов каталога h5 - PullRequest
0 голосов
/ 09 ноября 2019

Я работаю с популярным набором данных миллионов песен, и данные содержатся в нескольких вложенных подпапках. Все файлы являются файлами .h5. Я использую библиотеку os для импорта данных в python, но она останавливается в родительской папке и не перебирает все данные. Я не уверен, как построить цикл, чтобы это произошло.

entries = os.listdir("/Users/katherineperkins/Downloads/MillionSongSubset/data")



for filename in os.listdir(entries):
if filename.endswith(".h5") or filename.endswith(".py"): 
     # print(os.path.join(directory, filename))
    continue
else:
    continue

Со всеми найденными фрагментами я получаю следующую ошибку:

listdir: path should be string, bytes, os.PathLike, integer or None, not list

1 Ответ

0 голосов
/ 09 ноября 2019

entries - это список имен (каталогов?). os.listdir не может принимать их в качестве параметра одновременно. Вам нужен внешний цикл, а внутренний цикл должен объединить запись с каталогом, из которого она была отсканирована.

root_dir = "/Users/katherineperkins/Downloads/MillionSongSubset/data"
for entry in os.listdir(root_dir):
   for filename in os.listdir(os.path.join(root_dir,entry)):
          if filename.endswith((".h5",".py")): 
              # do something: beware as filename isn't the full filepath.
              # it needs joining with os.path.join(root_dir,entry)

Приведенный выше код работает, если entry не является , а не каталогом. Мы могли бы проверить каталог, или перехватить исключение, или, возможно, в какой-то момент переключиться на glob с двухуровневым подстановочным знаком «все файлы», что намного проще

import glob

for filepath in glob.glob("/Users/katherineperkins/Downloads/MillionSongSubset/data/*/*"):
      if filepath.endswith((".h5",".py")): 
          # do something

тестирование расширения файлас endswith (который принимает tuple между прочим) дешевле, чем с использованием glob.glob на обоих расширениях (например: glob.glob("/Users/katherineperkins/Downloads/MillionSongSubset/data/*/*.h5") (потребуется 2 сканирования каталога)

...