Просто чтобы познакомить вас с основами модуляpathlib!

Последнее обновление: 12 января 2022 г.

Задний план

Модуль pathlib был впервые представлен в Python 3.4.

Раньше при работе с путями в Python люди обращались к модулю os. Модуль pathlib значительно упрощает этот процесс.

Темы охватывали

  1. Создание объекта Path
  2. Объединение Path объектов
  3. Перебор файлов и каталогов
  4. Выбор компонентов объекта Path
  5. Извлечение информации о файле
  6. Чтение и запись в файл

Предпосылки

Модуль 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)

Ссылка

Хотите читать больше?

Понравилась эта статья? Похлопайте 👏 и поделитесь этой статьей!

Вы также можете стать участником Medium, чтобы продолжать узнавать больше. Часть вашего членского взноса пойдет непосредственно мне, чтобы поддержать меня в написании статей, подобных этой. Большое спасибо!