summaryrefslogtreecommitdiff
path: root/PYTHON/PATH.md
blob: 6eaa7c7813fc1942e3b14a38bd738a79a04e10fd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
```python
import pathlib

p = pathlib.Path(__file__)
print(p)
# получим путь к файлу, в котором сейчас находимся:

/home/name/package/example.py

```

```
from pathlib as Path
```
- `Path.cwd()`: Возвращает путь объекта текущей рабочей директории;
- `Path.home()`: Возвращает путь объекта домашней директории;
- `Path.stat()`: Возвращает информацию о пути;
- `Path.chmod()`: Меняет режим и уровень доступа файла;
- `Path.glob(pattern)`: Получение всех файлов которые соответствую паттерну, например `*.jpg` (все картинки) или `*.mp3` (все песни);
- `Path.mkdir()`: создает новую папку по данному пути;
- `Path.open()`: Открывает файл, созданный в пути;
- `Path.rename()`: Переименовывает файл или директорию указанной цели;
- `Path.rmdir()`: Удаляет пустую директорию;
- `Path.unlink()`: Удаляет файл или символическую ссылку.


## Генерация кроссплатформенных путей в Pathlib

Пути используют разные соглашения в разных операционных системах. Windows использует обратный слеш `\` между названиями папок, тогда как все другие популярные операционные системы используют прямой слеш `/`.

Если вы хотите, чтобы ваш код работал, независимо от базовой ОС, вам нужно будет обрабатывать различные соглашения, характерные для базовой платформы. Модуль Pathlib упрощает работу с путями к файлам. В Pathlib можно просто передать путь или название файла объекту `Path()`, используя слеш, независимо от ОС. Pathlib занимается всем остальным.

Python

|   |   |
|---|---|
|1|pathlib.Path.home() / 'python' / 'samples' / 'test_me.py'|

Объект `Path()` конвертирует `/` в слеш соответствующий операционной системе. `pathlib.Path` может представлять путь Windows или Posix. Кроме того, Pathlib решает многие кросс-функциональные баги, легко обрабатывая пути.

## Получение информации о пути в Pathlib

Во время работы с путями зачастую требуется найти родительскую директорию файла/папки или получить символические ссылки. У класса Path есть несколько удобных для этого методов, различные части пути доступны как свойства, что включают следующее:

- `drive`: [строка](https://python-scripts.com/string "Создание строки в питоне"), что представляет название жесткого диска. К примеру, `PureWindowsPath('c:/Program Files/CSV').drive` вернет `"C:"`;
- `parts`: возвращает [кортеж](https://python-scripts.com/lists-tuples-dictionaries#tuple "Создать кортеж в питоне"), что дает доступ к компонентам пути;
- `name`: компонент пути без директории;
- `parent`: последовательность обеспечивает доступ к логическим предкам пути;
- `stem`: финальный компонент пути без суффикса;
- `suffix`: разрешение файла финального компонента;
- `anchor`: часть пути перед директорией. `/` используется для создания дочерних путей и имитации поведения `os.path.join`;
- `joinpath`: совмещает путь с предоставленными аргументами;
- `match(pattern)`: возвращает `True/False`, основываясь на совпадении пути с предоставленным шаблоном поиска.

Например, у нас есть данный путь `"/home/projects/pyscripts/python/sample.md"`:

- `path`: — возвращает _PosixPath(‘/home/projects/pyscripts/python/sample.md’);_
- `path.parts`: — возвращает _(‘/’, ‘home’, ‘projects’, ‘pyscripts’, ‘python’);_
- `path.name`: — возвращает _‘sample.md’;_
- `path.stem`: — возвращает _‘sample’;_
- `path.suffix`: — возвращает _‘.md’;_
- `path.parent`: — возвращает _PosixPath(‘/home/projects/pyscripts/python’);_
- `path.parent.parent`: — возвращает _PosixPath(‘/home/projects/pyscripts’);_
- `path.match('*.md')`: возвращает _True;_
- `PurePosixPath('/python').joinpath('edited_version')`: возвращает _(‘home/projects/pyscripts/python/edited_version._


## Альтернатива для модуля glob

Помимо модулей `os`, `os.path` в Python также доступен модуль `glob`, что предоставляет путь связанных утилит. Функция `glob.glob` модуля `glob` используется для **нахождения файлов**, соответствующих шаблону.

Python

|   |   |
|---|---|
|1<br><br>2<br><br>3<br><br>4|from glob import glob<br><br>top_xlsx_files = glob('*.xlsx') # Все файлы с расширением .xlsx<br><br>all_xlsx_files = glob('**/*.xlsx', recursive=True)|

Pathlib предоставляет свою реализацию `glob`:

Python

|                              |                                                                                                                               |
| ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
| 1<br><br>2<br><br>3<br><br>4 | from pathlib import Path<br><br>top_xlsx_files = Path.cwd().glob('*.xlsx')<br><br>all_xlsx_files = Path.cwd().rglob('*.xlsx') |

Функциональность **glob** доступна с объектами `Path`. Следовательно, модуль Pathlib упрощают сложные задачи.

## Чтение и запись файлов с использованием Pathlib

Следующие методы используются для выполнения основных операций, таких как **чтение и запись файлов**:

- `read_text`: Файл открывается в **текстовом режиме** для чтения содержимого файла и его закрытия после чтения;
- `read_bytes`: Используется для открытия файла в **бинарном режиме**, возвращения содержимого в бинарном форме и последующего закрытия файла;
- `write_text`: Используется для открытия файла, записи туда текста и последующего закрытия;
- `write_bytes`: Используется для записи бинарных данных в файл и закрытия файла по завершении процесса.

Давайте испытаем модуль Pathlib используя популярные файловые операции. Следующий пример используется для **чтения содержимого файла**:

Python

|   |   |
|---|---|
|1<br><br>2|path = pathlib.Path.cwd() / 'Pathlib.md'<br><br>path.read_text()|

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

Python

|                              |                                                                                                                      |
| ---------------------------- | -------------------------------------------------------------------------------------------------------------------- |
| 1<br><br>2<br><br>3<br><br>4 | from pathlib import Path<br><br>p = Path('sample_text_file')<br><br>p.write_text('Образец данных для записи в файл') |