Модуль os позволяет работать с файлами и папками. Русские названия файлов и папок возвращаются и принимаются всеми функциями этого модуля в кодировке UTF-8. Советую вам использовать функции для перекодирования строк - методы decode и encode.
# -*- coding: utf-8 -*-
import os
#выводим списком все переменные
arr = dict(os.environ)
print(arr)
'''
вы можете проверить железо вашего пользователя.
Например архитектуру процессора.
'''
print('Операционная система:', arr['OS'])
#название операционной системы
print(os.name)
'''
вывод: nt
nt - виндовс
'''
проверка прав доступа к файлу или папке.
#os.F_OK - проверка наличия пути
res = os.access(r'C:\Users\Егор\AppData\Local\Programs\Python', os.F_OK)
print ('проверка наличия пути:',res)
'''
вывод:
проверка наличия пути: True
'''
#os.R_OK - проверка на возможность чтения
res = os.access(r'C:\Users\Егор\AppData\Local\Programs\Python', os.R_OK)
print ('проверка на возможность чтения:',res)
'''
вывод:
проверка на возможность чтения: True
'''
#os.W_OK - проверка на возможность записи
res = os.access(r'C:\Users\Егор\AppData\Local\Programs\Python', os.W_OK)
print ('проверка на возможность записи:',res)
'''
вывод:
проверка на возможность записи: True
'''
#os.X_OK - проверка на возможность выполнения
res = os.access(r'C:\Users\Егор\AppData\Local\Programs\Python', os.X_OK)
print ('проверка на возможность выполнения:',res)
'''
вывод:
проверка на возможность выполнения: True
'''
для смены директории поможет функция
#смена текущей директории.
os.chdir(r'D:\test')
cur_dir = os.path.abspath(os.curdir)
print(cur_dir)
'''
вывод:
D:\test
'''
cur_dir = os.getcwd()
print(cur_dir)
'''
вывод:
D:\test
'''
Вы можете менять права доступа к файлу. Обратите внимание на то, что на операционной системе виндовс нельзя заблокировать просмотр файла. Вы не сможете изменить режим записи файла. В линукс довольно продвинутая файловая система. Там команда chmod имеет массу настроек. Смотрите статью как изменить права у файла при помощи chmod BASH
#Изменяет права доступа файла.
os.chmod(r'D:\test', 666)
#если не получится 666, то используйте 0o666
os.chmod(r'D:\test', 0o666)
# альтернатива chmod
subprocess.call("chmod 0755 " + file, shell=True)
Вы можете вывести названия всех файлов в виде списка. Функция listdir возвращает список имен файлов и папок в указанной папке.
arr = os.listdir(r'D:\test')
print(arr)
'''
вывод:
['python.txt', 'readme.txt']
'''
os.mkdir(path[, access=777]) cоздаёт папку по указанному пути
os.mkdir(r'D:\test\folder1', 777)
#Параметры:
#path (str) – путь к каталогу
#access – права доступа
print(os.listdir(r'D:\test'))
'''
вывод:
['folder1', 'python.txt', 'readme.txt']
'''
Аналогичен функции mkdir? но автоматический создает промежуточные папки. Вы можете создать массу промежуточных папок. В примере ниже создаются недостающие папки: folder, f1, f2
os.makedirs(r'D:\test\folder\f1\f2', 777)
print(os.listdir(r'D:\test'))
'''
вывод:
['folder', 'folder1', 'python.txt', 'readme.txt']
'''
Функция remove(
os.remove(r'D:\test\readme.txt')
print(os.listdir(r'D:\test'))
'''
вывод:
['folder', 'folder1', 'python.txt']
'''
Если вы ошибётесь с названием файла, то появится ошибка FileNotFoundError. Для перехвата ошибки используйте перехват исключений try except. Смотрите статью выброс и перехват исключений в Python.
try:
os.remove(r'D:\test\readme.txt')
print(os.listdir(r'D:\test'))
except FileNotFoundError as msg:
print('неправильный путь к файлу:', msg)
'''
неправильный путь к файлу: [WinError 2]
Не удается найти указанный файл: 'D:\\test\\readme.txt'
'''
rmdir(path) удаляет папку по указанному пути. Параметры: path (str) – путь к каталогу. Обратите внимание на то что удаление происходит только если папка пустая. Вы должны очистить папку и только потом удалять папку
os.rmdir(r'D:\test\folder1')
print(os.listdir(r'D:\test'))
'''
removedirs(path) - Аналогичен функции rmdir, но автоматический
удаляет все родительские пустые папки
на операционной системе виндовс эта функция странно работает.
Пришлось удалить все дочерние файлы
и только потом удалять родительскую папку.
'''
#os.removedirs(r'D:\test\folder')
print(os.listdir(r'D:\test'))
'''
вывод:
['python.txt']
'''
os.rename(<старый файл/директория>, <новый файл/директория>). Функция os.rename() применяется тогда, когда нужно переименовать файл или папку. Посмотрите на пример.
os.rename(r'D:\test\python.txt', r'D:\test\python3.txt')
print(os.listdir(r'D:\test'))
'''
вывод:
['python3.txt']
'''
Метод startfile() позволяет нам «запустить» файл в привязанной к нему программе. Другими словами, мы можем открыть файл в соответствующей программе. Вы запускаете скрипт и открывается файл PDF. Он открывается в программе Adobe Reader. Происходит запуск файла как будто вы щелкнули двойным щелчком по файлу. Посмотрите на пример.
os.startfile(r'D:\test\yazyk_programmirovaniya_python.pdf')
'''
после того как скрип отработает, пройдёт несколько секунд и откроется файл
в соответствующей программе.
'''
Метод os.walk() дает нам возможность для итерации на корневом уровне пути. Это значит, что мы можем назначить путь к этой функции и получить доступ ко всем её подкаталогам и файлам.
arr = os.walk(r'D:\test')
print(list(arr))
'''
вывод:
[('D:\\test', ['folder1'], ['python3.txt',\
'Yazyk_programmirovaniya_Python.pdf']),
('D:\\test\\folder1', ['folder2'], []), ('D:\\test\\folder1\\folder2', [], [])]
'''
В этом примере мы выведем циклом все файлы и каталоги
path = r'D:\test'
for root, dirs, files in os.walk(path):
print('root:', root, 'dirs:', dirs, 'files:', files)
'''
вывод:
root: D:\test dirs: ['folder1'] files: ['python3.txt',\
'Yazyk_programmirovaniya_Python.pdf']
root: D:\test\folder1 dirs: ['folder2'] files: []
root: D:\test\folder1\folder2 dirs: [] files: []
'''
В этом примере мы немного изменим цикл и выведем в виде дерева список файлов.
for root, dirs, files in os.walk(path):
print(root)
for _dir in dirs:
print(_dir)
for _file in files:
print('|_',_file)
'''
вывод:
D:\test
folder1
|_ python3.txt
|_ Yazyk_programmirovaniya_Python.pdf
D:\test\folder1
folder2
D:\test\folder1\folder2
'''
os.path Подмодуль os.path модуля os имеет массу возможностей. Ознакомимся со следующими функциями:
#Функция basename вернет название файла пути.
filepath = os.path.basename(r'D:\Egor\обучение\python\script\module\os\os.py')
print('запускаемый скрипт:', filepath)
'''
вывод:
запускаемый скрипт: os.py
'''
Функция dirname возвращает только часть каталога пути.
filepath = os.path.dirname(r'D:\Egor\обучение\python\script\module\os\os.py')
print('путь до скрипта:', filepath)
'''
вывод:
путь до скрипта: D:\Egor\обучение\python\script\module\os
'''
Функция exists говорит нам, существует ли файл, или нет. Все что вам нужно, это указать ему путь.
filepath = os.path.exists(r'D:\Egor\обучение\python\script\module\os\os.py')
print('скрипт существует:', filepath)
'''
вывод:
скрипт существует: True
'''
Метод isdir связан с методом exists, так как он также тестируют присутствие или отсутствие файлов или папок на тех или иных путях. Однако, isdir проверяет только пути к папкам, Если вам нужно проверить путь, и не важно, папка это или файл, проще будет воспользоваться методом exists.
dir = os.path.isdir(r'D:\test')
print('такая папка существует:', dir)
'''
вывод:
такая папка существует: True
'''
Методы isfile проверяет путь к файлам.
dir = os.path.isfile(r'D:\test\python3.txt')
print('такой файл существует:', dir)
'''
вывод:
такой файл существует: True
'''
Метод join позволяет вам совместить несколько путей при помощи присвоенного разделителя. К примеру, в Windows, в роли разделителя выступает бэкслэш (косая черта, указывающая назад), однако в Linux функция разделителя присвоена косой черте, указывающей вперед (forward slash)
path = os.path.join(r'D:\test', 'python3.txt')
print(path)
'''
Вывод:
D:\test\python3.txt
'''
Метод split разъединяет путь на кортеж, который содержит каталог и файл.
arr_path = os.path.split(r'D:\test\python3.txt')
print(arr_path)
'''
вывод:
('D:\\test', 'python3.txt')
'''
обратите внимание на то, что функция не проверяет файл по типу. Если файл не указан, то функция вернёт предпоследнюю и последнюю директорию. В моём случае вернулись название диска и название последней папки.
arr_path = os.path.split(r'D:\test')
print(arr_path)
'''
вывод:
('D:\\', 'test')
'''
Вы можете передать значения сразу двум переменным. Функция возвращает кортеж из двух элементов.
dir_name, file_name = os.path.split(r'D:\test\python3.txt')
print('папка:', dir_name, 'название файла:', file_name)
'''
вывод:
папка: D:\test название файла: python3.txt
'''