2015-06-27 3 views
0

Я ищу конкретную директорию (/ android).Прогулочные каталоги

Я знаю, что в python я могу ходить каталоги с os.walk (root_dir), но проблема здесь в том, что я не знаю, является ли каталог, который я ищу, дочерним элементом root_dir или если его родительский каталог ROOT_DIR.

Есть ли какой-либо метод, выполняющий ту же операцию, что и os.walk(), но наоборот?

Спасибо.

+2

Вы можете изменить текущую рабочую директорию вверх, используя 'os.chdir (» .. ') ', среди других вариантов. –

ответ

2

Вы можете перейти в родительский каталог root_dir с помощью .. в os.path.abspath().

import os 
parent_dir = os.path.abspath(os.path.join(root_dir, "..")) 

Теперь у вас есть parent_directory из root_dir в parent_dir, Вы можете сделать его root_dir и использовать os.walk(root_dir) снова.

+0

Это добавляет много сложности в код, если я имею дело с большим количеством каталогов, я буду на каждом attemps ходить все дерево, если я не найду каталог, который я ищу, я просто иду вверх в дереве каталогов и снова ходить? Разве нет лучшего решения? –

+0

@LastBerserkr у вас есть буквально * не знаю, где этот каталог может быть? – jonrsharpe

+1

Затем вместо использования 'os.walk()' use 'os.listdir (root_dir)', который дает вам список всех каталогов в 'root_dir', и вы можете перебирать их, чтобы найти, нужно ли вам входить в некоторые или перейдите еще один уровень вверх. – shaktimaan

0

Вот решение, которое я выбрал, однако у меня возникла ошибка при анализе абсолютного пути для копирования файла. Я получаю эту ошибку, я думаю, что это потому, что мне нужен абсолютный путь, кто-то знает, как получить абсолютный путь из списка каталогов?

FileNotFoundError: [Errno 2] No such file or directory: 'android\\MyCustomClass.smali' 

вот мой код:

def copy_my_custom_class(current_dir): 
    subdirs = os.listdir(current_dir)  
    for subdir in subdirs: 
     if (subdir == 'android'):  
      my_custom_class_path = os.path.join(subdir, 'MyCustomClass.smali') 
      shutil.copyfile('./files/MyCustomClass.smali', my_custom_class_path)  

    copy_my_custom_class(os.chdir(current_dir)) 
+0

Здесь вы просто присоединяетесь к пути 'subdir' (т. Е.' Android') к файлу. Поэтому вы пытаетесь скопировать файл с вашего 'source' на 'android \\ MyCustomClass.smali''. Вы должны получить абсолютный путь, где файл существует. Используйте 'os.path.join (os.getcwd(), subdir, 'MyCustomClass.smali')', если 'current_dir' является текущим рабочим каталогом. – shaktimaan

+0

@shaktimaan проблема в том, что это не текущий рабочий каталог, поэтому я полагаю, что делать нечего, не так ли? –

+0

Извините за поздний ответ .. но ваша проблема действительно решена? Если нет, то я предлагаю иметь переменную, отслеживающую абсолютный путь для файла. И используйте 'os.path.join (yourabspath, subdir) ', если вы заходите в какой-то каталог и' os.path.join (yourabspath, "..") ', если вы перемещаете какой-то каталог. Но, конечно же, вам нужно будет восстановить абсолютный путь доступа к файлу. – shaktimaan

0

Я решил эту проблему с этим кодом:

def copy_my_custom_class(current_dir): 
    subdirs = os.listdir(current_dir) 
    for subdir in subdirs: 
     if (subdir == 'android'): 
      dest_file_path = os.path.join(current_dir, subdir, 'MyCustomClass.smali') 
      shutil.copyfile('./files/MyCustomClass.smali', dest_file_path) 
      return 0 

    copy_my_custom_class(os.path.dirname(current_dir)) 
Смежные вопросы