• Если вы хотите убедиться, что ваши коды только манипулируют путями без доступа к операционной системе.
  • Вы можете использовать PureWindowPath, если хотите манипулировать путем окна на машине Unix и наоборот.

Основное использование Pathlib.

  • Импортировать основной класс; из пути импорта pathlib
  • Для разбора каталогов/подкаталогов/файлов с помощью os.scandir, os.walk или более простого метода glob.
  • Свойства пути запроса.
  • Откройте файл.

Путь

Класс Path является основным классом, предоставляемым модулем pathlib. Мы собираемся использовать его при выполнении ряда операций с файлами и каталогами.

Создание объекта PurePath.

  • Есть три способа получить доступ к его классам/разновидностям. Однако помните, что PurePath не может получить доступ к файловой системе.

Использование универсального PurePath; Создание экземпляра PurePath создаст либо PurePosixPath, либо PureWindowPath, в зависимости от операционной системы вашего компьютера. В настоящее время я использую Windows, однако я запускаю свой код с помощью VSC на своей машине с Windows. Поэтому тип пути будет PureWindowPath.

from pathlib import PurePath
p = PurePath('subdir1')
print(p)
PureWindowsPath('subdir1')
  • Используйте PureWindowspath, если вы работаете на локальном компьютере с Windows, поскольку он представляет собой путь к файловой системе Windows.
from pathlib import PureWindowsPath
  • Используйте PurePosixPath для создания пути к файлу, если вы работаете на машине, отличной от Windows, и хотите создать чистый путь.
from pathlib import PurePosixPath

NB:

  • Аргумент, передаваемый в любой из PurePath, может быть либо строкой, либо другим объектом пути. И когда аргумент пуст, предполагается текущий рабочий каталог.
  • Независимо от ОС вашего локального компьютера, вы можете создавать экземпляры всех трех классов. Это потому, что они не предоставляют никаких операций для доступа к файловой системе, а только манипуляции.

Общие методы и свойства PurePath

# Import the neccessary libraries
import pathlib, glob, os
from pathlib import Path, PurePath, PurePosixPath, PureWindowsPath
sample_dir ='C:/Users/Techa/pythondirectories/maindir/sample3.ipynb'
q = PurePath(sample_dir)
  • Я создал объект PurePath выше. В последующих ячейках мы рассмотрим некоторые распространенные методы, доступные в PurePath.
# .drive: Its a string that represent the drive letter or name.
q.drive
'C:'
#.root : a string that represent the root of the path.
q.root
'\\'
# .anchor : produces a string of the drive and root concatenated.
q.anchor
'C:\\'
# .parents : It provide the logical access to sequence of parent directory of the  specified path. 
#Note that a similar method to this is using .parent, 
# which only give the next logical parent and not a sequence that can be sliced.
print(q.parent)
print(q.parents[0])
print(q.parents[1])
C:\Users\Techa\pythondirectories\maindir
C:\Users\Techa\pythondirectories\maindir
C:\Users\Techa\pythondirectories
# .parts : gives access to individual parts/components of a given path
q.parts
('C:\\', 'Users', 'Techa', 'pythondirectories', 'maindir', 'sample3.ipynb')
# .name : returns the final part/component of the path excluding the drive and root.
q.name
'sample3.ipynb'
# .suffix : returns the file extension of the final component of a path. 
# while  .suffixes will return a list of path file extensions
print(q.suffix)
print(q.suffixes)
.ipynb
['.ipynb']
# .stem : returns the final path components without the extension.
q.stem
'sample3'
# .is_absolute : Return a boolean output, which signifies if the specified path is absolute or not. 
# A path is called absolute if it has both a drive and root.
q.is_absolute()
True

Бетонные дорожки

Эти пути являются производными от чистых путей, поэтому они имеют в дополнение ко всем возможным операциям в чистых путях (некоторые общие из них показаны выше) возможность доступа к файловым системам. Как и описанные выше чистые пути, конкретные пути также могут быть созданы тремя различными способами, включая использование Path, PosixPath и WindowsPath. Вы можете создать экземпляр только того типа класса, который соответствует пути файловой системы вашего компьютера. Однако я буду использовать только Path, так как он совместим со всеми машинами.

Существует несколько способов создания пути из объекта пути, например, использование методов класса (например, текущий рабочий каталог и домашний каталог), передача строки в качестве аргумента объекту пути, объединение частей пути и т. д.

dir_to_scan = 'C:/Users/Techa/pythondirectories/maindir'
p =Path(dir_to_scan)
p
WindowsPath('C:/Users/Techa/pythondirectories/maindir')

Метод бетонной дорожки.

Есть ряд методов, которые доступны для использования с конкретными путями в дополнение к методам в purepaths. Если такого пути не существует, это вызовет ошибку OSError. Давайте рассмотрим некоторые из распространенных методов, используя путь, созданный в ячейке выше.

# Use Path.cwd() to return a new path object representing the current work directory.
Path.cwd()
WindowsPath('c:/Users/Techa/pythondirectories/maindir')
# Use Path.home() to return a new path object which points to the user home directory.
Path.home()
WindowsPath('C:/Users/Techa')
# Path.exists() return True if the path points to an existing file or directory.
p.exists()
True
# Return true if the path point to a directory
print(p.is_dir())
True
# Return true if the path point to a regular file.
print(p.is_file())
False

Пройдемся по каталогам.

  • Методы обхода каталога включают
  • ос.скандир
  • os.walk
  • используя метод глобуса.

1.0 Использование os.scandir

  • Это позволяет вам анализировать файл и каталог по заданному пути.
  • Он возвращает объект DirEntry, а не путь Obj.
  • Он не анализирует подкаталоги автоматически.
folders = []
files = []

for entry in os.scandir(p):
    if entry.is_dir():
        folders.append(entry)
    elif entry.is_file():
        files.append(entry)
print('Folders - {}'.format(folders))
print('Files - {}'.format(files))
Folders - [<DirEntry '.ipynb_checkpoints'>, <DirEntry 'subdir1'>, <DirEntry 'subdir2'>, <DirEntry 'subdir3'>, <DirEntry 'sub_dir'>]
Files - [<DirEntry 'data2.txt'>, <DirEntry 'data_01.txt'>, <DirEntry 'data_01_backup.txt'>, <DirEntry 'data_02.txt'>, <DirEntry 'data_02_backup.txt'>, <DirEntry 'data_03.txt'>, <DirEntry 'data_03_backup.txt'>, <DirEntry 'exe.ipynb'>, <DirEntry 'exe2.py'>, <DirEntry 'sample3.ipynb'>, <DirEntry 'superadmin.py'>, <DirEntry 'train.py'>]

2.0 Использование os.walk()

  • В отличие от os.scandir(). os.walk() автоматически проанализирует любые подкаталоги, присутствующие в данном пути.
  • Он возвращает строку вместо объекта Path.
for dirName, subdirList, fileList in os.walk(p):
    print('Found directory: %s' % dirName)
    for fname in fileList:
        print('\t%s' % fname)
Found directory: C:\Users\Techa\pythondirectories\maindir
	data2.txt
	data_01.txt
	data_01_backup.txt
	data_02.txt
	data_02_backup.txt
	data_03.txt
	data_03_backup.txt
	exe.ipynb
	exe2.py
	sample3.ipynb
	superadmin.py
	train.py
Found directory: C:\Users\Techa\pythondirectories\maindir\.ipynb_checkpoints
	sample3-checkpoint.ipynb
Found directory: C:\Users\Techa\pythondirectories\maindir\subdir1
	blank.csv
	file1.py
	file2.py
Found directory: C:\Users\Techa\pythondirectories\maindir\subdir2
	setput.tar.csv
Found directory: C:\Users\Techa\pythondirectories\maindir\subdir3
Found directory: C:\Users\Techa\pythondirectories\maindir\sub_dir
	file4.py
	file5.py

3.0 Использование глоба.

  • Два приведенных выше метода требуют ряда ручных операций и написания функций только для доступа к файлу в системе.
  • Более простой и легкий в использовании подход — glob.
  • Glob — это сопоставление пути к файлу.
  • Это полезно в любой ситуации, когда вашей программе необходимо найти список файлов в файловой системе с именами, соответствующими шаблону. Например, если вам требуется список имен файлов с определенным расширением, префиксом или любой общей строкой в ​​середине, использование glob вместо написания кода для разбора файла будет более интуитивно понятным.
  • подстановочные знаки
  • Звездочка (*) соответствует нулю или более символов в сегменте имени.
  • Наиболее распространенными подстановочными знаками являются *, ? и […].

# the code will return all the files in the path and not in the top level or subdirectories.
for i in p.glob('*.*'):
    print(i)
C:\Users\Techa\pythondirectories\maindir\.ipynb_checkpoints
C:\Users\Techa\pythondirectories\maindir\data2.txt
C:\Users\Techa\pythondirectories\maindir\data_01.txt
C:\Users\Techa\pythondirectories\maindir\data_01_backup.txt
C:\Users\Techa\pythondirectories\maindir\data_02.txt
C:\Users\Techa\pythondirectories\maindir\data_02_backup.txt
C:\Users\Techa\pythondirectories\maindir\data_03.txt
C:\Users\Techa\pythondirectories\maindir\data_03_backup.txt
C:\Users\Techa\pythondirectories\maindir\exe.ipynb
C:\Users\Techa\pythondirectories\maindir\exe2.py
C:\Users\Techa\pythondirectories\maindir\sample3.ipynb
C:\Users\Techa\pythondirectories\maindir\superadmin.py
C:\Users\Techa\pythondirectories\maindir\train.py
for i in p.glob('**/*.*'):
    print(i)
C:\Users\Techa\pythondirectories\maindir\.ipynb_checkpoints
C:\Users\Techa\pythondirectories\maindir\data2.txt
C:\Users\Techa\pythondirectories\maindir\data_01.txt
C:\Users\Techa\pythondirectories\maindir\data_01_backup.txt
C:\Users\Techa\pythondirectories\maindir\data_02.txt
C:\Users\Techa\pythondirectories\maindir\data_02_backup.txt
C:\Users\Techa\pythondirectories\maindir\data_03.txt
C:\Users\Techa\pythondirectories\maindir\data_03_backup.txt
C:\Users\Techa\pythondirectories\maindir\exe.ipynb
C:\Users\Techa\pythondirectories\maindir\exe2.py
C:\Users\Techa\pythondirectories\maindir\sample3.ipynb
C:\Users\Techa\pythondirectories\maindir\superadmin.py
C:\Users\Techa\pythondirectories\maindir\train.py
C:\Users\Techa\pythondirectories\maindir\.ipynb_checkpoints\sample3-checkpoint.ipynb
C:\Users\Techa\pythondirectories\maindir\subdir1\blank.csv
C:\Users\Techa\pythondirectories\maindir\subdir1\file1.py
C:\Users\Techa\pythondirectories\maindir\subdir1\file2.py
C:\Users\Techa\pythondirectories\maindir\subdir2\setput.tar.csv
C:\Users\Techa\pythondirectories\maindir\sub_dir\file4.py
C:\Users\Techa\pythondirectories\maindir\sub_dir\file5.py
# If you want to recursively walk through all directories, use the following glob syntax:
for i in p.glob('**/*.*'):
    print(i.name)
.ipynb_checkpoints
data2.txt
data_01.txt
data_01_backup.txt
data_02.txt
data_02_backup.txt
data_03.txt
data_03_backup.txt
exe.ipynb
exe2.py
sample3.ipynb
superadmin.py
train.py
sample3-checkpoint.ipynb
blank.csv
file1.py
file2.py
setput.tar.csv
file4.py
file5.py
  • Существует еще один вариант использования rglob для автоматического рекурсивного перемещения по подкаталогам.
  • Это позволяет вам создать ярлык, содержащий определенные файлы.
list(p.rglob('*.py'))
[WindowsPath('C:/Users/Techa/pythondirectories/maindir/exe2.py'),
 WindowsPath('C:/Users/Techa/pythondirectories/maindir/superadmin.py'),
 WindowsPath('C:/Users/Techa/pythondirectories/maindir/train.py'),
 WindowsPath('C:/Users/Techa/pythondirectories/maindir/subdir1/file1.py'),
 WindowsPath('C:/Users/Techa/pythondirectories/maindir/subdir1/file2.py'),
 WindowsPath('C:/Users/Techa/pythondirectories/maindir/sub_dir/file4.py'),
 WindowsPath('C:/Users/Techa/pythondirectories/maindir/sub_dir/file5.py')]
# returns all files ending with .csv
list(p.rglob('*csv'))
[WindowsPath('C:/Users/Techa/pythondirectories/maindir/subdir1/blank.csv'),
 WindowsPath('C:/Users/Techa/pythondirectories/maindir/subdir2/setput.tar.csv')]
# Return a list of files, except those ending with txt
list(p.rglob('*.[!txt]*'))
[WindowsPath('C:/Users/Techa/pythondirectories/maindir/.ipynb_checkpoints'),
 WindowsPath('C:/Users/Techa/pythondirectories/maindir/exe.ipynb'),
 WindowsPath('C:/Users/Techa/pythondirectories/maindir/exe2.py'),
 WindowsPath('C:/Users/Techa/pythondirectories/maindir/sample3.ipynb'),
 WindowsPath('C:/Users/Techa/pythondirectories/maindir/superadmin.py'),
 WindowsPath('C:/Users/Techa/pythondirectories/maindir/train.py'),
 WindowsPath('C:/Users/Techa/pythondirectories/maindir/.ipynb_checkpoints/sample3-checkpoint.ipynb'),
 WindowsPath('C:/Users/Techa/pythondirectories/maindir/subdir1/blank.csv'),
 WindowsPath('C:/Users/Techa/pythondirectories/maindir/subdir1/file1.py'),
 WindowsPath('C:/Users/Techa/pythondirectories/maindir/subdir1/file2.py'),
 WindowsPath('C:/Users/Techa/pythondirectories/maindir/subdir2/setput.tar.csv'),
 WindowsPath('C:/Users/Techa/pythondirectories/maindir/sub_dir/file4.py'),
 WindowsPath('C:/Users/Techa/pythondirectories/maindir/sub_dir/file5.py')]

Создать новый каталог

  • Path().mkdir() создаст новый каталог по указанному пути.
  • Метод mkdir() принимает три аргумента. parent и exists_ok являются общими, и по умолчанию они имеют значение False.
  • Родитель вызывает ошибку FileNotFound в случае отсутствия родителя, тогда как exists_ok вызывает ошибку FileExists, если данный каталог уже существует.
  • Мы можем установить их в True, чтобы игнорировать и обновлять уже существующий каталог.
Path.cwd()
WindowsPath('c:/Users/Techa/pythondirectories/maindir')
#  I want to create a new folder in my current working directory called ‘delicious’ directory. Which does not exist before,
#  Since it doesnt exist before, creating  ‘walnut’ and the ‘waffles’ directories under it will result into error.
# To avoid this, I will set both arguments in mkdir() to True.
cwd = Path.cwd()
(cwd / 'delicious' / 'walnut' / 'waffles').mkdir(parents=True, exist_ok=True)

КОНЕЦ