Модуль OS Python

Этот модуль предоставляет переносимый способ использования функциональности, зависящей от операционной системы.

Pathlib против модуля OS

Модуль pathlib предоставляет гораздо больше функциональности, чем перечислено здесь, например, получение имени файла, получение расширения файла, чтение/запись файла без ручного открытия и т. д. См. официальную документацию, если вы хотите узнать больше.
Для более глубокого изучения обоих см. страницу Пути к файлам и каталогам.

Пути в Linux и Windows

В Windows пути записываются с использованием обратной косой черты (\) в качестве разделителя между именами папок. В операционных системах на базе Unix, таких как macOS, Linux и BSD, в качестве разделителя путей используется прямая косая черта (/). Объединение путей может быть головной болью, если ваш код должен работать на разных платформах.

К счастью, Python предоставляет нам os.path.join для обработки этого.

import os

# Объединить компоненты пути, используя правильный разделитель для ОС
os.path.join('usr', 'bin', 'spam')
usr\bin\spam

Объединение путей полезно, если вам нужно создать разные пути к файлам в одном и том же каталоге.

my_files = ['accounts.txt', 'details.csv', 'invite.docx']

# Объединить каждое имя файла с базовым каталогом
for filename in my_files:
    print(os.path.join('/home/labex/project', filename))
/home/labex/project/accounts.txt
/home/labex/project/details.csv
/home/labex/project/invite.docx

Текущий рабочий каталог

import os

# Получить текущий рабочий каталог
os.getcwd()
/home/labex/project
# Изменить текущий рабочий каталог
os.chdir('/usr/bin')

# Проверить изменение
os.getcwd()
/usr/bin

Создание новых папок

import os
# Создать каталоги рекурсивно (создает все родительские каталоги при необходимости)
os.makedirs('/tmp/delicious/walnut/waffles')

Абсолютные и относительные пути

Существует два способа указать путь к файлу.

  • Абсолютный путь, который всегда начинается с корневой папки
  • Относительный путь, который относителен к текущему рабочему каталогу программы

Также существуют папки с точкой (.) и двумя точками (..). Это не настоящие папки, а специальные имена, которые можно использовать в пути. Одна точка (“dot”) для имени папки — это сокращение для “текущий каталог”. Две точки (“dot-dot”) означают “родительский каталог”.

Обработка абсолютных путей

Чтобы проверить, является ли путь абсолютным:

import os
# Проверить, является ли путь абсолютным (начинается с корня)
os.path.isabs('/')
True
# Относительные пути возвращают False
os.path.isabs('..')
False

Вы также можете извлечь абсолютный путь:

import os
# Сначала получить текущий каталог
os.getcwd()
/home/labex/project
# Преобразовать относительный путь в абсолютный
os.path.abspath('..')
/home

Обработка относительных путей

Вы можете получить относительный путь от начального пути до другого пути.

import os
# Получить относительный путь от начального пути до целевого пути
os.path.relpath('/etc/passwd', '/')
etc/passwd

Валидность пути и файла

Проверка существования файла/каталога

import os

# Проверить, существует ли путь (файл или каталог)
os.path.exists('.')
True
os.path.exists('setup.py')
True
os.path.exists('/etc')
True
os.path.exists('nonexistentfile')
False

Проверка, является ли путь файлом

import os

# Проверить, является ли путь файлом
os.path.isfile('setup.py')
True
os.path.isfile('/home')
False
os.path.isfile('nonexistentfile')
False

Проверка, является ли путь каталогом

import os

# Проверить, является ли путь каталогом
os.path.isdir('/')
True
os.path.isdir('setup.py')
False
os.path.isdir('/spam')
False

Получение размера файла в байтах

import os

# Получить размер файла в байтах
os.path.getsize('/usr/bin/python3')
776192

Листинг каталогов

import os

# Вывести список всех файлов и каталогов в указанном пути
os.listdir('/usr/bin')
['0409', '12520437.cpx', '12520850.cpx', '5U877.ax', 'aaclient.dll',
--snip--
'xwtpdui.dll', 'xwtpw32.dll', 'zh-CN', 'zh-HK', 'zh-TW', 'zipfldr.dll']

Размеры файлов каталогов

ПРЕДУПРЕЖДЕНИЕ

Сами по себе каталоги также имеют размер! Поэтому вам может понадобиться проверить, является ли путь файлом или каталогом, используя методы, обсуждавшиеся в предыдущем разделе.

import os
total_size = 0

# Рассчитать общий размер всех файлов в каталоге
for filename in os.listdir('/usr/bin'):
    # Объединить путь к каталогу с именем файла и получить размер
    total_size = total_size + os.path.getsize(os.path.join('/usr/bin', filename))
print(total_size)
1117846456

Удаление файлов и папок

  • Вызов os.unlink(path) удалит файл по указанному пути.

  • Вызов os.rmdir(path) удалит папку по указанному пути. Эта папка должна быть пуста от каких-либо файлов или папок.

Обход дерева каталогов

import os

# Рекурсивный обход дерева каталогов
for folder_name, subfolders, filenames in os.walk('/tmp/delicious'):
    print(f'Текущая папка {folder_name}')
    # Итерация по подкаталогам
    for subfolder in subfolders:
        print(f'ПОДПАПКА {folder_name}: {subfolder}')
    # Итерация по файлам
    for filename in filenames:
        print(f'ФАЙЛ ВНУТРИ {folder_name}: filename{filename}')
    print('')
Текущая папка /tmp/delicious
ПОДПАПКА /tmp/delicious: cats
ПОДПАПКА /tmp/delicious: walnut
ФАЙЛ ВНУТРИ /tmp/delicious: spam.txt

Текущая папка /tmp/delicious/cats
ФАЙЛ ВНУТРИ /tmp/delicious/cats: catnames.txt
ФАЙЛ ВНУТРИ /tmp/delicious/cats: zophie.jpg

Текущая папка /tmp/delicious/walnut
ПОДПАПКА /tmp/delicious/walnut: waffles

Текущая папка /tmp/delicious/walnut/waffles
ФАЙЛ ВНУТРИ /tmp/delicious/walnut/waffles: butter.txt

Связанные ссылки

Morty Proxy This is a proxified and sanitized view of the page, visit original site.