Просто чтобы познакомить вас с основами модуляpathlib
!
Последнее обновление: 12 января 2022 г.
Задний план
Модуль pathlib
был впервые представлен в Python 3.4.
Раньше при работе с путями в Python люди обращались к модулю os
. Модуль pathlib
значительно упрощает этот процесс.
Темы охватывали
- Создание объекта
Path
- Объединение
Path
объектов - Перебор файлов и каталогов
- Выбор компонентов объекта
Path
- Извлечение информации о файле
- Чтение и запись в файл
Предпосылки
Модуль pathlib
необходимо импортировать перед использованием соответствующих функций. Таким образом, следующая строка должна быть вставлена в начало каждого примера.
import pathlib
Соглашения
Для краткости, в контексте ниже p
обозначает объект pathlib.Path
.
1. Создание объекта пути
Решение
- Создайте объект
str
, который содержит путь к файлу или каталогу. - Передайте этот объект
str
в качестве параметра.Path()
модуляpathlib
. - Он возвращает объект
pathlib.Path
(сокращенно объектPath
ниже). См. Код 1.1.
Код 1.1
location = r'D:\team' p = pathlib.Path(location)
На виду
- В Microsoft Windows обратная косая черта
\
часто используется для обозначения местоположения файла или каталога. Примером может бытьD:\team
, как показано выше. - Однако это может привести к нежелательным эффектам из-за escape-символов. Символ
\t
вD:\team
будет интерпретироваться как символtab
. - Решение 1. Всегда используйте необработанные строковые литералы для представления путей Microsoft Windows. Это строковые литералы, перед которыми стоит
r
. Примером может бытьr'D:\team'
, как показано выше. - Решение 2. Вместо использования необработанных строковых литералов вы можете использовать прямую косую черту
/
вместо обратной косой черты\
, как показано ниже:
location = 'D:/team' p = pathlib.Path(location)
На виду
- Создание объекта
Path
, указывающего на несуществующий файл или каталог, не вызывает никаких ошибок! - Вызов некоторых свойств объекта
Path
также не вызывает никаких ошибок! Примером может служить свойство.name
объектаPath
(см. пункт 4 ниже). - Решение. Используйте
p.exists()
для проверки существования файла или каталога, на который указываетp
. - Он возвращает
True
, еслиp
указывает на существующий файл или каталог, иFalse
в противном случае.
location = 'D:/team' p = pathlib.Path(location) if p.exists(): print('The path exists.')
2. Объединение объектов пути
Решение
Используйте символ косой черты /
. См. Код 2.1.
Сценарий
Предположим, что в среде Microsoft Windows используется следующая файловая структура:
D:\team├
── project 1 │├
── file 1a.txt │├
── file 1b.py │└
── file 1c.txt │└
── file 2.jpg
Код 2.1
base_dir = pathlib.Path('D:/team') dir_1 = base_dir / 'project 1' file_1a = base_dir / 'project 1' / 'file 1a.txt' file_2 = base_dir / 'file 2.jpg'
На виду
- Пока существует по крайней мере один объект
Path
, вы можете использовать столько косых черт/
, сколько вам нужно, чтобы соединить несколько путей, или сочетание объектовPath
и строки, как показано выше.
3. Перебор файлов и каталогов
Решение
Есть 2 основных способа сделать это:
- Способ 1. Вызовите
p.iterdir()
, чтобы вернуть все файлы и каталоги. См. код 3.1. - Способ 2 – вызовите
p.glob()
, чтобы указать шаблон файлов или каталогов, которые вы хотите получить. См. код 3.2. - И
.iterdir()
, и.glob()
возвращают объект-генератор, который даетPath
объектов в этомPath
объекте.
Сценарий
Предположим, что в среде Microsoft Windows используется следующая файловая структура (такая же, как в пункте 2 выше):
D:\team├
── project 1 │├
── file 1a.txt │├
── file 1b.py │└
── file 1c.txt │└
── file 2.jpg
Код 3.1
location = 'D:/team/project 1' p = pathlib.Path(location) for child in p.iterdir(): print(child) # output # ------ # D:\team\project 1\file 1a.txt # D:\team\project 1\file 1b.py # D:\team\project 1\file 1c.txt
Код 3.2
Следующее возвращает все файлы с расширением файла txt
.
location = 'D:/team/project 1' p = pathlib.Path(location) for child in p.glob('*.txt'): print(child) # output # ------ # D:\team\project 1\file 1a.txt # D:\team\project 1\file 1c.txt
На виду
- Если
p
указывает на несуществующий файл или каталог, вызовp.iterdir()
выдаетFileNotFoundError
. - Решение 1. Вызовите
p.exists()
, чтобы проверить существование файла или каталога, на который указываетp
.
location = 'D:/team/project 1' path = pathlib.Path(location) if path.exists(): for child in path.iterdir(): print(child)
- Решение 2. Вызовите
p.is_dir()
, чтобы проверить существование каталога, на который указываетp
. - В качестве бонуса
p.is_dir()
также проверяет, указывает лиp
на существующий каталог (но не на файл). Поэтому нет необходимости комбинировать.exists()
и.is_dir()
.
location = 'D:/team/project 1' p = pathlib.Path(location) if p.is_dir(): for child in p.iterdir(): print(child)
4. Выбор компонентов объекта Path
Решение
В объекте Path
обычно используются следующие свойства:
.name
: возвращает объектstr
, который содержит конечный компонент пути..parent
: возвращает объектPath
, который является логическим родителем существующего объектаPath
..stem
: возвращает объектstr
, который содержит конечный компонент пути, без его суффикса (т. е. расширения файла)..suffix
: возвращает объектstr
, который содержит расширение файла конечного компонента.
Код 4.1
Если p
указывает на файл:
location = 'D:/team/project 1/file 1a.txt' p = pathlib.Path(location) print(p.name) # output # ------ # file 1a.txt print(p.parent) # output # ------ # D:\team\project 1 print(p.stem) # output # ------ # file 1a print(p.suffix) # output # ------ # .txt
Код 4.2
Если p
указывает на каталог:
location = 'D:/team/project 1' p = pathlib.Path(location) print(p.name) # output # ------ # project 1 print(p.parent) # output # ------ # D:\team print(p.stem) # output # ------ # project 1 print(p.suffix) # output # ------ # (empty string)
5. Извлечение информации о файле
Решение
Используйте .stat()
объекта Path
, чтобы вернуть объект os.stat_result
(который является tuple
).
.st_size
: возвращает объектint
, который представляет собой размер файла в байтах..st_atime
: возвращает объектfloat
, который представляет собой время последнего доступа к файлу, выраженное в секундах..st_mtime
: возвращает объектfloat
, который представляет собой время последней модификации содержимого файла, выраженное в секундах..st_ctime
: возвращает объектfloat
, который представляет собой время создания (в Windows) файла, выраженное в секундах.
Код 5.1
location = 'D:/team/project 1/file 1a.txt' p = pathlib.Path(location) stat = p.stat() print(stat.st_size) # output # ------ # 32 print(stat.st_atime) # output # ------ # 1585759368.5348766 print(stat.st_mtime) # output # ------ # 1585759368.5348766 print(stat.st_ctime) # 1585719828.9005117
На виду
- Чтобы преобразовать время, выраженное в секундах, в локальный объект
datetime
, используйтеdatetime.fromtimestamp()
в модулеdatetime
. datetime.fromtimestamp()
возвращает объектdatetime.datetime
.- Продолжая пример выше:
import datetime local_dt = datetime.datetime.fromtimestamp(stat.st_mtime) print(local_dt) # output # ------ # 2020-04-02 00:42:48.534877
6. Чтение и запись в файл
Решение
Есть 2 распространенных способа сделать это:
- Способ 1 – используйте
p.open()
. См. Код 6.1. - Метод 2. Используйте встроенную функцию
open()
и передайтеp
в качестве первого аргумента. См. Код 6.2. - В обоих случаях укажите атрибут
mode
, чтобы определить, читаете ли вы файл и/или пишете в него. - По умолчанию для
mode
установлено значениеr
, что означает доступ только для чтения. - Для записи данных в файл см. Код 6.3.
Код 6.1
location = 'D:/team/project 1/file 1a.txt' p = pathlib.Path(location) with p.open(mode='r') as f: lines = [line for line in f] print(lines) # output # ------ # ['This is line 1\n', 'This is line 2\n']
Код 6.2
location = 'D:/team/project 1/file 1a.txt' p = pathlib.Path(location) with open(p, mode='r') as f: lines = [line for line in f] print(lines) # output # ------ # ['This is line 1\n', 'This is line 2\n']
Код 6.3
location = 'D:/team/project 1/file 1d.txt' p = pathlib.Path(location) with p.open(mode='w') as f: lines = ['This is line 1\n', 'This is line 2\n'] f.writelines(lines)
На виду
- При чтении из файла объект
Path
должен указывать на существующий файл. - Решение. Вызовите
p.is_file()
, чтобы проверить наличие файла, на который указываетp
.
location = 'D:/team/project 1/file 1a.txt' p = pathlib.Path(location) if p.is_file(): with open(p, mode='r') as f: lines = [line for line in f] print(lines)
- Для чтения данных из файла вы можете использовать
p.read_bytes()
илиp.read_text()
, которые возвращают объектstr
.
location = 'D:/team/project 1/file 1a.txt' p = pathlib.Path(location) data = p.read_text() print(data)
- Точно так же для записи данных в файл вы можете использовать
p.write_bytes()
илиp.write_text()
. - Это эквивалентно указанию
mode='w'
в.open()
, и поэтому файл будет перезаписан без предупреждения!
location = 'D:/team/project 1/file 1a.txt' p = pathlib.Path(location) lines = ['This is line 1\n', 'This is line 2\n'] data = ''.join(lines) p.write_text(data)
Ссылка
- Официальная документация на
pathlib
Хотите читать больше?
- Python: более быстрые способы импорта файлов данных (2 минуты на чтение)
- Python: основы pathlib (6 минут на чтение)
Понравилась эта статья? Похлопайте 👏 и поделитесь этой статьей!
Вы также можете стать участником Medium, чтобы продолжать узнавать больше. Часть вашего членского взноса пойдет непосредственно мне, чтобы поддержать меня в написании статей, подобных этой. Большое спасибо!