Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Получение сведений о файле. Получение абсолютных путей. Генераторы списков




Получение сведений о файле

Любая современная операционная система хранит сведения о каждом файле (метаданные): дата создания, дата последней модификации, размер файла и т. д. Python предоставляет единый программный интерфейс для доступа к этим метаданным. Вам не надо открывать файл; всё, что требуется — имя файла.

> > > import os
> > > print(os. getcwd()) c: \Users\pilgrim\diveintopython3\examples [1]
> > > metadata = os. stat('feed. xml') [2]
> > > metadata. st_mtime 1247520344. 9537716 [3]
> > > import time [4]
> > > time. localtime(metadata. st_mtime) time. struct_time(tm_year=2009, tm_mon=7, tm_mday=13, tm_hour=17, tm_min=25, tm_sec=44, tm_wday=0, tm_yday=194, tm_isdst=1) [5]
  1. ↑ Текущий рабочий каталог — папка с примерами.
  2. ↑ feed. xml — файл в папке с примерами. Вызов функции os. stat() возвращает объект, содержащий различные метаданные о файле.
  3. ↑ st_mtime — время изменения файла, но записано оно в ужасно неудобном формате. (Фактически это количество секунд, прошедших с начала «эры UNIX», начавшейся в первую секунду 1 января 1970 года. Серьёзно. )
  4. ↑ Модуль time является частью стандартной библиотеки Python. Он содержит функции для преобразований между различными форматами представления времени и часовыми поясами, для преобразования их в строки (str) и др.
  5. ↑ Функция time. localtime() преобразует время из формата «секунды с начала эры» (поле st_mtime, возвращённое функцией os. stat()) в более удобную структуру, содержащую год, месяц, день, час, минуту, секунду и т. д. Этот файл в последний раз изменялся 13 июля 2009 года, примерно в 17 часов, 25 минут.
# продолжение предыдущего примера
> > > metadata. st_size 3070 > > > import humansize [1]
> > > humansize. approximate_size(metadata. st_size) '3. 0 KiB' [2]
  1. ↑ Функция os. stat() также возвращает размер файла в свойстве st_size. Размер файла feed. xml — 3070 байт.
  2. ↑ Вы можете передать свойство st_size в функцию approximate_size().

Получение абсолютных путей

В предыдущем разделе функция glob. glob() возвращала список относительных путей. В первом примере пути имели вид 'examples\feed. xml', а во втором относительные пути были даже короче, например, 'romantest1. py'. Пока вы остаётесь в текущем рабочем каталоге, по этим относительным путям можно будет открывать файлы или получать их метаданные. Но если вы захотите получить абсолютный путь — то есть тот, который включает все имена каталогов до корневого или до буквы диска, вам понадобится функция os. path. realpath().

> > > import os
> > > print(os. getcwd())
c: \Users\pilgrim\diveintopython3\examples
> > > print(os. path. realpath('feed. xml'))

c: \Users\pilgrim\diveintopython3\examples\feed. xml

Генераторы списков

В генераторах списков можно использовать любые выражения Python.

С помощью генераторов списков можно легко отобразить один список в другой, применив некоторую функцию к каждому элементу.

> > > a_list = [1, 9, 8, 4] > > > [elem * 2 for elem in a_list] [2, 18, 16, 8] [1]
> > > a_list [1, 9, 8, 4] [2]
> > > a_list = [elem * 2 for elem in a_list] > > > a_list [2, 18, 16, 8] [3]
  1. ↑ Чтобы понять, что здесь происходит, прочитайте генератор справа налево. a_list — отображаемый список. Python последовательно перебирает элементы списка a_list, временно присваивая значение каждого элемента переменной elem. Затем применяет функцию elem * 2 и добавляет результат в возвращаемый список.
  2. ↑ Генератор создаёт новый список, не изменяя исходный.
  3. ↑ Можно присвоить результат работы генератора списка отображаемой переменной. Python создаст новый список в памяти и, когда результат работы генератора будет получен, присвоит его исходной переменной.

В генераторах списков можно использовать любые выражения Python, включая функции модуля os, применяемые для работы с файлами и каталогами.

> > > import os, glob > > > glob. glob('*. xml') ['feed-broken. xml', 'feed-ns0. xml', 'feed. xml'] [1]
> > > [os. path. realpath(f) for f in glob. glob('*. xml')] ['c: \\Users\\pilgrim\\diveintopython3\\examples\\feed-broken. xml', 'c: \\Users\\pilgrim\\diveintopython3\\examples\\feed-ns0. xml', 'c: \\Users\\pilgrim\\diveintopython3\\examples\\feed. xml'] [2]
  1. ↑ Это выражение возвращает список всех. xml-файлов в текущем рабочем каталоге.
  2. ↑ Этот генератор принимает список всех. xml-файлов и преобразует его в список полных путей.

При генерировании списков можно также фильтровать элементы, чтобы отбросить некоторые значения.

> > > import os, glob
> > > [f for f in glob. glob('*. py') if os. stat(f). st_size > 6000] ['pluraltest6. py', 'romantest10. py', 'romantest6. py', 'romantest7. py', 'romantest8. py', 'romantest9. py'] [1]
  1. ↑ Чтобы профильтровать список, добавьте оператор if в конце генератора списка. Выражение, стоящее после оператора if, будет вычислено для каждого элемента списка. Если это выражение будет истинно, данный элемент будет обработан и включён в генерируемый список. В данной строке генерируется список всех. py-файлов в текущей директории, а оператор if фильтрует этот список, оставляя только файлы размером больше 6000 байт. Таких файлов только шесть, поэтому будет сгенерирован список из шести имён файлов.

Все рассмотренные примеры генераторов списков использовали простые выражения: умножение числа на константу, вызов одной функции или просто возврат элемента списка без изменений (после фильтрации). Но при генерации списков можно использовать выражения любой сложности.

> > > import os, glob
> > > [(os. stat(f). st_size, os. path. realpath(f)) for f in glob. glob('*. xml')] [(3074, 'c: \\Users\\pilgrim\\diveintopython3\\examples\\feed-broken. xml'), (3386, 'c: \\Users\\pilgrim\\diveintopython3\\examples\\feed-ns0. xml'), (3070, 'c: \\Users\\pilgrim\\diveintopython3\\examples\\feed. xml')] > > > import humansize [1]
> > > [(humansize. approximate_size(os. stat(f). st_size), f) for f in glob. glob('*. xml')] [('3. 0 KiB', 'feed-broken. xml'), ('3. 3 KiB', 'feed-ns0. xml'), ('3. 0 KiB', 'feed. xml')] [2]
  1. ↑ Этот генератор ищет все. xml-файлы в текущем рабочем каталоге, получает размер каждого файла (вызывая функцию os. stat()), и создает кортеж из размера файла и абсолютного пути каждого файла (вызывая функцию os. path. realpath()).
  2. ↑ Этот генератор, основанный на предыдущем, вызывает функцию approximate_size(), передавая ей размер каждого. xml-файла.
Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...