From 4b624dda3f885433b472a54919ffd3abcf85e37b Mon Sep 17 00:00:00 2001 From: "o.korchevaya" <71932690+okorchevaya@users.noreply.github.com> Date: Sat, 7 May 2022 12:58:00 +0300 Subject: [PATCH 01/15] Update os.rst --- content/os.rst | 409 ++++++++++++++++++++++++++++++------------------- 1 file changed, 252 insertions(+), 157 deletions(-) diff --git a/content/os.rst b/content/os.rst index 7791bd7..1703b44 100644 --- a/content/os.rst +++ b/content/os.rst @@ -6,290 +6,385 @@ :status: published :author: Кауров Р.О. +Модуль os позволяет Python выполнять многие операции с файлами и папками, которые вы обычно выполняете в командной строке Linux. Модуль предоставляет функции для работы с операционной системой, при этом поведение функций не зависит от ОС, поэтому программы будут переносимыми. Модуль так же позволяет работать с файлами, папками, а так же со многими другими объектами операционной системы, как, например, процессы или переменные окружения. Познакомимся с самыми популярнфми функциями. -Модуль os предоставляет функции для работы с операционной системой, при этом поведение функций не зависит от ОС, поэтому программы будут переносимыми. Здесь я расписал часто используемые из них. Модуль позволяет работать с файлами, папками, а так же со многими другими объектами операционной системы, как, например, процессы или переменные окружения. +В ходе данной лабораторной работы мы научимся: -Давайте разберем функции для работы с файлами: +1. Работать со значениями среды -Работа с файлами -================ +2. Менять каталоги и находить тот, который в данный момент является рабочим -.. code-block:: python +3. Создавать и удалять папки и файлы + +4. Переименовывать папки и файлы + +5. Открывать файл в соответствующей ему программе + +6. Работать с путями - os.chmod(path, mode, *, dir_fd=None, follow_symlinks=True) -Функция меняет права доступа к объекту (mode - восьмеричное число) + +Для начала работы необходимо подключить модуль обычной командой import .. code-block:: python + import - os.remove(path, *, dir_fd=None) +Основные функции для работы с модулем +============================== -Удаляет путь к файлу. Если будет папка, функция вернет IsADirectoryError. На Windows почему-то файл не удаляется и выбрасывает ошибку, если смотреть в дебаггере. +os.name +---------- -.. code-block:: python +Модуль os обладает как вызываемыми функциями, так и обычными значениями. В случае с os.name, речь идет только о значениях. При доступе к os.name, вы получите информацию о том, с какой платформой вы работаете. Вам откроются следующие значения: ‘posix’, ‘nt’, ‘os2’, ‘ce’, ‘java’, ‘riscos’. Давайте посмотрим на то, что выйдет, если запустить его на Windows 7: - os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None) +.. code-block:: python -Переименовывает файл или директорию из src в dst. Не очень разобрался, что дескриптор каталога, но, по-видимому, это поддерживает переименование файла + import os -.. code-block:: python + print(os.name) + #nt - os.renames(old, new) +Это говорит нам о том, что наш экземпляр Python работает в окне Windows. Как мы об этом узнали? Майкрософт начали называть свою операционную систему NT много лет назад. Например, Windows 7 также носит имя Windows NT 6.1. -Переименовывает old в new, создавая промежуточные директории. -.. code-block:: python +os.environ, os.getenv() и os.putenv() +---------- - os.truncate(path, length) +Значение os.environ известно как объект мэппинга (сопоставления), который работает со словарем переменных пользовательской среды. Возможно вы не знали, но каждый раз, когда вы пользуетесь своим компьютером, некоторые переменные среды уже установлены. -Обрезает файл до длины length. -Пример использования функции: -***************************** +Это дает вам полезную информацию, такую как количество процессоров, тип ОЗУ, имя компьютера, и так далее. Посмотрим, что мы сможем узнать о нашем компьютере: -.. code-block:: python +.. code-block:: python import os - path = 'truncate.txt' - with open(path, 'w') as f: - f.write('truncate data string') - os.truncate(path, 8) # обрезаем - with open(path, 'r') as f: - print(f.read()) # 'truncate' - os.unlink(path) # очистка файла + print(os.environ) + +Ответ: +.. code-block:: python -.. code-block:: python + {'ALLUSERSPROFILE': 'C:\\ProgramData', + 'APPDATA': 'C:\\Users\\mike\\AppData\\Roaming', + 'CLASSPATH': '.;C:\\Program Files\\QuickTime\\QTSystem\\QTJava.zip', + 'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files', + 'COMPUTERNAME': 'MIKE-PC', + 'COMSPEC': 'C:\\Windows\\system32\\cmd.exe', + 'FP_NO_HOST_CHECK': 'NO', + 'HOMEDRIVE': 'C:', + 'HOMEPATH': '\\Users\\mike', + 'LOCALAPPDATA': 'C:\\Users\\mike\\AppData\\Local', + 'LOGONSERVER': '\\\\MIKE-PC', + 'NUMBER_OF_PROCESSORS': '2', + 'OS': 'Windows_NT', + 'PATHEXT': '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC', + 'PROCESSOR_ARCHITECTURE': 'x86', + 'PROCESSOR_IDENTIFIER': 'x86 Family 6 Model 15 Stepping 13, GenuineIntel', + 'PROCESSOR_LEVEL': '6', + 'PROGRAMDATA': 'C:\\ProgramData', + 'PROGRAMFILES': 'C:\\Program Files', + 'PSMODULEPATH': 'C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\Modules\\', + 'PUBLIC': 'C:\\Users\\Public', + 'PYTHONIOENCODING': 'cp437', + 'QTJAVA': 'C:\\Program Files\\QuickTime\\QTSystem\\QTJava.zip', + 'SESSIONNAME': 'Console', + 'SYSTEMDRIVE': 'C:', + 'SYSTEMROOT': 'C:\\Windows', + 'TEMP': 'C:\\Users\\mike\\AppData\\Local\\Temp', + 'TMP': 'C:\\Users\\mike\\AppData\\Local\\Temp', + 'USERDOMAIN': 'mike-PC', + 'USERNAME': 'mike', + 'USERPROFILE': 'C:\\Users\\mike', + 'VBOX_INSTALL_PATH': 'C:\\Program Files\\Oracle\\VirtualBox\\', + 'VS90COMNTOOLS': 'C:\\Program Files\\Microsoft Visual Studio 9.0\\Common7\\Tool\s\\', + 'WINDIR': 'C:\\Windows', + 'WINDOWS_TRACING_FLAGS': '3', + 'WINDOWS_TRACING_LOGFILE': 'C:\\BVTBin\\Tests\\installpackage\\csilogfile.log', + 'WINGDB_ACTIVE': '1', + 'WINGDB_PYTHON': 'c:\\python27\\python.exe', + 'WINGDB_SPAWNCOOKIE': 'rvlxwsGdD7SHYIJm'} + +Ваши данные будут отличаться от моих, так как конфигурация компьютера у всех немного отличается, однако вы определенно увидите большое количество совпадений. Как вы могли заметить, работа функции вернула словарь. Это значит, что вы можете получить доступ к значениям среды, пользуясь обычными словарными методами. Например обрвщаться к нему по ключу: - os.utime(path, times=None, *, ns=None, dir_fd=None, follow_symlinks=True) +.. code-block:: python -Модификация времени последнего доступа и изменения файла. Либо times - кортеж (время доступа в секундах, время изменения в секундах), либо ns - кортеж (время доступа в наносекундах, время изменения в наносекундах). + import os -Работа с директориями: -====================== + print(os.environ["TMP"]) # C:\\Users\\mike\\AppData\\Local\\Temp -.. code-block:: python +Вы также можете использовать функцию os.getenv для доступа к этой переменной: - os.walk(top, topdown=True, onerror=None, followlinks=False) +.. code-block:: python -Генерация имён файлов в дереве каталогов, сверху вниз (если topdown равен True), либо снизу вверх (если False). Для каждого каталога функция walk возвращает кортеж (путь к каталогу, список каталогов (кроме символов '.', '..'), список файлов). + import os -Обратите внимание, что имена в списках не содержат компонентов пути. Чтобы получить полный путь, который начинается с top, к файлу или каталогу в dirpath, выполните: + print(os.getenv("TMP")) # C:\\Users\\mike\\AppData\\Local\\Temp -.. code-block:: python +Полезность использования os.getenv() вместо словаря os.environ заключается в том, что если вы находитесь в положении, когда вам нужно получить доступ к переменной среды, которая не существует, функция getenv попросту ничего не сделает. Если вы попытаетесь сделать то же самое, пользуясь os.environ, вы получите уведомление об ошибке. Давайте попробуем на примере: - os.path.join(dirpath, name) +.. code-block:: python -.. code-block:: python + import os - os.chdir(path) + print(os.environ["TMP2"]) -Смена текущей директории. -.. code-block:: python +Результат выполнения данного скрипта: - os.getcwd() +.. code-block:: python -Возвращает строку, содержащую абсолютный путь текущей рабочей директории. + Traceback (most recent call last): + File "", line 1, in + os.environ["TMP2"] + File "C:\Python27\lib\os.py", line 423, in __getitem__ + return self.data[key.upper()] + KeyError: 'TMP2' + + +os.chdir() и os.getcwd() +---------- -.. code-block:: python +Функция os.chdir позволяет нам вносить изменения в каталоге, который мы в данный момент используем в сессии. Если вам нужно знать, какой путь вы в данный момент используете, для этой нужно вызвать os.getcwd(). Попробуем воспользоваться обоими модулями: - os.rmdir(path, *, dir_fd=None) +.. code-block:: python -Удаляет пустую директорию. + import os -.. code-block:: python + print(os.getcwd()) + # C:\\Python27 - os.listdir(path=".") + os.chdir(r"C:\Users\mike\Documents") + + print(os.getcwd()) + # C:\\Users\\mike\\Documents + +Мы открыли директорию по умолчанию в Python, после запуска данного кода в IDLE. После этого мы изменили папки, при помощи os.chdir(). Наконец, мы вызывали os.getcwd() еще раз, чтобы убедиться, что все изменения были выполнены правильно. -Возвращает писок файлов и директорий в папке. По умолчанию директория является текущей. +Работа с папками и файлами +=========================== -.. code-block:: python +os.mkdir() и os.makedirs() +---------- - os.mkdir(path, mode=0o777, *, dir_fd=None) +Как вы могли догадаться, эти два метода уже знакомы нам и используются для создания папок. Первая, os.mkdir(), позволяет создать одну папку. Попробуем: -Создаёт директорию. OSError, если директория существует. +.. code-block:: python -.. code-block:: python + import os - os.makedirs(path, mode=0o777, exist_ok=False) + os.mkdir("test") + path = r'C:\Users\mike\Documents\pytest' + os.mkdir(path) -Создаёт директорию, создавая при этом промежуточные директории. +Первая строка кода создает папку под названием test в определенном каталоге. Вы можете использовать эти модули в предыдущем разделе, чтобы узнать, где именно вы запустили свой код, на случай, если вы забыли. Во втором примере мы назначили путь к переменной, затем к os.mkdir(). Это позволяет вам создать папку в любой точке вашей системы, где есть доступ. Функция os.makedirs() создает промежуточные папки в пути, если их там нет. В целом, это значит, что вы создали путь, в котором размещены папки. Данное решение удобно, когда есть необходимость создания журнала, с датированной структурой, например Год\Месяц\День. Давайте взглянем на пример: -.. code-block:: python +.. code-block:: python + + import os + + path = r'C:\Users\mike\Documents\pytest\2014\02\19' + os.makedirs(path) + +Что произошло? Этот код просто создал кучу папок! Если в вашей системе все еще есть папка pytest, то в ней появится папка 2014, в которой также есть папка, в которой, удивительно, находится еще одна. Попробуйте сами, воспользовавшись рабочим путем в вашей системе. - os.removedirs(path) -Удаляет директорию, затем пытается удалить родительские директории, и удаляет их рекурсивно, пока они пусты. +os.remove() и os.rmdir() +---------- -Пример кода для работы с папками: -********************************* +Функции os.remove() и os.rmdir() используются для удаления файлов и каталогов соответственно. Посмотрим на os.remove(): -.. code-block:: python +.. code-block:: python import os - dir_name = 'os_directories' + os.remove("test.txt") + +Этот фрагмент кода пытается удалить файл под названием test.txt из вашего рабочего каталога. Если модуль не может найти файл, должно появиться уведомление о той или иной ошибке. Ошибка также возникнет, если файл уже используется (другими словами закрыт), или у вас нет разрешения для удаления данного файла. Возможно, вы хотите проверить os.unlink, который выполняет ту же функцию. Термин unlink – привычное для Unix название данной процедуры. Взглянем на пример работы os.rmdir(): + +.. code-block:: python - print('creating', dir_name) - os.makedirs(dir_name) + import os - file_name = os.path.join(dir_name, 'example.txt') - print('creating', file_name) - with open(file_name, 'wt') as f: - f.write('example file') + os.rmdir("pytest") + +Данный код попытается удалить каталог под названием pytest из каталога, используемого в данный момент в работе. В случае, если это удалось, каталог pytest исчезнет. Ошибка может возникнуть, если каталога с таким названием не существует, если у вас нет разрешения на его удаление, или если каталог не пустой. Вам возможно хочется взглянуть на os.removedirs(), который может удалить пустые вложенные каталоги. - print('cleaning up') - os.unlink(file_name) - os.rmdir(dir_name) -Функции для работы со ссылками: +os.rename(src, dst) +---------- +Функция os.rename() применяется тогда, когда нужно переименовать файл или папку. Посмотрим на примере: .. code-block:: python - os.symlink(source, link_name, target_is_directory=False, *, dir_fd=None) + os.rename("test.txt", "pytest.txt") + +В этом примере, мы указали os.rename на то, что нужно переименовать файл под названием test.txt на pytest.txt. Это произойдет в каталоге, с которым мы в данный момент работаем. Ошибка может возникнуть в том случае, если вы попытаетесь переименовать несуществующий файл, или если у вас нет доступа к данной операции. Также существует функция os.renames, которая меняет название папки или файла соответственно. + -Создаёт символическую ссылку на объект. +os.startfile() +---------- + +Метод os.startfile() позволяет нам «запустить» файл в привязанной к нему программе. Другими словами, мы можем открыть файл вместе с привязанной к нему программой, как когда вы открываете файл PDF двойным щелчком, и он открывается в программе Adobe Reader. Попробуем: .. code-block:: python - os.link(src, dst, *, src_dir_fd=None, dst_dir_fd=None, follow_symlinks=True) + import os -Создаёт жёсткую ссылку. + os.startfile(r'C:\Users\mike\Documents\labels.pdf') + +В данном примере мы прошли полный путь к модулю os.startfile, который указывает на открытие файла под названием labels.pdf. На моем компьютере данная функция открывает файл PDF в программе Adobe Reader. Попробуйте открыть файлы PDF, MP3 или фотографии на своем компьютере при помощи данного метода, чтобы увидеть как он работает. -В чем отличие жесткой ссылки от символической? +os.walk() +---------- -СИМВОЛИЧЕСКИЕ ССЫЛКИ -******************** -Главное ее отличие от жестких ссылок в том, что при удалении целевого файла ссылка останется, но она будет указывать в никуда, поскольку файла на самом деле больше нет. +Метод os.walk() дает нам возможность для итерации на корневом уровне пути. Это значит, что мы можем назначить путь к этой функции и получить доступ ко всем её подкаталогам и файлам. Используем одну из папок Пайтон, при помощи которой мы можем проверить данную функцию. Мы используем C:\Python27\Tools -Вот основные особенности символических ссылок: +.. code-block:: python -Могут ссылаться на файлы и каталоги; -После удаления, перемещения или переименования файла становятся недействительными; -Права доступа и номер inode отличаются от исходного файла; -При изменении прав доступа для исходного файла, права на ссылку останутся неизменными; -Можно ссылаться на другие разделы диска; -Содержат только имя файла, а не его содержимое. -Теперь давайте рассмотрим жесткие ссылки. + import os -ЖЕСТКИЕ ССЫЛКИ -************** + path = r'C:\Python27\Tools' -Этот тип ссылок реализован на более низком уровне файловой системы. Файл размещен только в определенном месте жесткого диска. Но на это место могут ссылаться несколько ссылок из файловой системы. Каждая из ссылок - это отдельный файл, но ведут они к одному участку жесткого диска. Файл можно перемещать между каталогами, и все ссылки останутся рабочими, поскольку для них неважно имя. + for root, dirs, files in os.walk(path): + print(root) + +Результат работы: -Особенности: -Работают только в пределах одной файловой системы; -Нельзя ссылаться на каталоги; -Имеют ту же информацию inode и набор разрешений что и у исходного файла; -Разрешения на ссылку изменяться при изменении разрешений файла; -Можно перемещать и переименовывать и даже удалять файл без вреда ссылке. +.. code-block:: python + C:\Python27\Tools + C:\Python27\Tools\i18n + C:\Python27\Tools\pynche + C:\Python27\Tools\pynche\X + C:\Python27\Tools\Scripts + C:\Python27\Tools\versioncheck + C:\Python27\Tools\webchecker + -Функции и переменные для работы с ОС: -===================================== -.. code-block:: python - os.system(command) +Подмодуль os.path +---------- -Исполняет системную команду, возвращает код её завершения (0, если успешно). +Подмодуль os.path модуля os имеет широкий ряд встроенных преимуществ. Ознакомимся со следующими функциями: -.. code-block:: python +• basename - os.name +• dirname -Переменная имени операционной системы. Доступные значения: 'posix', 'nt', 'mac', 'os2', 'ce', 'java'. +• exists -.. code-block:: python +• isdir and isfile - os.environ +• join -Словарь переменных окружения. Является изменямым и дополняемым. +• split -.. code-block:: python - os.getlogin() +os.path.basename -Возвращает имя пользователя, вошедшего в терминал. +Функция basename вернет название файла пути. Пример: .. code-block:: python - os.uname() - -Возвращает объект с полями: sysname - имя ОС, nodename - имя машины в сети (имя рабочей группы), release - номер релиза, version - версия, machine - идентификатор машины (разрядность). Доступен только в недавних разновидностях UNIX. + import os -.. code-block:: python + os.path.basename(r'C:\Python27\Tools\pynche\ChipViewer.py') + # ChipViewer.py + +Это очень полезная функция, особенно в тех случаях, когда нужно использовать имя файла для наименования того или иного связанного с работой файла, например лог-файл. Такая ситуация возникает часто при работе с файлами данных. - os.chown(path, uid, gid, *, dir_fd=None, follow_symlinks=True) +os.path.dirname -Меняет id владельца и группы (Unix). +Функция dirname возвращает только часть каталога пути. Это проще понять, если мы взглянем на пример кода: .. code-block:: python - os.access(path, mode, *, dir_fd=None, effective_ids=False, follow_symlinks=True) - проверка доступа к объекту у текущего пользователя. - os.F_OK - объект существует, - os.R_OK - доступен на чтение, - os.W_OK - доступен на запись, - os.X_OK - доступен на исполнение. + import os -Пример использования: + print( os.path.dirname(r'C:\Python27\Tools\pynche\ChipViewer.py') ) + # C:\\Python27\\Tools\\pynche + +В данном примере мы просто возвращаем путь к каталогу. Это также полезно, когда вам нужно сохранить другие файлы рядом с тем, который вы обрабатываете в данный момент. Как и в случае с лог-файлом, упомянутым выше. -.. code-block:: python +os.path.exists - try: - fp = open("myfile") - except PermissionError: - return "Error" - else: - with fp: - return fp.read() +Функция exists говорит нам, существует ли файл, или нет. Все что вам нужно, это указать ему путь. Взглянем на пример: .. code-block:: python - os.urandom(n) + import os + + os.path.exists(r'C:\Python27\Tools\pynche\ChipViewer.py') # True -Возвращает n случайных байт(!). Полезно, если хотите использовать это в криптографии. + os.path.exists(r'C:\Python27\Tools\pynche\fake.py') # False + +В первом примере, мы указали функции exists настоящий путь, на что она указывает как True. Это говорит о том, что данный путь существует. Во втором примере, мы указали неправильный путь, от чего функция указывает нам на это сообщением False. +os.path.isdir / os.path.isfile + +Методы isdir и isfile тесно связаны с методом exists, так как они также тестируют присутствие или отсутствие файлов или папок на тех или иных путях. Однако, isdir проверяет только пути к папкам, а isfile, соответственно, к файлам. Если вам нужно проверить путь, и не важно, папка это или файл, проще будет воспользоваться методом exists. В любом случае, взглянем на пару примеров: .. code-block:: python - os.getpid() + import os + + os.path.isfile(r'C:\Python27\Tools\pynche\ChipViewer.py') + # True -Возвращает текущий id процесса. + os.path.isdir(r'C:\Python27\Tools\pynche\ChipViewer.py') + # False -.. code-block:: python + os.path.isdir(r'C:\Python27\Tools\pynche') + # True - os.sync() + os.path.isfile(r'C:\Python27\Tools\pynche') + # False + +Уделите особое внимание данным примерам. В первом мы указали путь к файлу и проверили, является ли этот путь в действительности файлом. Затем, во втором примере, мы проделали то же самое, но в контексте папки. Вы можете лично ознакомиться с результатами. После этих двух примеров, мы немного изменили условия, указав путь к папке для обеих функций. Эти примеры наглядно демонстрируют то, как эти функции работают. -Записывает все данные на диск. Доступен только на UNIX. +os.path.join +Метод join позволяет вам совместить несколько путей при помощи присвоенного разделителя. К примеру, в Windows, в роли разделителя выступает бэкслэш (косая черта, указывающая назад), однако в Linux функция разделителя присвоена косой черте, указывающей вперед (forward slash). Как это работает: .. code-block:: python - os.path - модуль, реализующий некоторые полезные функции на работы с путями. + import os -Задачи на использование функций -******************************* + print( os.path.join(r'C:\Python27\Tools\pynche', 'ChipViewer.py') ) + # C:\\Python27\\Tools\\pynche\\ChipViewer.py + +В данном примере мы совместили путь каталога и файла вместе, для получения рабочего пути. Обратите внимание на то, что метод join не указывает на то, какой результат в итоге вышел. -Задача 1: -~~~~~~~~~ +os.path.split +Метод split разъединяет путь на кортеж, который содержит и файл и каталог. Взглянем на пример: -Напишите программу, которая выводит 'Hello, $USER!', где $USER - имя пользователя. Пользоваться print() запрещено. +.. code-block:: python -Задача 2: -~~~~~~~~~ + import os -Напишите программу, которая выводит дерево файлов по заданному пути. В ней должны быть: -а) фильтр по названиям -б) вывод типа файла: является ли файл символической ссылкой или является обычным файлом + print( os.path.split(r'C:\Python27\Tools\pynche\ChipViewer.py') ) + # ('C:\\Python27\\Tools\\pynche', 'ChipViewer.py') + +В данном примере показано, что происходит, когда мы указываем путь к файлу. Теперь взглянем на то, что происходит, если в конце пути нет названия файла: -Задача 3: -~~~~~~~~~ +.. code-block:: python + + import os -Петя только начал изучать программирование и пока не научился пользоваться командой git clone, поэтому скачал несколько репозиториев с Github в .zip формате. Но вот незадача: файлы программ не являются исполняемыми. Есть несколько .zip архивов, в них содержатся файлы необходимых проектов на языке Python. Напишите программу, которая разархивирует проекты в отдельные папки с тем же названием проектов и сделает все Python файлы исполняемыми. + print( os.path.split(r'C:\Python27\Tools\pynche') ) + # (‘C:\Python27\Tools’, ‘pynche’) + +Как видите, данная функция берет путь и разъединяет его таким образом, что подпапка стала вторым элементом кортежа с остальной частью пути в первом элементе. Напоследок, взглянем на бытовой случай использования split: -Задача 4: -~~~~~~~~~ +.. code-block:: python + + import os -Напишите программу, которая проверяет, есть ли в переменных окружения заданный путь. Если переменная есть, вывести название переменной, если ее нет - создать с именем 'OS_PRACTICE + dirname, fname = os.path.split(r'C:\Python27\Tools\pynche\ChipViewer.py') + print(dirname) + # C:\\Python27\\Tools\\pynche + print(fname) + # ChipViewer.py + +В данном примере указано, как сделать множественное назначение. Когда вы разъединяете путь, он становится кортежем, состоящим из двух частей. После того, как мы опробовали две переменные с левой части, первый элемент кортежа назначен к первой переменной, а второй элемент к второй переменной соответственно. From c306b1a7b8f1a7248cac94a729934c99043ccf20 Mon Sep 17 00:00:00 2001 From: "o.korchevaya" <71932690+okorchevaya@users.noreply.github.com> Date: Sat, 7 May 2022 13:53:57 +0300 Subject: [PATCH 02/15] Update os.rst --- content/os.rst | 106 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 98 insertions(+), 8 deletions(-) diff --git a/content/os.rst b/content/os.rst index 1703b44..e77600e 100644 --- a/content/os.rst +++ b/content/os.rst @@ -22,8 +22,6 @@ 6. Работать с путями - - Для начала работы необходимо подключить модуль обычной командой import .. code-block:: python @@ -60,8 +58,6 @@ os.environ, os.getenv() и os.putenv() import os print(os.environ) -Ответ: - .. code-block:: python {'ALLUSERSPROFILE': 'C:\\ProgramData', @@ -222,7 +218,7 @@ os.rename(src, dst) os.startfile() ----------- +-------------- Метод os.startfile() позволяет нам «запустить» файл в привязанной к нему программе. Другими словами, мы можем открыть файл вместе с привязанной к нему программой, как когда вы открываете файл PDF двойным щелчком, и он открывается в программе Adobe Reader. Попробуем: @@ -237,8 +233,7 @@ os.startfile() os.walk() ---------- - -Метод os.walk() дает нам возможность для итерации на корневом уровне пути. Это значит, что мы можем назначить путь к этой функции и получить доступ ко всем её подкаталогам и файлам. Используем одну из папок Пайтон, при помощи которой мы можем проверить данную функцию. Мы используем C:\Python27\Tools +Метод os.walk() дает нам возможность для итерации на корневом уровне пути. Это значит, что мы можем назначить путь к этой функции и получить доступ ко всем её подкаталогам и файлам. Используем одну из папок Python, при помощи которой мы можем проверить данную функцию. Мы используем C:\Python27\Tools .. code-block:: python @@ -261,11 +256,97 @@ os.walk() C:\Python27\Tools\versioncheck C:\Python27\Tools\webchecker + +Функции для работы со ссылками +=============================== + +os.symlink() +--------------- + +Создаёт символическую ссылку на объект. + +Синтаксис: + +.. code-block:: python + + os.symlink(src, dst, target_is_directory = False, *, dir_fd = None) + +Параметры: + +src: объект, похожий на путь, представляющий путь к файловой системе. Это путь к исходному файлу, для которого будет создана символическая ссылка. + +dst: объект, похожий на путь, представляющий путь к файловой системе. Это путь к целевому файлу, в котором будет создана символическая ссылка. + +target_is_directory (необязательно): значение этого параметра по умолчанию — False. Если указанный целевой путь является каталогом, его значение должно быть True. + +dir_fd (необязательно): дескриптор файла, ссылающийся на каталог. + +Возвращаемое значение: этот метод не возвращает никакого значения. + + os.link() + ----------- +Метод os.link() создает жесткую ссылку, указывающую на src с именем dst . Этот метод очень полезен для создания копии существующего файла + +Синтаксис: + +.. code-block:: python + + os.link(src, dst) + +Параметры: + +src — это путь к исходному файлу, для которого будет создана жесткая ссылка. + +dest — это путь к целевому файлу, по которому будет создана жесткая ссылка. +Возвращаемое значение +Этот метод не возвращает никакого значения. +Создаёт жёсткую ссылку. + +В чем отличие жесткой ссылки от символической? +********************************************** + +СИМВОЛИЧЕСКИЕ ССЫЛКИ + +Главное ее отличие от жестких ссылок в том, что при удалении целевого файла ссылка останется, но она будет указывать в никуда, поскольку файла на самом деле больше нет. + +Вот основные особенности символических ссылок. + +Могут ссылаться на файлы и каталоги. + +После удаления, перемещения или переименования файла становятся недействительными. + +Права доступа и номер inode отличаются от исходного файла. + +При изменении прав доступа для исходного файла, права на ссылку останутся неизменными. + +Можно ссылаться на другие разделы диска. + +Содержат только имя файла, а не его содержимое. + +Теперь давайте рассмотрим жесткие ссылки. + +ЖЕСТКИЕ ССЫЛКИ + +Этот тип ссылок реализован на более низком уровне файловой системы. Файл размещен только в определенном месте жесткого диска. Но на это место могут ссылаться несколько ссылок из файловой системы. Каждая из ссылок - это отдельный файл, но ведут они к одному участку жесткого диска. Файл можно перемещать между каталогами, и все ссылки останутся рабочими, поскольку для них неважно имя. + +Особенности: + +Работают только в пределах одной файловой системы. + +Нельзя ссылаться на каталоги. + +Имеют ту же информацию inode и набор разрешений что и у исходного файла. + +Разрешения на ссылку изменяться при изменении разрешений файла. + +Можно перемещать и переименовывать и даже удалять файл без вреда ссылке. + + Подмодуль os.path ----------- +================== Подмодуль os.path модуля os имеет широкий ряд встроенных преимуществ. Ознакомимся со следующими функциями: @@ -283,6 +364,7 @@ os.walk() os.path.basename +------------------ Функция basename вернет название файла пути. Пример: @@ -296,6 +378,7 @@ os.path.basename Это очень полезная функция, особенно в тех случаях, когда нужно использовать имя файла для наименования того или иного связанного с работой файла, например лог-файл. Такая ситуация возникает часто при работе с файлами данных. os.path.dirname +----------------- Функция dirname возвращает только часть каталога пути. Это проще понять, если мы взглянем на пример кода: @@ -309,6 +392,7 @@ os.path.dirname В данном примере мы просто возвращаем путь к каталогу. Это также полезно, когда вам нужно сохранить другие файлы рядом с тем, который вы обрабатываете в данный момент. Как и в случае с лог-файлом, упомянутым выше. os.path.exists +---------------- Функция exists говорит нам, существует ли файл, или нет. Все что вам нужно, это указать ему путь. Взглянем на пример: @@ -323,8 +407,10 @@ os.path.exists В первом примере, мы указали функции exists настоящий путь, на что она указывает как True. Это говорит о том, что данный путь существует. Во втором примере, мы указали неправильный путь, от чего функция указывает нам на это сообщением False. os.path.isdir / os.path.isfile +------------------------------ Методы isdir и isfile тесно связаны с методом exists, так как они также тестируют присутствие или отсутствие файлов или папок на тех или иных путях. Однако, isdir проверяет только пути к папкам, а isfile, соответственно, к файлам. Если вам нужно проверить путь, и не важно, папка это или файл, проще будет воспользоваться методом exists. В любом случае, взглянем на пару примеров: + .. code-block:: python import os @@ -344,8 +430,10 @@ os.path.isdir / os.path.isfile Уделите особое внимание данным примерам. В первом мы указали путь к файлу и проверили, является ли этот путь в действительности файлом. Затем, во втором примере, мы проделали то же самое, но в контексте папки. Вы можете лично ознакомиться с результатами. После этих двух примеров, мы немного изменили условия, указав путь к папке для обеих функций. Эти примеры наглядно демонстрируют то, как эти функции работают. os.path.join +-------------- Метод join позволяет вам совместить несколько путей при помощи присвоенного разделителя. К примеру, в Windows, в роли разделителя выступает бэкслэш (косая черта, указывающая назад), однако в Linux функция разделителя присвоена косой черте, указывающей вперед (forward slash). Как это работает: + .. code-block:: python import os @@ -356,6 +444,8 @@ os.path.join В данном примере мы совместили путь каталога и файла вместе, для получения рабочего пути. Обратите внимание на то, что метод join не указывает на то, какой результат в итоге вышел. os.path.split +---------------- + Метод split разъединяет путь на кортеж, который содержит и файл и каталог. Взглянем на пример: .. code-block:: python From adee82be473b98322cd77d37c4c7d35bab7a8e53 Mon Sep 17 00:00:00 2001 From: "o.korchevaya" <71932690+okorchevaya@users.noreply.github.com> Date: Sat, 7 May 2022 14:18:19 +0300 Subject: [PATCH 03/15] Update os.rst --- content/os.rst | 162 ++++++++++++++++++++++++++++++------------------- 1 file changed, 98 insertions(+), 64 deletions(-) diff --git a/content/os.rst b/content/os.rst index e77600e..6a0db9f 100644 --- a/content/os.rst +++ b/content/os.rst @@ -1,14 +1,14 @@ Модуль os в Python #################### -:date: 2022-04-19 -:summary: Лаба +:date: 2022-05-07 +:summary: Лабораторная работа "Модуль OS Python на Linux" :status: published -:author: Кауров Р.О. +:author: Корчевая О. Е. -Модуль os позволяет Python выполнять многие операции с файлами и папками, которые вы обычно выполняете в командной строке Linux. Модуль предоставляет функции для работы с операционной системой, при этом поведение функций не зависит от ОС, поэтому программы будут переносимыми. Модуль так же позволяет работать с файлами, папками, а так же со многими другими объектами операционной системы, как, например, процессы или переменные окружения. Познакомимся с самыми популярнфми функциями. +Модуль os позволяет Python выполнять многие операции с файлами и папками, которые вы обычно выполняете в командной строке Linux. Модуль предоставляет функции для работы с операционной системой, при этом поведение функций не зависит от ОС. Модуль так же позволяет работать с файлами, папками, а так же со многими другими объектами операционной системы, как, например, процессы или переменные окружения. Познакомимся с самыми популярнфми функциями. -В ходе данной лабораторной работы мы научимся: +**В ходе данной лабораторной работы мы научимся:** 1. Работать со значениями среды @@ -25,7 +25,8 @@ Для начала работы необходимо подключить модуль обычной командой import .. code-block:: python - import + + import os Основные функции для работы с модулем ============================== @@ -40,11 +41,10 @@ os.name import os print(os.name) - #nt + # C: nt Это говорит нам о том, что наш экземпляр Python работает в окне Windows. Как мы об этом узнали? Майкрософт начали называть свою операционную систему NT много лет назад. Например, Windows 7 также носит имя Windows NT 6.1. - os.environ, os.getenv() и os.putenv() ---------- @@ -60,45 +60,45 @@ os.environ, os.getenv() и os.putenv() .. code-block:: python - {'ALLUSERSPROFILE': 'C:\\ProgramData', - 'APPDATA': 'C:\\Users\\mike\\AppData\\Roaming', - 'CLASSPATH': '.;C:\\Program Files\\QuickTime\\QTSystem\\QTJava.zip', - 'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files', - 'COMPUTERNAME': 'MIKE-PC', - 'COMSPEC': 'C:\\Windows\\system32\\cmd.exe', - 'FP_NO_HOST_CHECK': 'NO', - 'HOMEDRIVE': 'C:', - 'HOMEPATH': '\\Users\\mike', - 'LOCALAPPDATA': 'C:\\Users\\mike\\AppData\\Local', - 'LOGONSERVER': '\\\\MIKE-PC', - 'NUMBER_OF_PROCESSORS': '2', - 'OS': 'Windows_NT', - 'PATHEXT': '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC', - 'PROCESSOR_ARCHITECTURE': 'x86', - 'PROCESSOR_IDENTIFIER': 'x86 Family 6 Model 15 Stepping 13, GenuineIntel', - 'PROCESSOR_LEVEL': '6', - 'PROGRAMDATA': 'C:\\ProgramData', - 'PROGRAMFILES': 'C:\\Program Files', - 'PSMODULEPATH': 'C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\Modules\\', - 'PUBLIC': 'C:\\Users\\Public', - 'PYTHONIOENCODING': 'cp437', - 'QTJAVA': 'C:\\Program Files\\QuickTime\\QTSystem\\QTJava.zip', - 'SESSIONNAME': 'Console', - 'SYSTEMDRIVE': 'C:', - 'SYSTEMROOT': 'C:\\Windows', - 'TEMP': 'C:\\Users\\mike\\AppData\\Local\\Temp', - 'TMP': 'C:\\Users\\mike\\AppData\\Local\\Temp', - 'USERDOMAIN': 'mike-PC', - 'USERNAME': 'mike', - 'USERPROFILE': 'C:\\Users\\mike', - 'VBOX_INSTALL_PATH': 'C:\\Program Files\\Oracle\\VirtualBox\\', - 'VS90COMNTOOLS': 'C:\\Program Files\\Microsoft Visual Studio 9.0\\Common7\\Tool\s\\', - 'WINDIR': 'C:\\Windows', - 'WINDOWS_TRACING_FLAGS': '3', - 'WINDOWS_TRACING_LOGFILE': 'C:\\BVTBin\\Tests\\installpackage\\csilogfile.log', - 'WINGDB_ACTIVE': '1', - 'WINGDB_PYTHON': 'c:\\python27\\python.exe', - 'WINGDB_SPAWNCOOKIE': 'rvlxwsGdD7SHYIJm'} + {'ALLUSERSPROFILE': 'C:\\ProgramData', + 'APPDATA': 'C:\\Users\\mike\\AppData\\Roaming', + 'CLASSPATH': '.;C:\\Program Files\\QuickTime\\QTSystem\\QTJava.zip', + 'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files', + 'COMPUTERNAME': 'MIKE-PC', + 'COMSPEC': 'C:\\Windows\\system32\\cmd.exe', + 'FP_NO_HOST_CHECK': 'NO', + 'HOMEDRIVE': 'C:', + 'HOMEPATH': '\\Users\\mike', + 'LOCALAPPDATA': 'C:\\Users\\mike\\AppData\\Local', + 'LOGONSERVER': '\\\\MIKE-PC', + 'NUMBER_OF_PROCESSORS': '2', + 'OS': 'Windows_NT', + 'PATHEXT': '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC', + 'PROCESSOR_ARCHITECTURE': 'x86', + 'PROCESSOR_IDENTIFIER': 'x86 Family 6 Model 15 Stepping 13, GenuineIntel', + 'PROCESSOR_LEVEL': '6', + 'PROGRAMDATA': 'C:\\ProgramData', + 'PROGRAMFILES': 'C:\\Program Files', + 'PSMODULEPATH': 'C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\Modules\\', + 'PUBLIC': 'C:\\Users\\Public', + 'PYTHONIOENCODING': 'cp437', + 'QTJAVA': 'C:\\Program Files\\QuickTime\\QTSystem\\QTJava.zip', + 'SESSIONNAME': 'Console', + 'SYSTEMDRIVE': 'C:', + 'SYSTEMROOT': 'C:\\Windows', + 'TEMP': 'C:\\Users\\mike\\AppData\\Local\\Temp', + 'TMP': 'C:\\Users\\mike\\AppData\\Local\\Temp', + 'USERDOMAIN': 'mike-PC', + 'USERNAME': 'mike', + 'USERPROFILE': 'C:\\Users\\mike', + 'VBOX_INSTALL_PATH': 'C:\\Program Files\\Oracle\\VirtualBox\\', + 'VS90COMNTOOLS': 'C:\\Program Files\\Microsoft Visual Studio 9.0\\Common7\\Tool\s\\', + 'WINDIR': 'C:\\Windows', + 'WINDOWS_TRACING_FLAGS': '3', + 'WINDOWS_TRACING_LOGFILE': 'C:\\BVTBin\\Tests\\installpackage\\csilogfile.log', + 'WINGDB_ACTIVE': '1', + 'WINGDB_PYTHON': 'c:\\python27\\python.exe', + 'WINGDB_SPAWNCOOKIE': 'rvlxwsGdD7SHYIJm'} Ваши данные будут отличаться от моих, так как конфигурация компьютера у всех немного отличается, однако вы определенно увидите большое количество совпадений. Как вы могли заметить, работа функции вернула словарь. Это значит, что вы можете получить доступ к значениям среды, пользуясь обычными словарными методами. Например обрвщаться к нему по ключу: @@ -106,7 +106,8 @@ os.environ, os.getenv() и os.putenv() import os - print(os.environ["TMP"]) # C:\\Users\\mike\\AppData\\Local\\Temp + print(os.environ["TMP"]) + # C:\\Users\\mike\\AppData\\Local\\Temp Вы также можете использовать функцию os.getenv для доступа к этой переменной: @@ -114,7 +115,8 @@ os.environ, os.getenv() и os.putenv() import os - print(os.getenv("TMP")) # C:\\Users\\mike\\AppData\\Local\\Temp + print(os.getenv("TMP")) + # C:\\Users\\mike\\AppData\\Local\\Temp Полезность использования os.getenv() вместо словаря os.environ заключается в том, что если вы находитесь в положении, когда вам нужно получить доступ к переменной среды, которая не существует, функция getenv попросту ничего не сделает. Если вы попытаетесь сделать то же самое, пользуясь os.environ, вы получите уведомление об ошибке. Давайте попробуем на примере: @@ -261,7 +263,7 @@ os.walk() =============================== os.symlink() ---------------- +------------- Создаёт символическую ссылку на объект. @@ -273,18 +275,19 @@ os.symlink() Параметры: -src: объект, похожий на путь, представляющий путь к файловой системе. Это путь к исходному файлу, для которого будет создана символическая ссылка. +**src**: объект, похожий на путь, представляющий путь к файловой системе. Это путь к исходному файлу, для которого будет создана символическая ссылка. + +**dst**: объект, похожий на путь, представляющий путь к файловой системе. Это путь к целевому файлу, в котором будет создана символическая ссылка. -dst: объект, похожий на путь, представляющий путь к файловой системе. Это путь к целевому файлу, в котором будет создана символическая ссылка. +**target_is_directory (необязательно)**: значение этого параметра по умолчанию — False. Если указанный целевой путь является каталогом, его значение должно быть True. -target_is_directory (необязательно): значение этого параметра по умолчанию — False. Если указанный целевой путь является каталогом, его значение должно быть True. +**dir_fd (необязательно)**: дескриптор файла, ссылающийся на каталог. -dir_fd (необязательно): дескриптор файла, ссылающийся на каталог. +**Возвращаемое значение**: этот метод не возвращает никакого значения. -Возвращаемое значение: этот метод не возвращает никакого значения. +os.link() +----------- - os.link() - ----------- Метод os.link() создает жесткую ссылку, указывающую на src с именем dst . Этот метод очень полезен для создания копии существующего файла Синтаксис: @@ -295,14 +298,11 @@ dir_fd (необязательно): дескриптор файла, ссыла Параметры: -src — это путь к исходному файлу, для которого будет создана жесткая ссылка. +**src**:это путь к исходному файлу, для которого будет создана жесткая ссылка. -dest — это путь к целевому файлу, по которому будет создана жесткая ссылка. +**dest**:это путь к целевому файлу, по которому будет создана жесткая ссылка. -Возвращаемое значение -Этот метод не возвращает никакого значения. - -Создаёт жёсткую ссылку. +**Возвращаемое значение**: этот метод не возвращает никакого значения. В чем отличие жесткой ссылки от символической? ********************************************** @@ -311,7 +311,8 @@ dest — это путь к целевому файлу, по которому Главное ее отличие от жестких ссылок в том, что при удалении целевого файла ссылка останется, но она будет указывать в никуда, поскольку файла на самом деле больше нет. -Вот основные особенности символических ссылок. +Особенности: +-------------- Могут ссылаться на файлы и каталоги. @@ -332,6 +333,7 @@ dest — это путь к целевому файлу, по которому Этот тип ссылок реализован на более низком уровне файловой системы. Файл размещен только в определенном месте жесткого диска. Но на это место могут ссылаться несколько ссылок из файловой системы. Каждая из ссылок - это отдельный файл, но ведут они к одному участку жесткого диска. Файл можно перемещать между каталогами, и все ссылки останутся рабочими, поскольку для них неважно имя. Особенности: +------------- Работают только в пределах одной файловой системы. @@ -478,3 +480,35 @@ os.path.split # ChipViewer.py В данном примере указано, как сделать множественное назначение. Когда вы разъединяете путь, он становится кортежем, состоящим из двух частей. После того, как мы опробовали две переменные с левой части, первый элемент кортежа назначен к первой переменной, а второй элемент к второй переменной соответственно. + +Задачи на использование функций +******************************* + +Задача 1: +~~~~~~~~~ + +Напишите программу, которая выводит 'Hello, $USER!', где $USER - имя пользователя. Пользоваться print() запрещено. + +Задача 2: +~~~~~~~~~ + +Напишите программу, которая выводит дерево файлов по заданному пути. В ней должны быть: + +а) фильтр по названиям + +б) вывод типа файла: является ли файл символической ссылкой или является обычным файлом + +Задача 3: +~~~~~~~~~ +Напишите программу, которая создаст журнала (отдельную папку), с датированной структурой, например Год\Месяц\День, в которой будут 2021, 2022 года и летние месяцы каждого года. Создайте жесткую ссылку в папке 2022 года на август месяц 2021 года и символическую ссылку на июнь и июль 2021 года. Удалите папку с 2021 годом и опишите как будут вести себя ссылки. Что будет если не удалять папку, а перенести ее в другое место из основного журнал? Какие ссылки в этом случае бкдкт рабочими? + +Задача 4: +~~~~~~~~~ + +Петя только начал изучать программирование и пока не научился пользоваться командой git clone, поэтому скачал несколько репозиториев с Github в .zip формате. Но вот незадача: файлы программ не являются исполняемыми. Есть несколько .zip архивов, в них содержатся файлы необходимых проектов на языке Python. Напишите программу, которая разархивирует проекты в отдельные папки с тем же названием проектов и сделает все Python файлы исполняемыми. + +Задача 5: +~~~~~~~~~ + +Напишите программу, которая проверяет, есть ли в переменных окружения заданный путь. Если переменная есть, вывести название переменной, если ее нет - создать с именем 'OS_PRACTICE + From 8bd8533cb1a792a28942b55fd89594adeb1ba175 Mon Sep 17 00:00:00 2001 From: "o.korchevaya" <71932690+okorchevaya@users.noreply.github.com> Date: Sat, 7 May 2022 14:20:22 +0300 Subject: [PATCH 04/15] Update os.rst --- content/os.rst | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/content/os.rst b/content/os.rst index 6a0db9f..f1960ed 100644 --- a/content/os.rst +++ b/content/os.rst @@ -41,6 +41,7 @@ os.name import os print(os.name) + # C: nt Это говорит нам о том, что наш экземпляр Python работает в окне Windows. Как мы об этом узнали? Майкрософт начали называть свою операционную систему NT много лет назад. Например, Windows 7 также носит имя Windows NT 6.1. @@ -131,12 +132,12 @@ os.environ, os.getenv() и os.putenv() .. code-block:: python - Traceback (most recent call last): - File "", line 1, in + '''Traceback (most recent call last): + File "", line 1, in os.environ["TMP2"] File "C:\Python27\lib\os.py", line 423, in __getitem__ return self.data[key.upper()] - KeyError: 'TMP2' + KeyError: 'TMP2'''' os.chdir() и os.getcwd() @@ -212,6 +213,7 @@ os.rename(src, dst) ---------- Функция os.rename() применяется тогда, когда нужно переименовать файл или папку. Посмотрим на примере: + .. code-block:: python os.rename("test.txt", "pytest.txt") From 36fa1bd4751cc9f513f0b51e7c5e2060b6380af2 Mon Sep 17 00:00:00 2001 From: "o.korchevaya" <71932690+okorchevaya@users.noreply.github.com> Date: Sun, 8 May 2022 16:23:00 +0300 Subject: [PATCH 05/15] Update os.rst --- content/os.rst | 69 ++++++++++++++++++++++++++------------------------ 1 file changed, 36 insertions(+), 33 deletions(-) diff --git a/content/os.rst b/content/os.rst index f1960ed..6875c17 100644 --- a/content/os.rst +++ b/content/os.rst @@ -1,11 +1,14 @@ Модуль os в Python -#################### + :date: 2022-05-07 :summary: Лабораторная работа "Модуль OS Python на Linux" :status: published :author: Корчевая О. Е. +.. contents:: Оглавление + :depth: 2 + Модуль os позволяет Python выполнять многие операции с файлами и папками, которые вы обычно выполняете в командной строке Linux. Модуль предоставляет функции для работы с операционной системой, при этом поведение функций не зависит от ОС. Модуль так же позволяет работать с файлами, папками, а так же со многими другими объектами операционной системы, как, например, процессы или переменные окружения. Познакомимся с самыми популярнфми функциями. **В ходе данной лабораторной работы мы научимся:** @@ -29,10 +32,10 @@ import os Основные функции для работы с модулем -============================== +########################################################## os.name ----------- +========================================================= Модуль os обладает как вызываемыми функциями, так и обычными значениями. В случае с os.name, речь идет только о значениях. При доступе к os.name, вы получите информацию о том, с какой платформой вы работаете. Вам откроются следующие значения: ‘posix’, ‘nt’, ‘os2’, ‘ce’, ‘java’, ‘riscos’. Давайте посмотрим на то, что выйдет, если запустить его на Windows 7: @@ -47,7 +50,7 @@ os.name Это говорит нам о том, что наш экземпляр Python работает в окне Windows. Как мы об этом узнали? Майкрософт начали называть свою операционную систему NT много лет назад. Например, Windows 7 также носит имя Windows NT 6.1. os.environ, os.getenv() и os.putenv() ----------- +========================================================= Значение os.environ известно как объект мэппинга (сопоставления), который работает со словарем переменных пользовательской среды. Возможно вы не знали, но каждый раз, когда вы пользуетесь своим компьютером, некоторые переменные среды уже установлены. @@ -141,7 +144,7 @@ os.environ, os.getenv() и os.putenv() os.chdir() и os.getcwd() ----------- +========================================================= Функция os.chdir позволяет нам вносить изменения в каталоге, который мы в данный момент используем в сессии. Если вам нужно знать, какой путь вы в данный момент используете, для этой нужно вызвать os.getcwd(). Попробуем воспользоваться обоими модулями: @@ -160,10 +163,10 @@ os.chdir() и os.getcwd() Мы открыли директорию по умолчанию в Python, после запуска данного кода в IDLE. После этого мы изменили папки, при помощи os.chdir(). Наконец, мы вызывали os.getcwd() еще раз, чтобы убедиться, что все изменения были выполнены правильно. Работа с папками и файлами -=========================== +##################################### os.mkdir() и os.makedirs() ----------- +========================================================= Как вы могли догадаться, эти два метода уже знакомы нам и используются для создания папок. Первая, os.mkdir(), позволяет создать одну папку. Попробуем: @@ -188,7 +191,7 @@ os.mkdir() и os.makedirs() os.remove() и os.rmdir() ----------- +========================================================= Функции os.remove() и os.rmdir() используются для удаления файлов и каталогов соответственно. Посмотрим на os.remove(): @@ -210,7 +213,7 @@ os.remove() и os.rmdir() os.rename(src, dst) ----------- +========================================================= Функция os.rename() применяется тогда, когда нужно переименовать файл или папку. Посмотрим на примере: @@ -222,7 +225,7 @@ os.rename(src, dst) os.startfile() --------------- +========================================================= Метод os.startfile() позволяет нам «запустить» файл в привязанной к нему программе. Другими словами, мы можем открыть файл вместе с привязанной к нему программой, как когда вы открываете файл PDF двойным щелчком, и он открывается в программе Adobe Reader. Попробуем: @@ -235,7 +238,7 @@ os.startfile() В данном примере мы прошли полный путь к модулю os.startfile, который указывает на открытие файла под названием labels.pdf. На моем компьютере данная функция открывает файл PDF в программе Adobe Reader. Попробуйте открыть файлы PDF, MP3 или фотографии на своем компьютере при помощи данного метода, чтобы увидеть как он работает. os.walk() ----------- +========================================================= Метод os.walk() дает нам возможность для итерации на корневом уровне пути. Это значит, что мы можем назначить путь к этой функции и получить доступ ко всем её подкаталогам и файлам. Используем одну из папок Python, при помощи которой мы можем проверить данную функцию. Мы используем C:\Python27\Tools @@ -262,10 +265,10 @@ os.walk() Функции для работы со ссылками -=============================== +########################################## os.symlink() -------------- +========================================================= Создаёт символическую ссылку на объект. @@ -288,7 +291,7 @@ os.symlink() **Возвращаемое значение**: этот метод не возвращает никакого значения. os.link() ------------ +========================================================= Метод os.link() создает жесткую ссылку, указывающую на src с именем dst . Этот метод очень полезен для создания копии существующего файла @@ -306,15 +309,15 @@ os.link() **Возвращаемое значение**: этот метод не возвращает никакого значения. -В чем отличие жесткой ссылки от символической? -********************************************** +Отличия жесткой и символической ссылок +=========================================== -СИМВОЛИЧЕСКИЕ ССЫЛКИ +**Сиволические** **ссылки** Главное ее отличие от жестких ссылок в том, что при удалении целевого файла ссылка останется, но она будет указывать в никуда, поскольку файла на самом деле больше нет. Особенности: --------------- +~~~~~~~~~~~~~~~~~~~~~~~~ Могут ссылаться на файлы и каталоги. @@ -330,12 +333,12 @@ os.link() Теперь давайте рассмотрим жесткие ссылки. -ЖЕСТКИЕ ССЫЛКИ +**Жесткие** **ссылки** Этот тип ссылок реализован на более низком уровне файловой системы. Файл размещен только в определенном месте жесткого диска. Но на это место могут ссылаться несколько ссылок из файловой системы. Каждая из ссылок - это отдельный файл, но ведут они к одному участку жесткого диска. Файл можно перемещать между каталогами, и все ссылки останутся рабочими, поскольку для них неважно имя. Особенности: -------------- +~~~~~~~~~~~~~~~~~~~~~~~~ Работают только в пределах одной файловой системы. @@ -350,7 +353,7 @@ os.link() Подмодуль os.path -================== +####################### Подмодуль os.path модуля os имеет широкий ряд встроенных преимуществ. Ознакомимся со следующими функциями: @@ -368,7 +371,7 @@ os.link() os.path.basename ------------------- +========================================================= Функция basename вернет название файла пути. Пример: @@ -382,7 +385,7 @@ os.path.basename Это очень полезная функция, особенно в тех случаях, когда нужно использовать имя файла для наименования того или иного связанного с работой файла, например лог-файл. Такая ситуация возникает часто при работе с файлами данных. os.path.dirname ------------------ +========================================================= Функция dirname возвращает только часть каталога пути. Это проще понять, если мы взглянем на пример кода: @@ -396,7 +399,7 @@ os.path.dirname В данном примере мы просто возвращаем путь к каталогу. Это также полезно, когда вам нужно сохранить другие файлы рядом с тем, который вы обрабатываете в данный момент. Как и в случае с лог-файлом, упомянутым выше. os.path.exists ----------------- +========================================================= Функция exists говорит нам, существует ли файл, или нет. Все что вам нужно, это указать ему путь. Взглянем на пример: @@ -411,7 +414,7 @@ os.path.exists В первом примере, мы указали функции exists настоящий путь, на что она указывает как True. Это говорит о том, что данный путь существует. Во втором примере, мы указали неправильный путь, от чего функция указывает нам на это сообщением False. os.path.isdir / os.path.isfile ------------------------------- +========================================================= Методы isdir и isfile тесно связаны с методом exists, так как они также тестируют присутствие или отсутствие файлов или папок на тех или иных путях. Однако, isdir проверяет только пути к папкам, а isfile, соответственно, к файлам. Если вам нужно проверить путь, и не важно, папка это или файл, проще будет воспользоваться методом exists. В любом случае, взглянем на пару примеров: @@ -434,7 +437,7 @@ os.path.isdir / os.path.isfile Уделите особое внимание данным примерам. В первом мы указали путь к файлу и проверили, является ли этот путь в действительности файлом. Затем, во втором примере, мы проделали то же самое, но в контексте папки. Вы можете лично ознакомиться с результатами. После этих двух примеров, мы немного изменили условия, указав путь к папке для обеих функций. Эти примеры наглядно демонстрируют то, как эти функции работают. os.path.join --------------- +========================================================= Метод join позволяет вам совместить несколько путей при помощи присвоенного разделителя. К примеру, в Windows, в роли разделителя выступает бэкслэш (косая черта, указывающая назад), однако в Linux функция разделителя присвоена косой черте, указывающей вперед (forward slash). Как это работает: @@ -448,7 +451,7 @@ os.path.join В данном примере мы совместили путь каталога и файла вместе, для получения рабочего пути. Обратите внимание на то, что метод join не указывает на то, какой результат в итоге вышел. os.path.split ----------------- +========================================================= Метод split разъединяет путь на кортеж, который содержит и файл и каталог. Взглянем на пример: @@ -484,15 +487,15 @@ os.path.split В данном примере указано, как сделать множественное назначение. Когда вы разъединяете путь, он становится кортежем, состоящим из двух частей. После того, как мы опробовали две переменные с левой части, первый элемент кортежа назначен к первой переменной, а второй элемент к второй переменной соответственно. Задачи на использование функций -******************************* +############################################### Задача 1: -~~~~~~~~~ +========================================================= Напишите программу, которая выводит 'Hello, $USER!', где $USER - имя пользователя. Пользоваться print() запрещено. Задача 2: -~~~~~~~~~ +========================================================= Напишите программу, которая выводит дерево файлов по заданному пути. В ней должны быть: @@ -501,16 +504,16 @@ os.path.split б) вывод типа файла: является ли файл символической ссылкой или является обычным файлом Задача 3: -~~~~~~~~~ +========================================================= Напишите программу, которая создаст журнала (отдельную папку), с датированной структурой, например Год\Месяц\День, в которой будут 2021, 2022 года и летние месяцы каждого года. Создайте жесткую ссылку в папке 2022 года на август месяц 2021 года и символическую ссылку на июнь и июль 2021 года. Удалите папку с 2021 годом и опишите как будут вести себя ссылки. Что будет если не удалять папку, а перенести ее в другое место из основного журнал? Какие ссылки в этом случае бкдкт рабочими? Задача 4: -~~~~~~~~~ +========================================================= Петя только начал изучать программирование и пока не научился пользоваться командой git clone, поэтому скачал несколько репозиториев с Github в .zip формате. Но вот незадача: файлы программ не являются исполняемыми. Есть несколько .zip архивов, в них содержатся файлы необходимых проектов на языке Python. Напишите программу, которая разархивирует проекты в отдельные папки с тем же названием проектов и сделает все Python файлы исполняемыми. Задача 5: -~~~~~~~~~ +========================================================= Напишите программу, которая проверяет, есть ли в переменных окружения заданный путь. Если переменная есть, вывести название переменной, если ее нет - создать с именем 'OS_PRACTICE From 8282f76d21fec96288e28809d3f41696f6500d5b Mon Sep 17 00:00:00 2001 From: "o.korchevaya" <71932690+okorchevaya@users.noreply.github.com> Date: Sun, 8 May 2022 16:29:52 +0300 Subject: [PATCH 06/15] Update os.rst --- content/os.rst | 76 ++++++++++++++++++-------------------------------- 1 file changed, 27 insertions(+), 49 deletions(-) diff --git a/content/os.rst b/content/os.rst index 6875c17..c6f1236 100644 --- a/content/os.rst +++ b/content/os.rst @@ -41,11 +41,9 @@ os.name .. code-block:: python - import os - - print(os.name) - - # C: nt + >>> import os + >>> os.name + 'posix' Это говорит нам о том, что наш экземпляр Python работает в окне Windows. Как мы об этом узнали? Майкрософт начали называть свою операционную систему NT много лет назад. Например, Windows 7 также носит имя Windows NT 6.1. @@ -59,50 +57,30 @@ os.environ, os.getenv() и os.putenv() .. code-block:: python - import os - print(os.environ) - -.. code-block:: python - - {'ALLUSERSPROFILE': 'C:\\ProgramData', - 'APPDATA': 'C:\\Users\\mike\\AppData\\Roaming', - 'CLASSPATH': '.;C:\\Program Files\\QuickTime\\QTSystem\\QTJava.zip', - 'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files', - 'COMPUTERNAME': 'MIKE-PC', - 'COMSPEC': 'C:\\Windows\\system32\\cmd.exe', - 'FP_NO_HOST_CHECK': 'NO', - 'HOMEDRIVE': 'C:', - 'HOMEPATH': '\\Users\\mike', - 'LOCALAPPDATA': 'C:\\Users\\mike\\AppData\\Local', - 'LOGONSERVER': '\\\\MIKE-PC', - 'NUMBER_OF_PROCESSORS': '2', - 'OS': 'Windows_NT', - 'PATHEXT': '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC', - 'PROCESSOR_ARCHITECTURE': 'x86', - 'PROCESSOR_IDENTIFIER': 'x86 Family 6 Model 15 Stepping 13, GenuineIntel', - 'PROCESSOR_LEVEL': '6', - 'PROGRAMDATA': 'C:\\ProgramData', - 'PROGRAMFILES': 'C:\\Program Files', - 'PSMODULEPATH': 'C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\Modules\\', - 'PUBLIC': 'C:\\Users\\Public', - 'PYTHONIOENCODING': 'cp437', - 'QTJAVA': 'C:\\Program Files\\QuickTime\\QTSystem\\QTJava.zip', - 'SESSIONNAME': 'Console', - 'SYSTEMDRIVE': 'C:', - 'SYSTEMROOT': 'C:\\Windows', - 'TEMP': 'C:\\Users\\mike\\AppData\\Local\\Temp', - 'TMP': 'C:\\Users\\mike\\AppData\\Local\\Temp', - 'USERDOMAIN': 'mike-PC', - 'USERNAME': 'mike', - 'USERPROFILE': 'C:\\Users\\mike', - 'VBOX_INSTALL_PATH': 'C:\\Program Files\\Oracle\\VirtualBox\\', - 'VS90COMNTOOLS': 'C:\\Program Files\\Microsoft Visual Studio 9.0\\Common7\\Tool\s\\', - 'WINDIR': 'C:\\Windows', - 'WINDOWS_TRACING_FLAGS': '3', - 'WINDOWS_TRACING_LOGFILE': 'C:\\BVTBin\\Tests\\installpackage\\csilogfile.log', - 'WINGDB_ACTIVE': '1', - 'WINGDB_PYTHON': 'c:\\python27\\python.exe', - 'WINGDB_SPAWNCOOKIE': 'rvlxwsGdD7SHYIJm'} + >>> import os + >>> print(os.environ) + environ({'TERM_PROGRAM': 'Apple_Terminal', + 'SHELL': '/bin/bash', + 'TERM': 'xterm-256color', + 'TMPDIR': '/var/folders/hv/p9v314d106z3tqjyxvn5hfm40000gn/T/', + 'CONDA_SHLVL': '0', + 'TERM_PROGRAM_VERSION': '433', + 'TERM_SESSION_ID': '156EFB08-2191-40AC-89C8-A80DA200875F', + 'USER': 'evgenij', + 'CONDA_EXE': '/Users/evgenij/opt/anaconda3/bin/conda', + 'SSH_AUTH_SOCK': '/private/tmp/com.apple.launchd.lJbr3lVPMb/Listeners', + '_CE_CONDA': '', + 'PATH': '/Users/evgenij/opt/anaconda3/condabin:/Library/Frameworks/Python.framework/Versions/3.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/TeX/texbin', + 'PWD': '/Users/evgenij', + 'LANG': 'ru_RU.UTF-8', + 'XPC_FLAGS': '0x0', + '_CE_M': '', + 'XPC_SERVICE_NAME': '0', + 'SHLVL': '1', + 'HOME': '/Users/evgenij', + 'CONDA_PYTHON_EXE': '/Users/evgenij/opt/anaconda3/bin/python', + 'LOGNAME': 'evgenij', '_': '/Library/Frameworks/Python.framework/Versions/3.7/bin/python3', '__CF_USER_TEXT_ENCODING': '0x1F5:0x7:0x31', + '__PYVENV_LAUNCHER__': '/Library/Frameworks/Python.framework/Versions/3.7/bin/python3'}) Ваши данные будут отличаться от моих, так как конфигурация компьютера у всех немного отличается, однако вы определенно увидите большое количество совпадений. Как вы могли заметить, работа функции вернула словарь. Это значит, что вы можете получить доступ к значениям среды, пользуясь обычными словарными методами. Например обрвщаться к нему по ключу: From 3086b349be82833ba6a96c6a4d0a02f34c873379 Mon Sep 17 00:00:00 2001 From: "o.korchevaya" <71932690+okorchevaya@users.noreply.github.com> Date: Sun, 8 May 2022 16:43:44 +0300 Subject: [PATCH 07/15] Update os.rst --- content/os.rst | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/content/os.rst b/content/os.rst index c6f1236..c85941f 100644 --- a/content/os.rst +++ b/content/os.rst @@ -88,8 +88,8 @@ os.environ, os.getenv() и os.putenv() import os - print(os.environ["TMP"]) - # C:\\Users\\mike\\AppData\\Local\\Temp + >>> print(os.environ["TMPDIR"]) + /var/folders/hv/p9v314d106z3tqjyxvn5hfm40000gn/T/ Вы также можете использовать функцию os.getenv для доступа к этой переменной: @@ -97,8 +97,8 @@ os.environ, os.getenv() и os.putenv() import os - print(os.getenv("TMP")) - # C:\\Users\\mike\\AppData\\Local\\Temp + >>> print(os.getenv("TMPDIR")) + /var/folders/hv/p9v314d106z3tqjyxvn5hfm40000gn/T/ Полезность использования os.getenv() вместо словаря os.environ заключается в том, что если вы находитесь в положении, когда вам нужно получить доступ к переменной среды, которая не существует, функция getenv попросту ничего не сделает. Если вы попытаетесь сделать то же самое, пользуясь os.environ, вы получите уведомление об ошибке. Давайте попробуем на примере: @@ -106,19 +106,12 @@ os.environ, os.getenv() и os.putenv() import os - print(os.environ["TMP2"]) - - -Результат выполнения данного скрипта: - -.. code-block:: python - - '''Traceback (most recent call last): - File "", line 1, in - os.environ["TMP2"] - File "C:\Python27\lib\os.py", line 423, in __getitem__ - return self.data[key.upper()] - KeyError: 'TMP2'''' + >>> print(os.environ["TMP2"]) + Traceback (most recent call last): + File "", line 1, in + File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/os.py", line 678, in __getitem__ + raise KeyError(key) from None + KeyError: 'TMP2' os.chdir() и os.getcwd() From 8132fc6827cd4227e302fe3fd9e12d2ad05f8242 Mon Sep 17 00:00:00 2001 From: "o.korchevaya" <71932690+okorchevaya@users.noreply.github.com> Date: Sun, 8 May 2022 16:58:31 +0300 Subject: [PATCH 08/15] Update os.rst --- content/os.rst | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/content/os.rst b/content/os.rst index c85941f..a751dc5 100644 --- a/content/os.rst +++ b/content/os.rst @@ -29,7 +29,7 @@ .. code-block:: python - import os + >>> import os Основные функции для работы с модулем ########################################################## @@ -41,8 +41,8 @@ os.name .. code-block:: python - >>> import os >>> os.name + 'posix' Это говорит нам о том, что наш экземпляр Python работает в окне Windows. Как мы об этом узнали? Майкрософт начали называть свою операционную систему NT много лет назад. Например, Windows 7 также носит имя Windows NT 6.1. @@ -57,8 +57,8 @@ os.environ, os.getenv() и os.putenv() .. code-block:: python - >>> import os >>> print(os.environ) + environ({'TERM_PROGRAM': 'Apple_Terminal', 'SHELL': '/bin/bash', 'TERM': 'xterm-256color', @@ -79,34 +79,32 @@ os.environ, os.getenv() и os.putenv() 'SHLVL': '1', 'HOME': '/Users/evgenij', 'CONDA_PYTHON_EXE': '/Users/evgenij/opt/anaconda3/bin/python', - 'LOGNAME': 'evgenij', '_': '/Library/Frameworks/Python.framework/Versions/3.7/bin/python3', '__CF_USER_TEXT_ENCODING': '0x1F5:0x7:0x31', + 'LOGNAME': 'evgenij', '_': '/Library/Frameworks/Python.framework/Versions/3.7/bin/python3', + '__CF_USER_TEXT_ENCODING': '0x1F5:0x7:0x31', '__PYVENV_LAUNCHER__': '/Library/Frameworks/Python.framework/Versions/3.7/bin/python3'}) Ваши данные будут отличаться от моих, так как конфигурация компьютера у всех немного отличается, однако вы определенно увидите большое количество совпадений. Как вы могли заметить, работа функции вернула словарь. Это значит, что вы можете получить доступ к значениям среды, пользуясь обычными словарными методами. Например обрвщаться к нему по ключу: .. code-block:: python - import os - >>> print(os.environ["TMPDIR"]) + /var/folders/hv/p9v314d106z3tqjyxvn5hfm40000gn/T/ Вы также можете использовать функцию os.getenv для доступа к этой переменной: .. code-block:: python - import os - >>> print(os.getenv("TMPDIR")) + /var/folders/hv/p9v314d106z3tqjyxvn5hfm40000gn/T/ Полезность использования os.getenv() вместо словаря os.environ заключается в том, что если вы находитесь в положении, когда вам нужно получить доступ к переменной среды, которая не существует, функция getenv попросту ничего не сделает. Если вы попытаетесь сделать то же самое, пользуясь os.environ, вы получите уведомление об ошибке. Давайте попробуем на примере: .. code-block:: python - import os - >>> print(os.environ["TMP2"]) + Traceback (most recent call last): File "", line 1, in File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/os.py", line 678, in __getitem__ @@ -121,10 +119,9 @@ os.chdir() и os.getcwd() .. code-block:: python - import os - - print(os.getcwd()) - # C:\\Python27 + >>> os.getcwd() + + '/Users/evgenij' os.chdir(r"C:\Users\mike\Documents") From 001727f263352dc06452ed84e4063daba4cb11a1 Mon Sep 17 00:00:00 2001 From: "o.korchevaya" <71932690+okorchevaya@users.noreply.github.com> Date: Sun, 8 May 2022 17:13:31 +0300 Subject: [PATCH 09/15] Update os.rst --- content/os.rst | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/content/os.rst b/content/os.rst index a751dc5..d4bd462 100644 --- a/content/os.rst +++ b/content/os.rst @@ -59,6 +59,8 @@ os.environ, os.getenv() и os.putenv() >>> print(os.environ) +.. code-block:: txt + environ({'TERM_PROGRAM': 'Apple_Terminal', 'SHELL': '/bin/bash', 'TERM': 'xterm-256color', @@ -89,6 +91,8 @@ os.environ, os.getenv() и os.putenv() >>> print(os.environ["TMPDIR"]) +.. code-block:: txt + /var/folders/hv/p9v314d106z3tqjyxvn5hfm40000gn/T/ Вы также можете использовать функцию os.getenv для доступа к этой переменной: @@ -97,6 +101,8 @@ os.environ, os.getenv() и os.putenv() >>> print(os.getenv("TMPDIR")) +.. code-block:: txt + /var/folders/hv/p9v314d106z3tqjyxvn5hfm40000gn/T/ Полезность использования os.getenv() вместо словаря os.environ заключается в том, что если вы находитесь в положении, когда вам нужно получить доступ к переменной среды, которая не существует, функция getenv попросту ничего не сделает. Если вы попытаетесь сделать то же самое, пользуясь os.environ, вы получите уведомление об ошибке. Давайте попробуем на примере: @@ -105,6 +111,8 @@ os.environ, os.getenv() и os.putenv() >>> print(os.environ["TMP2"]) +.. code-block:: txt + Traceback (most recent call last): File "", line 1, in File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/os.py", line 678, in __getitem__ @@ -120,8 +128,10 @@ os.chdir() и os.getcwd() .. code-block:: python >>> os.getcwd() + '/Users/evgenij' + os.chdir(r"C:\Users\mike\Documents") @@ -140,20 +150,16 @@ os.mkdir() и os.makedirs() .. code-block:: python - import os - - os.mkdir("test") - path = r'C:\Users\mike\Documents\pytest' - os.mkdir(path) + >>> import os + >>> path = r'C:\Users\evjenij\Documents' + >>> os.mkdir(path) Первая строка кода создает папку под названием test в определенном каталоге. Вы можете использовать эти модули в предыдущем разделе, чтобы узнать, где именно вы запустили свой код, на случай, если вы забыли. Во втором примере мы назначили путь к переменной, затем к os.mkdir(). Это позволяет вам создать папку в любой точке вашей системы, где есть доступ. Функция os.makedirs() создает промежуточные папки в пути, если их там нет. В целом, это значит, что вы создали путь, в котором размещены папки. Данное решение удобно, когда есть необходимость создания журнала, с датированной структурой, например Год\Месяц\День. Давайте взглянем на пример: .. code-block:: python - import os - - path = r'C:\Users\mike\Documents\pytest\2014\02\19' - os.makedirs(path) + >>> path = r'C:\Users\evjenij\Documents\pytest\2014\02\19' + >>> os.makedirs(path) Что произошло? Этот код просто создал кучу папок! Если в вашей системе все еще есть папка pytest, то в ней появится папка 2014, в которой также есть папка, в которой, удивительно, находится еще одна. Попробуйте сами, воспользовавшись рабочим путем в вашей системе. @@ -165,17 +171,13 @@ os.remove() и os.rmdir() .. code-block:: python - import os - - os.remove("test.txt") + >>> os.remove("test.txt") Этот фрагмент кода пытается удалить файл под названием test.txt из вашего рабочего каталога. Если модуль не может найти файл, должно появиться уведомление о той или иной ошибке. Ошибка также возникнет, если файл уже используется (другими словами закрыт), или у вас нет разрешения для удаления данного файла. Возможно, вы хотите проверить os.unlink, который выполняет ту же функцию. Термин unlink – привычное для Unix название данной процедуры. Взглянем на пример работы os.rmdir(): .. code-block:: python - import os - - os.rmdir("pytest") + >>> os.rmdir("pytest") Данный код попытается удалить каталог под названием pytest из каталога, используемого в данный момент в работе. В случае, если это удалось, каталог pytest исчезнет. Ошибка может возникнуть, если каталога с таким названием не существует, если у вас нет разрешения на его удаление, или если каталог не пустой. Вам возможно хочется взглянуть на os.removedirs(), который может удалить пустые вложенные каталоги. @@ -187,7 +189,7 @@ os.rename(src, dst) .. code-block:: python - os.rename("test.txt", "pytest.txt") + >>> os.rename("test.txt", "pytest.txt") В этом примере, мы указали os.rename на то, что нужно переименовать файл под названием test.txt на pytest.txt. Это произойдет в каталоге, с которым мы в данный момент работаем. Ошибка может возникнуть в том случае, если вы попытаетесь переименовать несуществующий файл, или если у вас нет доступа к данной операции. Также существует функция os.renames, которая меняет название папки или файла соответственно. @@ -199,9 +201,7 @@ os.startfile() .. code-block:: python - import os - - os.startfile(r'C:\Users\mike\Documents\labels.pdf') + >>> os.startfile(r'C:\Users\evjenij\Documents\labels.pdf') В данном примере мы прошли полный путь к модулю os.startfile, который указывает на открытие файла под названием labels.pdf. На моем компьютере данная функция открывает файл PDF в программе Adobe Reader. Попробуйте открыть файлы PDF, MP3 или фотографии на своем компьютере при помощи данного метода, чтобы увидеть как он работает. @@ -214,7 +214,7 @@ os.walk() import os - path = r'C:\Python27\Tools' + path = r'C:\Python3\Tools' for root, dirs, files in os.walk(path): print(root) From be8d18a9a7839e187bddbd5ec9eeb467cb944647 Mon Sep 17 00:00:00 2001 From: "o.korchevaya" <71932690+okorchevaya@users.noreply.github.com> Date: Sun, 8 May 2022 19:07:08 +0300 Subject: [PATCH 10/15] Update os.rst --- content/os.rst | 111 ++++++++++++++++++++++++++----------------------- 1 file changed, 60 insertions(+), 51 deletions(-) diff --git a/content/os.rst b/content/os.rst index d4bd462..26fdea9 100644 --- a/content/os.rst +++ b/content/os.rst @@ -208,28 +208,26 @@ os.startfile() os.walk() ========================================================= -Метод os.walk() дает нам возможность для итерации на корневом уровне пути. Это значит, что мы можем назначить путь к этой функции и получить доступ ко всем её подкаталогам и файлам. Используем одну из папок Python, при помощи которой мы можем проверить данную функцию. Мы используем C:\Python27\Tools +Метод os.walk() дает нам возможность для итерации на корневом уровне пути. Это значит, что мы можем назначить путь к этой функции и получить доступ ко всем её подкаталогам и файлам. Используем одну из папок Python, при помощи которой мы можем проверить данную функцию. Мы используем C:\Python3\Tools .. code-block:: python - import os + >>> path = r'C:\Python3\Tools' - path = r'C:\Python3\Tools' - - for root, dirs, files in os.walk(path): - print(root) + >>> for root, dirs, files in os.walk(path): + print(root) Результат работы: -.. code-block:: python +.. code-block:: txt - C:\Python27\Tools - C:\Python27\Tools\i18n - C:\Python27\Tools\pynche - C:\Python27\Tools\pynche\X - C:\Python27\Tools\Scripts - C:\Python27\Tools\versioncheck - C:\Python27\Tools\webchecker + C:\Python3\Tools + C:\Python3\Tools\i18n + C:\Python3\Tools\pynche + C:\Python3\Tools\pynche\X + C:\Python3\Tools\Scripts + C:\Python3\Tools\versioncheck + C:\Python3\Tools\webchecker Функции для работы со ссылками @@ -345,10 +343,11 @@ os.path.basename .. code-block:: python - import os + >>> os.path.basename(r'C:\Python3\Tools\pynche\ChipViewer.py') + +.. code-block:: txt - os.path.basename(r'C:\Python27\Tools\pynche\ChipViewer.py') - # ChipViewer.py +# ChipViewer.py Это очень полезная функция, особенно в тех случаях, когда нужно использовать имя файла для наименования того или иного связанного с работой файла, например лог-файл. Такая ситуация возникает часто при работе с файлами данных. @@ -359,10 +358,11 @@ os.path.dirname .. code-block:: python - import os + >>> print( os.path.dirname(r'C:\Python3\Tools\pynche\ChipViewer.py') ) + +.. code-block:: txt - print( os.path.dirname(r'C:\Python27\Tools\pynche\ChipViewer.py') ) - # C:\\Python27\\Tools\\pynche + # C:\\Python3\\Tools\\pynche В данном примере мы просто возвращаем путь к каталогу. Это также полезно, когда вам нужно сохранить другие файлы рядом с тем, который вы обрабатываете в данный момент. Как и в случае с лог-файлом, упомянутым выше. @@ -373,11 +373,9 @@ os.path.exists .. code-block:: python - import os + >>> os.path.exists(r'C:\Python3\Tools\pynche\ChipViewer.py') # True - os.path.exists(r'C:\Python27\Tools\pynche\ChipViewer.py') # True - - os.path.exists(r'C:\Python27\Tools\pynche\fake.py') # False + >>> os.path.exists(r'C:\Python3\Tools\pynche\fake.py') # False В первом примере, мы указали функции exists настоящий путь, на что она указывает как True. Это говорит о том, что данный путь существует. Во втором примере, мы указали неправильный путь, от чего функция указывает нам на это сообщением False. @@ -388,19 +386,21 @@ os.path.isdir / os.path.isfile .. code-block:: python - import os - - os.path.isfile(r'C:\Python27\Tools\pynche\ChipViewer.py') - # True + >>> os.path.isfile(r'C:\Python3\Tools\pynche\ChipViewer.py') + + True - os.path.isdir(r'C:\Python27\Tools\pynche\ChipViewer.py') - # False + >>> os.path.isdir(r'C:\Python3\Tools\pynche\ChipViewer.py') + + False - os.path.isdir(r'C:\Python27\Tools\pynche') - # True + >>> os.path.isdir(r'C:\Python3\Tools\pynche') + + True - os.path.isfile(r'C:\Python27\Tools\pynche') - # False + >>> os.path.isfile(r'C:\Python3\Tools\pynche') + + False Уделите особое внимание данным примерам. В первом мы указали путь к файлу и проверили, является ли этот путь в действительности файлом. Затем, во втором примере, мы проделали то же самое, но в контексте папки. Вы можете лично ознакомиться с результатами. После этих двух примеров, мы немного изменили условия, указав путь к папке для обеих функций. Эти примеры наглядно демонстрируют то, как эти функции работают. @@ -411,10 +411,11 @@ os.path.join .. code-block:: python - import os - - print( os.path.join(r'C:\Python27\Tools\pynche', 'ChipViewer.py') ) - # C:\\Python27\\Tools\\pynche\\ChipViewer.py + >>> print( os.path.join(r'C:\Python3\Tools\pynche', 'ChipViewer.py') ) + +.. code-block:: txt + + C:\\Python3\\Tools\\pynche\\ChipViewer.py В данном примере мы совместили путь каталога и файла вместе, для получения рабочего пути. Обратите внимание на то, что метод join не указывает на то, какой результат в итоге вышел. @@ -425,32 +426,40 @@ os.path.split .. code-block:: python - import os - - print( os.path.split(r'C:\Python27\Tools\pynche\ChipViewer.py') ) - # ('C:\\Python27\\Tools\\pynche', 'ChipViewer.py') + >>> print( os.path.split(r'C:\Python3\Tools\pynche\ChipViewer.py') ) + +.. code-block:: txt + + 'C:\\Python3\\Tools\\pynche', 'ChipViewer.py' В данном примере показано, что происходит, когда мы указываем путь к файлу. Теперь взглянем на то, что происходит, если в конце пути нет названия файла: .. code-block:: python - import os + >>> print( os.path.split(r'C:\Python3\Tools\pynche') ) + +.. code-block:: txt - print( os.path.split(r'C:\Python27\Tools\pynche') ) - # (‘C:\Python27\Tools’, ‘pynche’) + # (‘C:\Python3\Tools’, ‘pynche’) Как видите, данная функция берет путь и разъединяет его таким образом, что подпапка стала вторым элементом кортежа с остальной частью пути в первом элементе. Напоследок, взглянем на бытовой случай использования split: .. code-block:: python - import os + >>> dirname, fname = os.path.split(r'C:\Python3\Tools\pynche\ChipViewer.py') + >>> print(dirname) + +.. code-block:: txt + + C:\\Python3\\Tools\\pynche - dirname, fname = os.path.split(r'C:\Python27\Tools\pynche\ChipViewer.py') - print(dirname) - # C:\\Python27\\Tools\\pynche +.. code-block:: python - print(fname) - # ChipViewer.py + >>> print(fname) + +.. code-block:: txt + + ChipViewer.py В данном примере указано, как сделать множественное назначение. Когда вы разъединяете путь, он становится кортежем, состоящим из двух частей. После того, как мы опробовали две переменные с левой части, первый элемент кортежа назначен к первой переменной, а второй элемент к второй переменной соответственно. From 74ba271fb5b02c447138f341a1008d52a1dc8e3c Mon Sep 17 00:00:00 2001 From: "o.korchevaya" <71932690+okorchevaya@users.noreply.github.com> Date: Sun, 8 May 2022 19:50:28 +0300 Subject: [PATCH 11/15] Update os.rst --- content/os.rst | 85 ++++++++++++++++++++++++++++---------------------- 1 file changed, 48 insertions(+), 37 deletions(-) diff --git a/content/os.rst b/content/os.rst index 26fdea9..eeef773 100644 --- a/content/os.rst +++ b/content/os.rst @@ -37,7 +37,7 @@ os.name ========================================================= -Модуль os обладает как вызываемыми функциями, так и обычными значениями. В случае с os.name, речь идет только о значениях. При доступе к os.name, вы получите информацию о том, с какой платформой вы работаете. Вам откроются следующие значения: ‘posix’, ‘nt’, ‘os2’, ‘ce’, ‘java’, ‘riscos’. Давайте посмотрим на то, что выйдет, если запустить его на Windows 7: +Модуль os обладает как вызываемыми функциями, так и обычными значениями. В случае с os.name, речь идет только о значениях. При доступе к os.name, вы получите информацию о том, с какой платформой вы работаете. Вам откроются следующие значения: ‘posix’, ‘nt’, ‘os2’, ‘ce’, ‘java’, ‘riscos’. Давайте посмотрим на то, что выйдет, если запустить его на Mac OS: .. code-block:: python @@ -45,9 +45,9 @@ os.name 'posix' -Это говорит нам о том, что наш экземпляр Python работает в окне Windows. Как мы об этом узнали? Майкрософт начали называть свою операционную систему NT много лет назад. Например, Windows 7 также носит имя Windows NT 6.1. +Это говорит нам о том, что наш экземпляр Python работает в окне Mac OS. -os.environ, os.getenv() и os.putenv() +os.environ, os.getenv( ) и os.putenv( ) ========================================================= Значение os.environ известно как объект мэппинга (сопоставления), который работает со словарем переменных пользовательской среды. Возможно вы не знали, но каждый раз, когда вы пользуетесь своим компьютером, некоторые переменные среды уже установлены. @@ -120,30 +120,35 @@ os.environ, os.getenv() и os.putenv() KeyError: 'TMP2' -os.chdir() и os.getcwd() +os.chdir( ) и os.getcwd( ) ========================================================= Функция os.chdir позволяет нам вносить изменения в каталоге, который мы в данный момент используем в сессии. Если вам нужно знать, какой путь вы в данный момент используете, для этой нужно вызвать os.getcwd(). Попробуем воспользоваться обоими модулями: .. code-block:: python - >>> os.getcwd() + >>> os.getcwd() +.. code-block:: txt '/Users/evgenij' +.. code-block:: python - os.chdir(r"C:\Users\mike\Documents") + >>> os.chdir(r"C:\Users\mike\Documents") + + >>> print(os.getcwd()) - print(os.getcwd()) - # C:\\Users\\mike\\Documents +.. code-block:: txt + + C:\\Users\\mike\\Documents Мы открыли директорию по умолчанию в Python, после запуска данного кода в IDLE. После этого мы изменили папки, при помощи os.chdir(). Наконец, мы вызывали os.getcwd() еще раз, чтобы убедиться, что все изменения были выполнены правильно. Работа с папками и файлами ##################################### -os.mkdir() и os.makedirs() +os.mkdir( ) и os.makedirs( ) ========================================================= Как вы могли догадаться, эти два метода уже знакомы нам и используются для создания папок. Первая, os.mkdir(), позволяет создать одну папку. Попробуем: @@ -164,7 +169,7 @@ os.mkdir() и os.makedirs() Что произошло? Этот код просто создал кучу папок! Если в вашей системе все еще есть папка pytest, то в ней появится папка 2014, в которой также есть папка, в которой, удивительно, находится еще одна. Попробуйте сами, воспользовавшись рабочим путем в вашей системе. -os.remove() и os.rmdir() +os.remove( ) /os.rmdir( ) ========================================================= Функции os.remove() и os.rmdir() используются для удаления файлов и каталогов соответственно. Посмотрим на os.remove(): @@ -185,7 +190,7 @@ os.remove() и os.rmdir() os.rename(src, dst) ========================================================= -Функция os.rename() применяется тогда, когда нужно переименовать файл или папку. Посмотрим на примере: +Функция os.rename( ) применяется тогда, когда нужно переименовать файл или папку. Посмотрим на примере: .. code-block:: python @@ -194,10 +199,10 @@ os.rename(src, dst) В этом примере, мы указали os.rename на то, что нужно переименовать файл под названием test.txt на pytest.txt. Это произойдет в каталоге, с которым мы в данный момент работаем. Ошибка может возникнуть в том случае, если вы попытаетесь переименовать несуществующий файл, или если у вас нет доступа к данной операции. Также существует функция os.renames, которая меняет название папки или файла соответственно. -os.startfile() +os.startfile( ) ========================================================= -Метод os.startfile() позволяет нам «запустить» файл в привязанной к нему программе. Другими словами, мы можем открыть файл вместе с привязанной к нему программой, как когда вы открываете файл PDF двойным щелчком, и он открывается в программе Adobe Reader. Попробуем: +Метод os.startfile( ) позволяет нам «запустить» файл в привязанной к нему программе. Другими словами, мы можем открыть файл вместе с привязанной к нему программой, как когда вы открываете файл PDF двойным щелчком, и он открывается в программе Adobe Reader. Попробуем: .. code-block:: python @@ -205,10 +210,10 @@ os.startfile() В данном примере мы прошли полный путь к модулю os.startfile, который указывает на открытие файла под названием labels.pdf. На моем компьютере данная функция открывает файл PDF в программе Adobe Reader. Попробуйте открыть файлы PDF, MP3 или фотографии на своем компьютере при помощи данного метода, чтобы увидеть как он работает. -os.walk() +os.walk( ) ========================================================= -Метод os.walk() дает нам возможность для итерации на корневом уровне пути. Это значит, что мы можем назначить путь к этой функции и получить доступ ко всем её подкаталогам и файлам. Используем одну из папок Python, при помощи которой мы можем проверить данную функцию. Мы используем C:\Python3\Tools +Метод os.walk( ) дает нам возможность для итерации на корневом уровне пути. Это значит, что мы можем назначить путь к этой функции и получить доступ ко всем её подкаталогам и файлам. Используем одну из папок Python, при помощи которой мы можем проверить данную функцию. Мы используем C:\Python3\Tools .. code-block:: python @@ -233,7 +238,7 @@ os.walk() Функции для работы со ссылками ########################################## -os.symlink() +os.symlink( ) ========================================================= Создаёт символическую ссылку на объект. @@ -256,10 +261,10 @@ os.symlink() **Возвращаемое значение**: этот метод не возвращает никакого значения. -os.link() +os.link( ) ========================================================= -Метод os.link() создает жесткую ссылку, указывающую на src с именем dst . Этот метод очень полезен для создания копии существующего файла +Метод os.link( ) создает жесткую ссылку, указывающую на src с именем dst . Этот метод очень полезен для создания копии существующего файла Синтаксис: @@ -269,9 +274,9 @@ os.link() Параметры: -**src**:это путь к исходному файлу, для которого будет создана жесткая ссылка. +**src**: это путь к исходному файлу, для которого будет создана жесткая ссылка. -**dest**:это путь к целевому файлу, по которому будет создана жесткая ссылка. +**dest**: это путь к целевому файлу, по которому будет создана жесткая ссылка. **Возвращаемое значение**: этот метод не возвращает никакого значения. @@ -285,19 +290,19 @@ os.link() Особенности: ~~~~~~~~~~~~~~~~~~~~~~~~ -Могут ссылаться на файлы и каталоги. +#. Могут ссылаться на файлы и каталоги. -После удаления, перемещения или переименования файла становятся недействительными. +#. После удаления, перемещения или переименования файла становятся недействительными. -Права доступа и номер inode отличаются от исходного файла. +#. Права доступа и номер inode отличаются от исходного файла. -При изменении прав доступа для исходного файла, права на ссылку останутся неизменными. +#. При изменении прав доступа для исходного файла, права на ссылку останутся неизменными. -Можно ссылаться на другие разделы диска. +#. Можно ссылаться на другие разделы диска. -Содержат только имя файла, а не его содержимое. +#. Содержат только имя файла, а не его содержимое. -Теперь давайте рассмотрим жесткие ссылки. +#. Теперь давайте рассмотрим жесткие ссылки. **Жесткие** **ссылки** @@ -306,15 +311,15 @@ os.link() Особенности: ~~~~~~~~~~~~~~~~~~~~~~~~ -Работают только в пределах одной файловой системы. +#. Работают только в пределах одной файловой системы. -Нельзя ссылаться на каталоги. +#. Нельзя ссылаться на каталоги. -Имеют ту же информацию inode и набор разрешений что и у исходного файла. +#. Имеют ту же информацию inode и набор разрешений что и у исходного файла. -Разрешения на ссылку изменяться при изменении разрешений файла. +#. Разрешения на ссылку изменяться при изменении разрешений файла. -Можно перемещать и переименовывать и даже удалять файл без вреда ссылке. +#. Можно перемещать и переименовывать и даже удалять файл без вреда ссылке. @@ -347,7 +352,7 @@ os.path.basename .. code-block:: txt -# ChipViewer.py + ChipViewer.py Это очень полезная функция, особенно в тех случаях, когда нужно использовать имя файла для наименования того или иного связанного с работой файла, например лог-файл. Такая ситуация возникает часто при работе с файлами данных. @@ -362,7 +367,7 @@ os.path.dirname .. code-block:: txt - # C:\\Python3\\Tools\\pynche + C:\\Python3\\Tools\\pynche В данном примере мы просто возвращаем путь к каталогу. Это также полезно, когда вам нужно сохранить другие файлы рядом с тем, который вы обрабатываете в данный момент. Как и в случае с лог-файлом, упомянутым выше. @@ -373,9 +378,13 @@ os.path.exists .. code-block:: python - >>> os.path.exists(r'C:\Python3\Tools\pynche\ChipViewer.py') # True + >>> os.path.exists(r'C:\Python3\Tools\pynche\ChipViewer.py') + + True - >>> os.path.exists(r'C:\Python3\Tools\pynche\fake.py') # False + >>> os.path.exists(r'C:\Python3\Tools\pynche\fake.py') + + False В первом примере, мы указали функции exists настоящий путь, на что она указывает как True. Это говорит о том, что данный путь существует. Во втором примере, мы указали неправильный путь, от чего функция указывает нам на это сообщением False. @@ -440,7 +449,7 @@ os.path.split .. code-block:: txt - # (‘C:\Python3\Tools’, ‘pynche’) + ‘C:\Python3\Tools’, ‘pynche’ Как видите, данная функция берет путь и разъединяет его таким образом, что подпапка стала вторым элементом кортежа с остальной частью пути в первом элементе. Напоследок, взглянем на бытовой случай использования split: @@ -463,6 +472,8 @@ os.path.split В данном примере указано, как сделать множественное назначение. Когда вы разъединяете путь, он становится кортежем, состоящим из двух частей. После того, как мы опробовали две переменные с левой части, первый элемент кортежа назначен к первой переменной, а второй элемент к второй переменной соответственно. +----------------------------------------------------------------------------------------------------------------------------- + Задачи на использование функций ############################################### From 3b2fdde890a780aa68a6d33a2c3050db9d46bba7 Mon Sep 17 00:00:00 2001 From: "o.korchevaya" <71932690+okorchevaya@users.noreply.github.com> Date: Sun, 8 May 2022 19:54:16 +0300 Subject: [PATCH 12/15] Update os.rst --- content/os.rst | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/content/os.rst b/content/os.rst index eeef773..168bfb4 100644 --- a/content/os.rst +++ b/content/os.rst @@ -47,7 +47,7 @@ os.name Это говорит нам о том, что наш экземпляр Python работает в окне Mac OS. -os.environ, os.getenv( ) и os.putenv( ) +os.environ / os.getenv( ) / os.putenv( ) ========================================================= Значение os.environ известно как объект мэппинга (сопоставления), который работает со словарем переменных пользовательской среды. Возможно вы не знали, но каждый раз, когда вы пользуетесь своим компьютером, некоторые переменные среды уже установлены. @@ -120,7 +120,7 @@ os.environ, os.getenv( ) и os.putenv( ) KeyError: 'TMP2' -os.chdir( ) и os.getcwd( ) +os.chdir( ) / os.getcwd( ) ========================================================= Функция os.chdir позволяет нам вносить изменения в каталоге, который мы в данный момент используем в сессии. Если вам нужно знать, какой путь вы в данный момент используете, для этой нужно вызвать os.getcwd(). Попробуем воспользоваться обоими модулями: @@ -148,7 +148,7 @@ os.chdir( ) и os.getcwd( ) Работа с папками и файлами ##################################### -os.mkdir( ) и os.makedirs( ) +os.mkdir( ) / os.makedirs( ) ========================================================= Как вы могли догадаться, эти два метода уже знакомы нам и используются для создания папок. Первая, os.mkdir(), позволяет создать одну папку. Попробуем: @@ -169,7 +169,7 @@ os.mkdir( ) и os.makedirs( ) Что произошло? Этот код просто создал кучу папок! Если в вашей системе все еще есть папка pytest, то в ней появится папка 2014, в которой также есть папка, в которой, удивительно, находится еще одна. Попробуйте сами, воспользовавшись рабочим путем в вашей системе. -os.remove( ) /os.rmdir( ) +os.remove( ) / os.rmdir( ) ========================================================= Функции os.remove() и os.rmdir() используются для удаления файлов и каталогов соответственно. Посмотрим на os.remove(): @@ -477,12 +477,12 @@ os.path.split Задачи на использование функций ############################################### -Задача 1: +Задача 1 ========================================================= Напишите программу, которая выводит 'Hello, $USER!', где $USER - имя пользователя. Пользоваться print() запрещено. -Задача 2: +Задача 2 ========================================================= Напишите программу, которая выводит дерево файлов по заданному пути. В ней должны быть: @@ -491,16 +491,16 @@ os.path.split б) вывод типа файла: является ли файл символической ссылкой или является обычным файлом -Задача 3: +Задача 3 ========================================================= Напишите программу, которая создаст журнала (отдельную папку), с датированной структурой, например Год\Месяц\День, в которой будут 2021, 2022 года и летние месяцы каждого года. Создайте жесткую ссылку в папке 2022 года на август месяц 2021 года и символическую ссылку на июнь и июль 2021 года. Удалите папку с 2021 годом и опишите как будут вести себя ссылки. Что будет если не удалять папку, а перенести ее в другое место из основного журнал? Какие ссылки в этом случае бкдкт рабочими? -Задача 4: +Задача 4 ========================================================= Петя только начал изучать программирование и пока не научился пользоваться командой git clone, поэтому скачал несколько репозиториев с Github в .zip формате. Но вот незадача: файлы программ не являются исполняемыми. Есть несколько .zip архивов, в них содержатся файлы необходимых проектов на языке Python. Напишите программу, которая разархивирует проекты в отдельные папки с тем же названием проектов и сделает все Python файлы исполняемыми. -Задача 5: +Задача 5 ========================================================= Напишите программу, которая проверяет, есть ли в переменных окружения заданный путь. Если переменная есть, вывести название переменной, если ее нет - создать с именем 'OS_PRACTICE From 1843ce77ce55af30661627be459ae7a5ae03c1cc Mon Sep 17 00:00:00 2001 From: "o.korchevaya" <71932690+okorchevaya@users.noreply.github.com> Date: Sun, 8 May 2022 19:57:05 +0300 Subject: [PATCH 13/15] Update os.rst --- content/os.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/content/os.rst b/content/os.rst index 168bfb4..c62eb1f 100644 --- a/content/os.rst +++ b/content/os.rst @@ -131,7 +131,7 @@ os.chdir( ) / os.getcwd( ) .. code-block:: txt - '/Users/evgenij' + /Users/evgenij .. code-block:: python @@ -155,7 +155,6 @@ os.mkdir( ) / os.makedirs( ) .. code-block:: python - >>> import os >>> path = r'C:\Users\evjenij\Documents' >>> os.mkdir(path) From 492589e704293479d7177735ea387a146ed4390f Mon Sep 17 00:00:00 2001 From: "o.korchevaya" <71932690+okorchevaya@users.noreply.github.com> Date: Sat, 14 May 2022 11:10:55 +0300 Subject: [PATCH 14/15] Update os.rst --- content/os.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/os.rst b/content/os.rst index c62eb1f..0d693c1 100644 --- a/content/os.rst +++ b/content/os.rst @@ -37,7 +37,7 @@ os.name ========================================================= -Модуль os обладает как вызываемыми функциями, так и обычными значениями. В случае с os.name, речь идет только о значениях. При доступе к os.name, вы получите информацию о том, с какой платформой вы работаете. Вам откроются следующие значения: ‘posix’, ‘nt’, ‘os2’, ‘ce’, ‘java’, ‘riscos’. Давайте посмотрим на то, что выйдет, если запустить его на Mac OS: +Модуль os обладает как вызываемыми функциями, так и обычными значениями. В случае с os.name, речь идет только о значениях. При доступе к os.name, вы получите информацию о том, с какой платформой вы работаете. Вам откроются следующие значения: ``‘posix’``, ``‘nt’``, ``‘os2’``, ``‘ce’``, ``‘java’``,`` ‘riscos’``. Давайте посмотрим на то, что выйдет, если запустить его на Mac OS: .. code-block:: python @@ -50,7 +50,7 @@ os.name os.environ / os.getenv( ) / os.putenv( ) ========================================================= -Значение os.environ известно как объект мэппинга (сопоставления), который работает со словарем переменных пользовательской среды. Возможно вы не знали, но каждый раз, когда вы пользуетесь своим компьютером, некоторые переменные среды уже установлены. +Значение ``os.environ`` известно как объект мэппинга (сопоставления), который работает со словарем переменных пользовательской среды. Возможно вы не знали, но каждый раз, когда вы пользуетесь своим компьютером, некоторые переменные среды уже установлены. Это дает вам полезную информацию, такую как количество процессоров, тип ОЗУ, имя компьютера, и так далее. Посмотрим, что мы сможем узнать о нашем компьютере: @@ -105,7 +105,7 @@ os.environ / os.getenv( ) / os.putenv( ) /var/folders/hv/p9v314d106z3tqjyxvn5hfm40000gn/T/ -Полезность использования os.getenv() вместо словаря os.environ заключается в том, что если вы находитесь в положении, когда вам нужно получить доступ к переменной среды, которая не существует, функция getenv попросту ничего не сделает. Если вы попытаетесь сделать то же самое, пользуясь os.environ, вы получите уведомление об ошибке. Давайте попробуем на примере: +Полезность использования ``os.getenv()`` вместо словаря ``os.environ`` заключается в том, что если вы находитесь в положении, когда вам нужно получить доступ к переменной среды, которая не существует, функция getenv попросту ничего не сделает. Если вы попытаетесь сделать то же самое, пользуясь os.environ, вы получите уведомление об ошибке. Давайте попробуем на примере: .. code-block:: python From 33f60ceca2933dde10e62ca33f43d3fee8bcf9d5 Mon Sep 17 00:00:00 2001 From: "o.korchevaya" <71932690+okorchevaya@users.noreply.github.com> Date: Sat, 14 May 2022 11:22:50 +0300 Subject: [PATCH 15/15] Update os.rst --- content/os.rst | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/content/os.rst b/content/os.rst index 0d693c1..122dc2d 100644 --- a/content/os.rst +++ b/content/os.rst @@ -37,7 +37,7 @@ os.name ========================================================= -Модуль os обладает как вызываемыми функциями, так и обычными значениями. В случае с os.name, речь идет только о значениях. При доступе к os.name, вы получите информацию о том, с какой платформой вы работаете. Вам откроются следующие значения: ``‘posix’``, ``‘nt’``, ``‘os2’``, ``‘ce’``, ``‘java’``,`` ‘riscos’``. Давайте посмотрим на то, что выйдет, если запустить его на Mac OS: +Модуль os обладает как вызываемыми функциями, так и обычными значениями. В случае с os.name, речь идет только о значениях. При доступе к os.name, вы получите информацию о том, с какой платформой вы работаете. Вам откроются следующие значения: ``‘posix’``, ``‘nt’``, ``‘os2’``, ``‘ce’``, ``‘java’```. Давайте посмотрим на то, что выйдет, если запустить его на Mac OS: .. code-block:: python @@ -105,7 +105,7 @@ os.environ / os.getenv( ) / os.putenv( ) /var/folders/hv/p9v314d106z3tqjyxvn5hfm40000gn/T/ -Полезность использования ``os.getenv()`` вместо словаря ``os.environ`` заключается в том, что если вы находитесь в положении, когда вам нужно получить доступ к переменной среды, которая не существует, функция getenv попросту ничего не сделает. Если вы попытаетесь сделать то же самое, пользуясь os.environ, вы получите уведомление об ошибке. Давайте попробуем на примере: +Полезность использования ``os.getenv()`` вместо словаря ``os.environ`` заключается в том, что если вы находитесь в положении, когда вам нужно получить доступ к переменной среды, которая не существует, функция ``getenv`` попросту ничего не сделает. Если вы попытаетесь сделать то же самое, пользуясь ``os.environ``, вы получите уведомление об ошибке. Давайте попробуем на примере: .. code-block:: python @@ -123,7 +123,7 @@ os.environ / os.getenv( ) / os.putenv( ) os.chdir( ) / os.getcwd( ) ========================================================= -Функция os.chdir позволяет нам вносить изменения в каталоге, который мы в данный момент используем в сессии. Если вам нужно знать, какой путь вы в данный момент используете, для этой нужно вызвать os.getcwd(). Попробуем воспользоваться обоими модулями: +Функция ``os.chdir`` позволяет нам вносить изменения в каталоге, который мы в данный момент используем в сессии. Если вам нужно знать, какой путь вы в данный момент используете, для этой нужно вызвать ``os.getcwd()``. Попробуем воспользоваться обоими модулями: .. code-block:: python @@ -143,7 +143,7 @@ os.chdir( ) / os.getcwd( ) C:\\Users\\mike\\Documents -Мы открыли директорию по умолчанию в Python, после запуска данного кода в IDLE. После этого мы изменили папки, при помощи os.chdir(). Наконец, мы вызывали os.getcwd() еще раз, чтобы убедиться, что все изменения были выполнены правильно. +Мы открыли директорию по умолчанию в Python, после запуска данного кода в IDLE. После этого мы изменили папки, при помощи ``os.chdir()``. Наконец, мы вызывали ``os.getcwd()`` еще раз, чтобы убедиться, что все изменения были выполнены правильно. Работа с папками и файлами ##################################### @@ -151,14 +151,14 @@ os.chdir( ) / os.getcwd( ) os.mkdir( ) / os.makedirs( ) ========================================================= -Как вы могли догадаться, эти два метода уже знакомы нам и используются для создания папок. Первая, os.mkdir(), позволяет создать одну папку. Попробуем: +Как вы могли догадаться, эти два метода уже знакомы нам и используются для создания папок. Первая, ``os.mkdir()``, позволяет создать одну папку. Попробуем: .. code-block:: python >>> path = r'C:\Users\evjenij\Documents' >>> os.mkdir(path) -Первая строка кода создает папку под названием test в определенном каталоге. Вы можете использовать эти модули в предыдущем разделе, чтобы узнать, где именно вы запустили свой код, на случай, если вы забыли. Во втором примере мы назначили путь к переменной, затем к os.mkdir(). Это позволяет вам создать папку в любой точке вашей системы, где есть доступ. Функция os.makedirs() создает промежуточные папки в пути, если их там нет. В целом, это значит, что вы создали путь, в котором размещены папки. Данное решение удобно, когда есть необходимость создания журнала, с датированной структурой, например Год\Месяц\День. Давайте взглянем на пример: +Первая строка кода создает папку под названием test в определенном каталоге. Вы можете использовать эти модули в предыдущем разделе, чтобы узнать, где именно вы запустили свой код, на случай, если вы забыли. Во втором примере мы назначили путь к переменной, затем к ``os.mkdir()``. Это позволяет вам создать папку в любой точке вашей системы, где есть доступ. Функция ``os.makedirs()`` создает промежуточные папки в пути, если их там нет. В целом, это значит, что вы создали путь, в котором размещены папки. Данное решение удобно, когда есть необходимость создания журнала, с датированной структурой, например Год\Месяц\День. Давайте взглянем на пример: .. code-block:: python @@ -171,19 +171,19 @@ os.mkdir( ) / os.makedirs( ) os.remove( ) / os.rmdir( ) ========================================================= -Функции os.remove() и os.rmdir() используются для удаления файлов и каталогов соответственно. Посмотрим на os.remove(): +Функции ``os.remove()`` и ``os.rmdir()`` используются для удаления файлов и каталогов соответственно. Посмотрим на ``os.remove()``: .. code-block:: python >>> os.remove("test.txt") -Этот фрагмент кода пытается удалить файл под названием test.txt из вашего рабочего каталога. Если модуль не может найти файл, должно появиться уведомление о той или иной ошибке. Ошибка также возникнет, если файл уже используется (другими словами закрыт), или у вас нет разрешения для удаления данного файла. Возможно, вы хотите проверить os.unlink, который выполняет ту же функцию. Термин unlink – привычное для Unix название данной процедуры. Взглянем на пример работы os.rmdir(): +Этот фрагмент кода пытается удалить файл под названием test.txt из вашего рабочего каталога. Если модуль не может найти файл, должно появиться уведомление о той или иной ошибке. Ошибка также возникнет, если файл уже используется (другими словами закрыт), или у вас нет разрешения для удаления данного файла. Возможно, вы хотите проверить ``os.unlink``, который выполняет ту же функцию. Термин unlink – привычное для Unix название данной процедуры. Взглянем на пример работы ``os.rmdir()``: .. code-block:: python >>> os.rmdir("pytest") -Данный код попытается удалить каталог под названием pytest из каталога, используемого в данный момент в работе. В случае, если это удалось, каталог pytest исчезнет. Ошибка может возникнуть, если каталога с таким названием не существует, если у вас нет разрешения на его удаление, или если каталог не пустой. Вам возможно хочется взглянуть на os.removedirs(), который может удалить пустые вложенные каталоги. +Данный код попытается удалить каталог под названием pytest из каталога, используемого в данный момент в работе. В случае, если это удалось, каталог pytest исчезнет. Ошибка может возникнуть, если каталога с таким названием не существует, если у вас нет разрешения на его удаление, или если каталог не пустой. ``os.removedirs()`` может удалить пустые вложенные каталоги. os.rename(src, dst) @@ -195,24 +195,24 @@ os.rename(src, dst) >>> os.rename("test.txt", "pytest.txt") -В этом примере, мы указали os.rename на то, что нужно переименовать файл под названием test.txt на pytest.txt. Это произойдет в каталоге, с которым мы в данный момент работаем. Ошибка может возникнуть в том случае, если вы попытаетесь переименовать несуществующий файл, или если у вас нет доступа к данной операции. Также существует функция os.renames, которая меняет название папки или файла соответственно. +В этом примере, мы указали ``os.rename`` на то, что нужно переименовать файл под названием test.txt на pytest.txt. Это произойдет в каталоге, с которым мы в данный момент работаем. Ошибка может возникнуть в том случае, если вы попытаетесь переименовать несуществующий файл, или если у вас нет доступа к данной операции. Также существует функция os.renames, которая меняет название папки или файла соответственно. os.startfile( ) ========================================================= -Метод os.startfile( ) позволяет нам «запустить» файл в привязанной к нему программе. Другими словами, мы можем открыть файл вместе с привязанной к нему программой, как когда вы открываете файл PDF двойным щелчком, и он открывается в программе Adobe Reader. Попробуем: +Метод ``os.startfile( )`` позволяет нам «запустить» файл в привязанной к нему программе. Другими словами, мы можем открыть файл вместе с привязанной к нему программой, как когда вы открываете файл PDF двойным щелчком, и он открывается в программе Adobe Reader. Попробуем: .. code-block:: python >>> os.startfile(r'C:\Users\evjenij\Documents\labels.pdf') -В данном примере мы прошли полный путь к модулю os.startfile, который указывает на открытие файла под названием labels.pdf. На моем компьютере данная функция открывает файл PDF в программе Adobe Reader. Попробуйте открыть файлы PDF, MP3 или фотографии на своем компьютере при помощи данного метода, чтобы увидеть как он работает. +В данном примере мы прошли полный путь к модулю ``os.startfile``, который указывает на открытие файла под названием labels.pdf. На моем компьютере данная функция открывает файл PDF в программе Adobe Reader. Попробуйте открыть файлы PDF, MP3 или фотографии на своем компьютере при помощи данного метода, чтобы увидеть как он работает. os.walk( ) ========================================================= -Метод os.walk( ) дает нам возможность для итерации на корневом уровне пути. Это значит, что мы можем назначить путь к этой функции и получить доступ ко всем её подкаталогам и файлам. Используем одну из папок Python, при помощи которой мы можем проверить данную функцию. Мы используем C:\Python3\Tools +Метод ``os.walk( )`` дает нам возможность для итерации на корневом уровне пути. Это значит, что мы можем назначить путь к этой функции и получить доступ ко всем её подкаталогам и файлам. Используем одну из папок Python, при помощи которой мы можем проверить данную функцию. Мы используем C:\Python3\Tools .. code-block:: python @@ -263,7 +263,7 @@ os.symlink( ) os.link( ) ========================================================= -Метод os.link( ) создает жесткую ссылку, указывающую на src с именем dst . Этот метод очень полезен для создания копии существующего файла +Метод ``os.link( )`` создает жесткую ссылку, указывающую на src с именем dst . Этот метод очень полезен для создания копии существующего файла Синтаксис: @@ -325,7 +325,7 @@ os.link( ) Подмодуль os.path ####################### -Подмодуль os.path модуля os имеет широкий ряд встроенных преимуществ. Ознакомимся со следующими функциями: +Подмодуль ``os.path`` модуля os имеет широкий ряд встроенных преимуществ. Ознакомимся со следующими функциями: • basename @@ -343,7 +343,7 @@ os.link( ) os.path.basename ========================================================= -Функция basename вернет название файла пути. Пример: +Функция ``basename`` вернет название файла пути. Пример: .. code-block:: python @@ -358,7 +358,7 @@ os.path.basename os.path.dirname ========================================================= -Функция dirname возвращает только часть каталога пути. Это проще понять, если мы взглянем на пример кода: +Функция ``dirname`` возвращает только часть каталога пути. Это проще понять, если мы взглянем на пример кода: .. code-block:: python @@ -373,7 +373,7 @@ os.path.dirname os.path.exists ========================================================= -Функция exists говорит нам, существует ли файл, или нет. Все что вам нужно, это указать ему путь. Взглянем на пример: +Функция ``exists`` говорит нам, существует ли файл, или нет. Все что вам нужно, это указать ему путь. Взглянем на пример: .. code-block:: python @@ -390,7 +390,7 @@ os.path.exists os.path.isdir / os.path.isfile ========================================================= -Методы isdir и isfile тесно связаны с методом exists, так как они также тестируют присутствие или отсутствие файлов или папок на тех или иных путях. Однако, isdir проверяет только пути к папкам, а isfile, соответственно, к файлам. Если вам нужно проверить путь, и не важно, папка это или файл, проще будет воспользоваться методом exists. В любом случае, взглянем на пару примеров: +Методы ``isdir`` и ``isfile`` тесно связаны с методом ``exists``, так как они также тестируют присутствие или отсутствие файлов или папок на тех или иных путях. Однако, isdir проверяет только пути к папкам, а ``isfile``, соответственно, к файлам. Если вам нужно проверить путь, и не важно, папка это или файл, проще будет воспользоваться методом ``exists``. В любом случае, взглянем на пару примеров: .. code-block:: python @@ -415,7 +415,7 @@ os.path.isdir / os.path.isfile os.path.join ========================================================= -Метод join позволяет вам совместить несколько путей при помощи присвоенного разделителя. К примеру, в Windows, в роли разделителя выступает бэкслэш (косая черта, указывающая назад), однако в Linux функция разделителя присвоена косой черте, указывающей вперед (forward slash). Как это работает: +Метод ``join`` позволяет вам совместить несколько путей при помощи присвоенного разделителя. К примеру, в Windows, в роли разделителя выступает бэкслэш (косая черта, указывающая назад), однако в Linux функция разделителя присвоена косой черте, указывающей вперед (forward slash). Как это работает: .. code-block:: python @@ -425,12 +425,12 @@ os.path.join C:\\Python3\\Tools\\pynche\\ChipViewer.py -В данном примере мы совместили путь каталога и файла вместе, для получения рабочего пути. Обратите внимание на то, что метод join не указывает на то, какой результат в итоге вышел. +В данном примере мы совместили путь каталога и файла вместе, для получения рабочего пути. Обратите внимание на то, что метод ``join`` не указывает на то, какой результат в итоге вышел. os.path.split ========================================================= -Метод split разъединяет путь на кортеж, который содержит и файл и каталог. Взглянем на пример: +Метод ``split`` разъединяет путь на кортеж, который содержит и файл и каталог. Взглянем на пример: .. code-block:: python @@ -450,7 +450,7 @@ os.path.split ‘C:\Python3\Tools’, ‘pynche’ -Как видите, данная функция берет путь и разъединяет его таким образом, что подпапка стала вторым элементом кортежа с остальной частью пути в первом элементе. Напоследок, взглянем на бытовой случай использования split: +Как видите, данная функция берет путь и разъединяет его таким образом, что подпапка стала вторым элементом кортежа с остальной частью пути в первом элементе. Напоследок, взглянем на бытовой случай использования ``split``: .. code-block:: python @@ -479,7 +479,7 @@ os.path.split Задача 1 ========================================================= -Напишите программу, которая выводит 'Hello, $USER!', где $USER - имя пользователя. Пользоваться print() запрещено. +Напишите программу, которая выводит ``'Hello, $USER!'``, где $USER - имя пользователя. Пользоваться ``print()`` запрещено. Задача 2 =========================================================