2017-01-16 3 views
0

Я пытаюсь написать функцию python2, которая будет рекурсивно проходить через всю структуру каталогов данного каталога и распечатать результаты.Перемещение структуры каталогов в python рекурсивно без os.walk

Все без использования os.walk

Это то, что у меня до сих пор:

test_path = "/home/user/Developer/test" 

def scanning(sPath): 
    output = os.path.join(sPath, 'output') 
    if os.path.exists(output): 
     with open(output) as file1: 
      for line in file1: 
       if line.startswith('Final value:'): 
        print line 
    else: 
     for name in os.listdir(sPath): 
      path = os.path.join(sPath, name) 
      if os.path.isdir(path): 
       print "'", name, "'" 
       print_directory_contents(path) 

scanning(test_path) 

Это то, что я в настоящее время получить, сценарий не входит в новую папку:

' test2' 
'new_folder' 

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

+0

К сожалению, 'os.walk' по-прежнему является наиболее целесообразной папкой листинга механизма даже в Python 3. – mootmoot

+0

я предпочел бы использовать его ! Однако было запрошено, что я не использую os.walk :( –

ответ

1

Попробуйте использовать рекурсивную функцию,

def lastline(fil): 
    with open(fil) as f: 
     for li in f.readlines(): 
      if li.startswith("Final Value:"): 
       print(li) 

## If it still doesnt work try putting 'dirs=[]' here 
def lookforfiles(basepath): 
    contents = os.listdir(basepath) 

    dirs = [] 
    i = 0 

    while i <= len(contents): 
     i += 1 

     for n in contents: 
      f = os.path.join(basepath, n) 

      if os.path.isfile(f): 
       lastline(f) 
       print("\n\nfile %s" % n) 
      elif os.path.isdir(f): 
       print("Adding dir") 
       if f in dirs: 
        pass 
       else: 
        dirs.append(f) 

    else: 
     for x in dirs: 
      print("dir %s" % x) 
      lookforfiles(x) 

жаль, если это не соответствует вашему примеру точно, но у меня было трудно понять, что вы пытались сделать.

+0

f в вашей функции lookforfiles появляется как нерешенная ссылка, я что-то не так? –

+0

Я сам это понял. Моему мозгу добавлен код, который мои руки не делали, т не дойдет до Просто отредактировал лола –

+0

хах не беспокойтесь, с каждым бывает Хотя я получаю сообщение об ошибке с кодом:..! TypeError: принуждение к Unicode: потребность строка или буфер, NoneType нашел в lookforfiles функционировать line: contents = os.listdir (basepath) –

2

Попробуйте это:

import os 

test_path = "YOUR_DIRECTORY" 

def print_directory_contents(dir_path): 
    for child in os.listdir(dir_path): 
     path = os.path.join(dir_path, child) 
     if os.path.isdir(path): 
      print("FOLDER: " + "\t" + path) 
      print_directory_contents(path) 

     else: 
      print("FILE: " + "\t" + path) 

print_directory_contents(test_path) 

Я работал на окнах, проверьте, если все еще работает на UNIX. адаптировано из: http://codegists.com/snippet/python/print_directory_contentspy_skobnikoff_python

+0

Я могу подтвердить, что я использую linux :) –

1

Попробуйте это с рекурсией гораздо простая и меньше коды

import os 

def getFiles(path="/var/log", files=[]): 
    if os.path.isfile(path): 
     return files.append(path) 
    for item in os.listdir(path): 
     item = os.path.join(path, item) 
     if os.path.isfile(item): 
      files.append(item) 
     else: 
      files = getFiles(item, files) 
    return files 



for f in getFiles("/home/afouda/test", []): 
    print(f) 
Смежные вопросы