#python #os.walk
#python #os.walk
Вопрос:
Дерево каталогов выглядит следующим образом:
DirA--
|
-- Map
|
-- Fig--
|
--file.png
|
-- Data--
|
-- file.xls
|
-- file.csv
Существует несколько каталогов, содержащих несколько файлов. Я хотел бы получить полный путь к тем файлам, которые находятся Data
только в каталоге.
Это то, что у меня есть до сих пор:
dirlist = []
thisdir = os.getcwd()
for root, dirs, files in os.walk(thisdir):
for d in dirs:
if d.startswith("Data"):
dirlist.append(os.path.join(root, d))
Комментарии:
1. попробуйте
thisdir = os.getcwd() "/Data"
. И после этого выполните цикл над файлом, как обычно2. спасибо, os.getcwd() указывает на корень, в корне у меня есть несколько каталогов Dir1, Dir2 и т. Д., А «Данные» — это подкаталог. Боюсь, это не сработает.
3. Я не думаю, что понимаю. getcwd() возвращает текущий рабочий каталог процесса, который является корневой папкой? Папка «Данные» находится в корне?
4. извините @jacobgalam, может быть, я сам запутался. Где именно вы предлагаете его добавить?
5. в начале вашего кода строка 2
Ответ №1:
Чтобы получить только файлы каталогов данных, вам нужно будет объединить root
и files
.
for root, dirs, files in os.walk(thisdir):
if "Data" in root: # try using in instead of startswith
for f in files:
dirlist.append(os.path.join(root, f))
Пытаюсь сделать это с помощью ‘dirs’
В случае ‘dirs’ у вас нет доступа к файлам. Например, когда root
есть DirA
, у вас будет --Data--
в вашем dirs
списке, но у вас не будет доступа к файлам --Data--
папки.
Комментарии:
1. это выглядит очень аккуратно, однако возвращает пустой список. Это должно быть, если dirs.startswith(«Data»), нет?
2. Нет, вы не можете этого сделать.
3. ага, изменение root.startswith() на root.endswith() сработало! Потому что —Data— будет в конце пути, а не в начале
Ответ №2:
import os
from os import listdir
from os.path import isfile, join
rootdir = os.getcwd()
folder_name = "Data"
def get_files(path):
onlyfiles = [f for f in listdir(path) if isfile(join(path, f))]
return onlyfiles
def get_search_files(start_path, folder_name):
for subdir, dirs, files in start_path:
for x in dirs:
if x == folder_name:
data_folder_path = os.path.join(subdir, x)
dirlist = get_files(data_folder_path)
return dirlist
dirlist = get_search_files(os.walk(rootdir), folder_name)
Комментарии:
1. Спасибо, но это дает пустой набор.
2. спасибо, я принял другой ответ, потому что он очень лаконичный.