Найти - Пользователи
Полная версия: поиск во вложенных списках
Начало » Python для новичков » поиск во вложенных списках
1
phoenix312
Задание: функция file_search(folder, filename)
folder - список с вложенными списками многоуровневый. нулевой элемент - название папки, остальные - папки и файлы, вложенные папки аналогично в нулевом элементе название и т.д.
filename - имя файла который нужно найти
результат - путь к файлу
пример:
file_search([ '/home', ['user1'], ['user2', ['my pictures'], ['desktop', 'not this', 'and not this', ['newfolder', 'hereiam.py' ] ] ], 'work.ovpn', 'prom.7z', ['user3', ['temp'], ], 'hey.py'], 'hereiam.py')
результат - '/home/user2/desktop/newfolder/hereiam.py'


def file_search(folder, filename):
   i=1 
   while i<len(folder):
       if (filename in folder[i]) or (filename == folder[i]):
          print folder[i]
          break
       else: 
          file_search(folder[i], filename)
       i=i+1   

нахожу нужный файл рекурсией, а как путь к нему записать?
ZerG
os.path
http://pythonworld.ru/moduli/modul-os-path.html
py.user.next
phoenix312
а как путь к нему записать?
Сверху пишешь
return filename

Снизу пишешь
return os.path.join(folder, file_search(folder[i], filename))
phoenix312
дело в том что модуль OS работает с реальными адресами и папками на компе, а тут просто список левых папок
terabayt
def file_search(folder, filename, s = ''):
    i=1
    while i<len(folder):
        if filename == folder[i]:
            print "%s/%s/%s" % (s, folder[0], folder[i])
            break
        elif hasattr(folder[i], '__iter__'):
            file_search(folder[i], filename, s + '/' +folder[0])
        i += 1
так будет лучше
def file_search(folder, filename, s = ''):
    i=1
    while i<len(folder):
        if filename == folder[i]:
            return "%s/%s/%s" % (s, folder[0], folder[i])
        elif hasattr(folder[i], '__iter__'):
            a = file_search(folder[i], filename, s + '/' +folder[0])
            if a: return a
        i += 1
print file_search([ '/home', ['user1'], ['user2', ['my pictures'], ['desktop', 'not this', 'and not this', ['newfolder', 'hereiam.py' ] ] ], 'work.ovpn', 'prom.7z', ['user3', ['temp'], ], 'hey.py'], 'not this')
phoenix312
Спасибо!
А как убрать лишний слеш вначале?
terabayt
phoenix312
А как убрать лишний слеш вначале?
file_search([ 'home', ['user1'], ['user2', ['my pictures'], ['desktop', 'not this', 'and not this', ['newfolder', 'hereiam.py' ] ] ], 'work.ovpn', 'prom.7z', ['user3', ['temp'], ], 'hey.py'], 'hereiam.py')
py.user.next
phoenix312
дело в том что модуль OS работает с реальными адресами и папками на компе
os.path.join() работает со строками.

>>> import os
>>> os.path.join('a', 'b')
'a/b'
>>>

Если работаешь с путями, то надо использовать его. Он учитывает все особенности работы с путями на текущей платформе.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB