Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 17, 2015 04:44:00

phoenix312
Зарегистрирован: 2015-02-17
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

поиск во вложенных списках

Задание: функция 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   

нахожу нужный файл рекурсией, а как путь к нему записать?

Отредактировано phoenix312 (Фев. 17, 2015 04:59:46)

Офлайн

#2 Фев. 17, 2015 09:17:14

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

поиск во вложенных списках

os.path
http://pythonworld.ru/moduli/modul-os-path.html



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#3 Фев. 17, 2015 10:35:17

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

поиск во вложенных списках

phoenix312
а как путь к нему записать?
Сверху пишешь
return filename

Снизу пишешь
return os.path.join(folder, file_search(folder[i], filename))



Отредактировано py.user.next (Фев. 17, 2015 10:35:30)

Офлайн

#4 Фев. 17, 2015 15:35:51

phoenix312
Зарегистрирован: 2015-02-17
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

поиск во вложенных списках

дело в том что модуль OS работает с реальными адресами и папками на компе, а тут просто список левых папок

Офлайн

#5 Фев. 17, 2015 16:09:08

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

поиск во вложенных списках

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')



————————————————
-*- Simple is better than complex -*-

Отредактировано terabayt (Фев. 17, 2015 16:52:40)

Офлайн

#6 Фев. 17, 2015 20:42:49

phoenix312
Зарегистрирован: 2015-02-17
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

поиск во вложенных списках

Спасибо!
А как убрать лишний слеш вначале?

Офлайн

#7 Фев. 17, 2015 20:50:13

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

поиск во вложенных списках

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')



————————————————
-*- Simple is better than complex -*-

Офлайн

#8 Фев. 17, 2015 23:31:32

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

поиск во вложенных списках

phoenix312
дело в том что модуль OS работает с реальными адресами и папками на компе
os.path.join() работает со строками.

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

Если работаешь с путями, то надо использовать его. Он учитывает все особенности работы с путями на текущей платформе.



Отредактировано py.user.next (Фев. 17, 2015 23:35:10)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version