Найти - Пользователи
Полная версия: Поиск файла
Начало » Python для новичков » Поиск файла
1 2
Slava_K
По адресу C:\Users\User\AppData\Roaming\папка1\папка2\папка3 находятся несколько файлов. Нужно найти файл, обновлённый позже всего.
Вопросы:
  • Как это можно сделать?
  • Как найти эту папку, если знаешь путь только после папки User. Этот путь ведь у всех отличается

Спасибо за помошь
fata1ex
os.walk
Slava_K
fata1ex
os.walk
Спасибо
теперь буду гуглить уроки по os.walk
fata1ex
Уроки гуглить не надо. Достаточно почитать документацию на docs.python.org.
Slava_K
fata1ex
Уроки гуглить не надо. Достаточно почитать документацию на docs.python.org.
Проблемы в том, что она на английском Я с ним не очень дружу
fata1ex
Хотите научиться программировать, придётся начинать дружить.
Slava_K
fata1ex
Хотите научиться программировать, придётся начинать дружить.
Это да…
А примеров там много? Я обычно смотрю пример, потом меняю там что то и смотрю что изменилось в результате Вот так вот и учусь)))
sanodin
http://pythoner.name/walk

Что делает os.walk()
Submitted by plustilino on August 23, 2011 - 22:24
Функция (метод) walk модуля os возвращает объект-генератор. Из полученного объекта можно получить кортежи для каждого каталога в переданной walk файловой иерархии. Каждый кортеж состоит из трех элементов:
Абсолютный адрес очередного каталога (строка).
Имена (без адреса) подкаталогов первого уровня для текущего каталога (список).
Имена (без адреса) файлов данного каталога.
Посмотрим, как это работает. Допустим, у нас есть такое дерево каталогов:
Пусть переменная tree является ссылкой на объект-генератор, полученный в результате выполнения метода walk, которому, в свою очередь был передан в качестве аргумента адрес тестируемого каталога.

tree = os.walk('/home/pl/mydir')

На что же ссылается tree? Попробуем просто получить данные, связанные с данной переменной.

print (tree)

В результате мы увидим следующее:
<generator object walk at 0x00A8B620>
Итак, есть объект-генератор. Поскольку полученный объект генерирует кортежи, количество которых равно количеству каталогов в дереве, то можно их получить с помощью цикла for и, например, вывести на экран

for d in tree:
print (d)

В соответствии с вышеуказанным деревом каталогов получится следующее:

('/home/pl/mydir', ['dir2a', 'dir2b'], ['mash187.pas', 'mash189.pas', 'menu_.php', 'xorg.conf', 'клав_тренажер.odt', 'Расписание 2004.xls'])
('/home/pl/mydir\\dir2a', ['dir3'], ['less1.doc', 'Patro_Nia.ogg', 'Расписание 2004.doc'])
('/home/pl/mydir\\dir2a\\dir3', [], ['bottom_.php', 'equador.mid', 'less1.html', 'net_Alt.txt', 'poly995.mid', 'top_.php'])
('/home/pl/mydir\\dir2b', [], ['clear.gif', 'fon1.jpg', 'logo4.png', 'okulov245.pas', 'okulov273.pas', 'plan1.jpg', 'plan2.jpg'])
Итак, налицо четыре кортежа (у нас четыре каталога – см. схему выше). Каждый кортеж включает три элемента. Первый – это адрес каталога, второй – список поддиректорий не глубже первого уровня, третий – список имен файлов. Если вложенных каталогов или файлов нет, то соответствующий им список будет пуст.
Если мы еще раз запустим цикл с переменной tree, то уже ничего не получим. Дело в том, что объект-генератор, с которым переменная была связана, уже был использован, он выдал свое содержимое и больше его не содержит. Поэтому, если требуется сохранить кортежи для последующий обработки, то лучше сохранить их, например, в списке:

>>> import os
>>> pdir = 'G:/projects/pythoner.info/pypath/mydir'
>>> contdir = []
>>> for i in os.walk(pdir):
contdir.append(i)

>>> for i in contdir:
print (i)

('G:/projects/pythoner.info/pypath/mydir', ['dir2a', 'dir2b'], ['mash187.pas', 'mash189.pas', 'menu_.php', 'sg30.thm', 'xorg.conf', 'клав_тренажер.odt', 'Расписание 2004.xls'])
('G:/projects/pythoner.info/pypath/mydir\\dir2a', ['dir3'], ['less1.doc', 'Patro_Nia.ogg', 'Thumbs.db', 'Расписание 2004.doc'])
('G:/projects/pythoner.info/pypath/mydir\\dir2a\\dir3', [], ['equador.mid', 'fon1.jpg', 'logo4.png', 'logos.bmp', 'net_Alt.txt', 'plan1.jpg', 'poly995.mid', 'Thumbs.db', 'top_.php'])
('G:/projects/pythoner.info/pypath/mydir\\dir2b', [], ['bottom_.php', 'clear.gif', 'less1.html', 'okulov245.pas', 'okulov273.pas', 'plan2.jpg', 'sg30.sdv'])
С помощью функции walk() можно получить имена файлов с тем, чтобы в дальнейшем с ними что-нибудь делать с помощью других методов Python и его модулей. Получить их можно, извлекая из третьего элемента каждого кортежа. Сделать это можно так, как показано ниже:

for d, dirs, files in os.walk('c:/mydir'):
for f in files:
print (f)
Переменная d в каждой итерации связывается с первым элементом каждого кортежа (строкой, содержащей адрес каталога), dirs – со вторым элементом (списком подкаталогов), а files - со списками файлов очередного каталога. Чтобы извлечь списки файлов целиком, а не выделять каждый файл по отдельности, можно сделать так:

for d, dirs, files in os.walk('c:/mydir'):
print (files)
И получить:
['mash187.pas', 'mash189.pas', 'menu_.php', 'xorg.conf', 'клав_тренажер.odt', 'Расписание 2004.xls']
['less1.doc', 'Patro_Nia.ogg', 'Расписание 2004.doc']
['bottom_.php', 'equador.mid', 'less1.html', 'net_Alt.txt', 'poly995.mid', 'top_.php']
['clear.gif', 'fon1.jpg', 'logo4.png', 'okulov245.pas', 'okulov273.pas', 'plan1.jpg', 'plan2.jpg']
Имена файлов не полные. Они не содержат адреса, следовательно, для операций с файлами таких списков не достаточно. Для получения полных адресов подойдет функция os.path.join(). С ее помощью можно объединить первый элемент кортежа, содержащий полный путь, с именем каждого файла:

>>> path_f = []
>>> for d, dirs, files in os.walk('c:/mydir'):
for f in files:
path = os.path.join(d,f) # формирование адреса
path_f.append(path) # добавление адреса в список

>>> path_f
['c:/mydir\\mash187.pas', 'c:/mydir\\mash189.pas', 'c:/mydir\\menu_.php', 'c:/mydir\\xorg.conf', 'c:/mydir\\клав_тренажер.odt', 'c:/mydir\\Расписание 2004.xls', 'c:/mydir\\dir2a\\less1.doc', 'c:/mydir\\dir2a\\Patro_Nia.ogg', 'c:/mydir\\dir2a\\Расписание 2004.doc', 'c:/mydir\\dir2a\\dir3\\bottom_.php', 'c:/mydir\\dir2a\\dir3\\equador.mid', 'c:/mydir\\dir2a\\dir3\\less1.html', 'c:/mydir\\dir2a\\dir3\\net_Alt.txt', 'c:/mydir\\dir2a\\dir3\\poly995.mid', 'c:/mydir\\dir2a\\dir3\\top_.php', 'c:/mydir\\dir2b\\clear.gif', 'c:/mydir\\dir2b\\fon1.jpg', 'c:/mydir\\dir2b\\logo4.png', 'c:/mydir\\dir2b\\okulov245.pas', 'c:/mydir\\dir2b\\okulov273.pas', 'c:/mydir\\dir2b\\plan1.jpg', 'c:/mydir\\dir2b\\plan2.jpg']
Пример имеет, скорее всего, демонстрирующее, а не практическое значение, т.к. результирующий список содержит повторяющиеся части строк. Поэтому лучше напрямую работать с кортежем, извлеченным из объекта-генератора.
JOHN_16
Slava_K
Slava_K
Я обычно смотрю пример, потом меняю там что то и смотрю что изменилось в результате Вот так вот и учусь)))
Хреновая у вас система, я бы сказал даже тупиковая. Понимание то может и не наступить. Хотите стать программистом, а не бестолковым копипастером - то меняйте подход.
Slava_K
Проблемы в том, что она на английском Я с ним не очень дружу
как вам уже говорили, это почти что жизненная необходимость. Так что делайте выводы.

К тому же есть переводчики, есть гугл - информация то вся на ладони, берите ее.
fata1ex
JOHN_16
берите ее
берите её полностью.

Извините, не удержался.
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