- Если вы хотите убедиться, что ваши коды только манипулируют путями без доступа к операционной системе.
- Вы можете использовать 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)