Python модуль os: Модуль OS и работа с файловой системой
Содержание
Модуль OS и работа с файловой системой
Модуль OS и работа с файловой системой
Последнее обновление: 02.05.2017
Ряд возможностей по работе с каталогами и файлами предоставляет встроенный модуль os. Хотя он содержит много функций,
рассмотрим только основные из них:
mkdir(): создает новую папку
rmdir(): удаляет папку
rename(): переименовывает файл
remove(): удаляет файл
Создание и удаление папки
Для создания папки применяется функция mkdir(), в которую передается путь к создаваемой папке:
import os # путь относительно текущего скрипта os.mkdir("hello") # абсолютный путь os.mkdir("c://somedir") os.mkdir("c://somedir/hello")
Для удаления папки используется функция rmdir(), в которую передается путь к удаляемой папке:
import os # путь относительно текущего скрипта os.rmdir("hello") # абсолютный путь os.rmdir("c://somedir/hello")
Переименование файла
Для переименования вызывается функция rename(source, target), первый параметр которой — путь к исходному файлу, а второй — новое имя файла.
В качестве путей могут использоваться как абсолютные, так и относительные. Например, пусть в папке C://SomeDir/ располагается файл
somefile.txt. Переименуем его в файл «hello.txt»:
import os os.rename("C://SomeDir/somefile.txt", "C://SomeDir/hello.txt")
Удаление файла
Для удаления вызывается функция remove(), в которую передается путь к файлу:
import os os.remove("C://SomeDir/hello.txt")
Существование файла
Если мы попытаемся открыть файл, который не существует, то Python выбросит исключение FileNotFoundError. Для отлова исключения мы можем использовать
конструкцию try…except. Однако можно уже до открытия файла проверить, существует ли он или нет с помощью метода os.path.exists(path).
В этот метод передается путь, который необходимо проверить:
filename = input("Введите путь к файлу: ") if os.path.exists(filename): print("Указанный файл существует") else: print("Файл не существует")
Модуль os в Python. Примеры использования.
Автор Егор Егоров На чтение 5 мин Просмотров 277 Опубликовано
Подпишись на мой канал в Telegram
Руководство по основным методам модуля os в Python. Подробно рассмотрим примеры использования популярных методов.
Введение
Os — это встроенная библиотека языка программирования, предоставляющая интерфейс для взаимодействия с базовой операционной системой, под управлением которой работает Python.
Этот модуль представляет собой портативный способ использования функциональности, зависящей от операционной системы.
Модуль операционной системы поставляется по умолчанию со стандартными утилитными модулями Python, поэтому вам не нужно ничего устанавливать, чтобы начать использовать его.
Модуль os предоставляет массу методов, которые вы используете в различных ситуациях при взаимодействии с операционной системой, начиная от создания новых файлов и папок и заканчивая их переименованием и удалением.
Использование модуля os в Python
Вы можете посмотреть список всех доступных методов в модуле os используя следующий код
import os dir(os) ['abc', 'access', 'chdir', 'chmod', 'chown', 'close', 'confstr', 'cpu_count', 'curdir', 'defpath', 'devnull', 'dup2', 'environ', 'error', 'execle', 'execlp', 'execv', 'execvp', 'extsep', 'fchmod', 'fchown', 'fdopen', 'forkpty', 'fpathconf', 'fsdecode', 'fsencode', 'fstat', 'fsync', 'ftruncate', 'get_blocking', 'get_exec_path', 'get_inheritable', 'getcwd', 'getenv', 'geteuid', 'getgid', 'getgrouplist', 'getgroups', 'getloadavg', 'getpgrp', 'getpid', 'getppid', 'getsid', 'getuid', 'initgroups', 'kill', 'killpg', 'lchflags', 'lchmod', 'lchown', 'linesep', 'link', 'lockf', 'lstat', 'makedirs', 'mkdir', 'mkfifo', 'name', 'open', 'openpty', 'path', 'pathconf', 'pathsep', 'pipe', 'popen', 'posix_spawn', 'posix_spawnp', 'pread', 'putenv', 'read', 'readlink', 'readv', 'remove', 'removedirs', 'rename', 'renames', 'replace', 'rmdir', 'sched_get_priority_max', 'sched_get_priority_min', 'sendfile', 'set_blocking' ]
Листинг команды очень большой и мне пришлось сократить часть вывода.
Так же вы можете обратиться к официальной документации по использованию модуля os в Python.
В этой статье мы рассмотрим некоторые основные методы библиотеки os на конкретных примерах.
Использование метода os.getcwd()
Этот метод ОС используется для получения пути текущей рабочей директории.
import os os.getcwd() '/Users/krnlnx'
Использование метода os.chdir()
Этот метод используется для изменения текущего каталога на новый, ему передается один параметр — путь к новому каталогу.
import os os.getcwd() '/Users/krnlnx' os.chdir('Desktop') os.getcwd() '/Users/krnlnx/Desktop'
Использование метода os.listdir()
Этот метод возвращает все файлы и каталоги в текущем каталоге.
import os os.listdir() ['testdir', 'testfile.py', 'testimage.png']
Также можно передать параметр конкретной директории для просмотра ее файлов и каталогов.
import os os.listdir('/tmp/') ['fseventsd-uuid', 'MozillaUpdateLock-2656FF1E876E9973', 'powerlog', 'com.apple.launchd.791fHUaFBR']
Использование метода os.mkdir()
Этот метод используется для создания новой директории в текущей папке, например, давайте создадим директорию под названием Products.
import os os.listdir() ['fseventsd-uuid', 'MozillaUpdateLock-2656FF1E876E9973', 'powerlog', 'com.apple.launchd.791fHUaFBR'] os.mkdir('Products') os.listdir() ['fseventsd-uuid', 'MozillaUpdateLock-2656FF1E876E9973', 'Products', 'powerlog', 'com.apple.launchd.791fHUaFBR']
Использование метода os.rename()
Модуль используется для переименования файла или папки, ему передается два аргумента, старое и новое имя файла или папки. Например, переименуем папку Products в Stuff.
import os os.listdir() ['fseventsd-uuid', 'MozillaUpdateLock-2656FF1E876E9973', 'Products', 'powerlog', 'com.apple.launchd.791fHUaFBR'] os.rename('Products', 'Stuff') os.listdir() ['fseventsd-uuid', 'MozillaUpdateLock-2656FF1E876E9973', 'Stuff', 'powerlog', 'com.apple.launchd.791fHUaFBR']
Использование метода os.rmdir()
Этот метод используется для удаления каталогов. Имя каталога, который вы хотите удалить нужно передать первым аргументом. os.rmdir() будет работать только для пустых директорий.
Например, удалим каталог Stuff с помощью rmdir().
import os os.listdir() ['fseventsd-uuid', 'MozillaUpdateLock-2656FF1E876E9973', 'Stuff', 'powerlog', 'com.apple.launchd.791fHUaFBR'] os.rmdir('Stuff') os.listdir() ['fseventsd-uuid', 'MozillaUpdateLock-2656FF1E876E9973', 'powerlog', 'com.apple.launchd.791fHUaFBR']
Использование метода os.remove()
Этот метод используется для удаления файлов. Например, удалим файл powerlog.
import os os.listdir() ['fseventsd-uuid', 'MozillaUpdateLock-2656FF1E876E9973', 'powerlog', 'com.apple.launchd.791fHUaFBR'] os.remove('powerlog') os.listdir() ['fseventsd-uuid', 'MozillaUpdateLock-2656FF1E876E9973', 'com.apple.launchd.791fHUaFBR']
Использование метода os.system()
Этот метод используется для выполнения команды оболочки внутри Python приложения, как если бы вы были в оболочке. Например, давайте выполним команду «ls -1» с помощью системного метода.
import os os.system('ls -1')
Вывод программы выглядит следующим образом
MozillaUpdateLock-2656FF1E876E9973 com.apple.launchd.791fHUaFBR fseventsd-uuid 0
Цифра 0 в конце вывода означает что выполнение программы прошло без ошибок.
Использование метода os.uname()
Этот метод возвращает информацию, идентифицирующую текущую операционную систему.
import os os.uname() posix.uname_result(sysname='Darwin', nodename='macbook.local', release='20.3.0', version='Darwin Kernel Version 20.3.0: Thu Jan 21 00:07:06 PST 2021; root:xnu-7195.81.3~1/RELEASE_X86_64', machine='x86_64')
Использование метода os.environ
Environ не является методом в модуле ОС, а является параметром процесса, через который мы можем получить доступ к переменным окружения системы.
Например, давайте получим доступ к переменной окружения HOME
import os os.environ['HOME'] '/Users/krnlnx'
Мы также можем установить собственную переменную окружения, как показано в примере ниже.
import os os.environ['test_key'] = "Test var" os.environ['test_key'] 'Test var'
Использование метода os.getuid()
Этот модуль возвращает идентификатор пользователя текущего процесса.
import os os.getuid() 501
Использование метода os.getpid()
Возвращает реальный идентификатор процесса текущего приложения.
import os os.getpid() 4365
Заключение
В этой статье мы узнали о модуле os и о том, как его можно использовать в различных задачах, связанных с операционной системой, используя его методы.
Надеюсь, вам была интересна эта статья, не стесняйтесь поделиться ее со своими коллегами и друзьями в ваших сообществах разработчиков.
Оставляйте в комментариях свои предложения и отзывы и я обязательно свяжусь с вами как можно скорее.
Вступи в мою группу ВКонтакте
Модуль os.path | Кодкамп
Введение
Примеры
Присоединиться Пути
Чтобы объединить два или более компонентов пути, сначала импортируйте модуль os из python, а затем используйте следующее:
import os
os.path.join('a', 'b', 'c')
Преимущество использования os.path заключается в том, что он позволяет коду оставаться совместимым со всеми операционными системами, поскольку при этом используется разделитель, соответствующий платформе, на которой он работает.
Например, результат этой команды в Windows будет:
>>> os.path.join('a', 'b', 'c')
'a\b\c'
В ОС Unix:
>>> os.path.join('a', 'b', 'c')
'a/b/c'
Абсолютный Путь От Относительного Пути
Используйте os.path.abspath
:
>>> os.getcwd()
'/Users/csaftoiu/tmp'
>>> os.path.abspath('foo')
'/Users/csaftoiu/tmp/foo'
>>> os.path.abspath('../foo')
'/Users/csaftoiu/foo'
>>> os.path.abspath('/foo')
'/foo'
Управление компонентами пути
Чтобы отделить один компонент от пути:
>>> p = os.path.join(os.getcwd(), 'foo.txt')
>>> p
'/Users/csaftoiu/tmp/foo.txt'
>>> os.path.dirname(p)
'/Users/csaftoiu/tmp'
>>> os.path.basename(p)
'foo.txt'
>>> os.path.split(os.getcwd())
('/Users/csaftoiu/tmp', 'foo.txt')
>>> os.path.splitext(os.path.basename(p))
('foo', '.txt')
Получить родительский каталог
os.path.abspath(os.path.join(PATH_TO_GET_THE_PARENT, os.pardir))
Если данный путь существует.
проверить, существует ли данный путь
path = '/home/john/temp'
os.path.exists(path)
#this returns false if path doesn't exist or if the path is a broken symbolic link
проверьте, является ли данный путь каталогом, файлом, символической ссылкой, точкой монтирования и т. д.
проверить, является ли данный путь каталогом
dirname = '/home/john/python'
os.path.isdir(dirname)
проверить, является ли данный путь файлом
filename = dirname + 'main.py'
os.path.isfile(filename)
чтобы проверить , если данный путь является символической ссылкой
symlink = dirname + 'some_sym_link'
os.path.islink(symlink)
чтобы проверить , если данный путь является точка монтирования
mount_path = '/home'
os.path.ismount(mount_path)
Синтаксис
Параметры
Примечания
Функция listdir() модуля os в Python.
Получить список файлов в директории/каталоге.
Синтаксис:
import os os.listdir(path='.')
Параметры:
Возвращаемое значение:
Описание:
Функция listdir()
модуля os
возвращает список, содержащий имена файлов и директорий в каталоге, заданном путем path
. Список будет в произвольном порядке и не содержит специальных обозначений '.'
и '..'
, даже если они присутствуют в каталоге.
Аргумент path
принимает объекты, реализующих интерфейс os.PathLike
. Если путь path
имеет байтовый тип, переданный прямо или косвенно через интерфейс os.PathLike
, возвращаемые имена файлов также будут байтовыми типами, во всех остальных случаях они будут иметь строковой тип.
Эта функция также поддерживает указание файлового дескриптора, дескриптор должен ссылаться на каталог path
.
Вызывает событие аудита os.listdir
с аргументом path
.
Примеры получения списка имен файлов и директорий в каталоге.
import os path = '.' rez = sorted(os.listdir(path)) for n, item in enumerate(rez): print(n+1, item) # 1 docs-python-replace.py # 2 reg-exp.py # 3 script.py # 4 sys.float_info.py # 5 test-gid-uid.py # 6 test_settracel.py # 7 tt.py # 8 venv
Что бы получить полный путь к файлам каталога нужно просто объединить передаваемый аргумент path
с каждым значением из списка внутри цикла for ... in
, например item = os.path.join(path, item)
Смотрите так же:
os.scandir()
— информация о всех файлах/каталогах, включая их имена,os.walk()
— рекурсивный обход каталога как в глубину, так и из глубины,glob.glob()
— рекурсивный (в глубину) поиск файлов по шаблону,pathlib.Path.glob()
— рекурсивный (в глубину) отбор файлов из каталога по шаблону.
Функция stat() модуля os в Python.
Получить статистическую информацию о файле.
Синтаксис:
import os stat_result = os.stat(path, *, dir_fd=None, follow_symlinks=True)
Параметры:
Возвращаемое значение:
Описание:
Функция stat()
модуля os
получает статистическую информацию файла или дескриптора файла. Выполняет эквивалент системного вызова stat()
по заданному пути. Путь path
может быть указан в виде строки или bytes, переданных прямо или косвенно через интерфейс os.PathLike
или как дескриптор открытого файла. Функция stat()
вернет объект os.stat_result
.
Функция os.lstat()
эквивалентна вызову функции os.stat()
с установленным аргументом follow_symlinks=False
, например os.stat(path, dir_fd=dir_fd, follow_symlinks=False)
.
Функция os.stat()
обычно переходит по символическим ссылкам к итоговому каталогу, чтобы получить информацию о символической ссылке добавьте аргумент follow_symlinks=False
или используйте функцию os.lstat()
.
Функция stat()
может поддерживать пути относительно дескрипторов каталогов dir_fd
и не следовать символическим ссылкам follow_symlinks=None
.
Функция oc.lchown()
эквивалентна вызову функции oc.chown()
с установленным аргументом follow_symlinks=False
, например os.chown(path, uid, gid, follow_symlinks=False)
.
В Windows передача follow_symlinks=False
отключит следование по всем точкам повторной обработки, включая символические ссылки и ссылки каталогов. Другие типы точек повторной обработки, которые не похожи на ссылки или которые операционная система не может выполнить, будут открыты напрямую. При переходе по цепочке из нескольких ссылок это может привести к возврату исходной ссылки, а не ссылки, которая помешала полному обходу. Чтобы получить результаты статистики для окончательного пути в этом случае, используйте функцию os.path.realpath(), чтобы максимально разрешить имя пути и вызовите os.lstat()
. Это не относится к битым символическим ссылкам или точкам соединения, которые вызовут обычные исключения.
Примеры использования:
>>> import os >>> statinfo = os.stat('somefile.txt') >>> statinfo os.stat_result(st_mode=33188, st_ino=7876932, st_dev=234881026, st_nlink=1, st_uid=501, st_gid=501, st_size=264, st_atime=1297230295, st_mtime=1297230027, st_ctime=1297230027) >>> statinfo.st_size 264
Стандартные модули python, часть I
Стандартные модули python, часть I
Стандартная библиотека python очень обширна. В ней есть инструменты для работы с файловой системой, сервисами операционной системы, поддержка многопоточности, инструменты для работы с сетью и многие другое. В этом разделе мы рассмотрим несколько стандартных модулей python.
Работа с операционной системой
Модуль sys
Модуль sys обеспечивает доступ к параметрам и функциям операционной системы.
Список sys.argv
хранит имя запущенного скрипта и аргументы командной строки, переданные при его запуске:
# test.py import sys for idx, item in enumerate(sys.argv): print(f'Arg {idx}: {item:8} {type(item)}')
user@host:~$ python test.py arg1 arg2 345 Arg 0: test.py <class 'str'> Arg 1: arg1 <class 'str'> Arg 2: arg2 <class 'str'> Arg 3: 345 <class 'str'>
Переменная sys.executable
позволяет узнать какой именно интерпретатор python используется:
print(sys.executable) # /home/vitaly/miniconda3/envs/tf2/bin/python
Функция sys.exit
позволяет завершить выполнение программы. Эта функция принимает один аргумент — код выхода, который по умолчанию равен нулю. Большинство систем будет считать код 0 признаком успешного завершения программы, а любое другое число от 1 до 127 будет считать признаком ненормального завершения. Если передан объект другого типа, то он будет выведен в стандартный поток вывода, а код выхода будет равен 1. Функция sys.exit
всегда генерирует исключение SystemExit, поэтому не стоит рассматривать ее как стандартный способ завершения программы. Используйте ее только в подходящих случаях, которые чаще всего связаны с невозможностью продолжения работы программы.
Переменная sys.path
обеспечивает доступ к переменной окружения PYTHONPATH
. Эта переменная содержит список путей, в которых выполняется поиск модулей. Если необходимый модуль расположен в директории, которая не входит в PYTHONPATH
, то перед подключением этого модуля необходимо добавить эту директорию в переменную sys.path
:
# 'path/to/my/facorite/module/dir/mymodule.py' sys.path.append('path/to/my/facorite/module/dir') import mymodule
Можно указывать абсолютный или относительный путь. Модуль sys имеет еще много инструментов, которые описаны в документации.
Модуль os
Модуль os предоставляет инструменты для работы с операционной системой и файловой системой.
Функции os.getenv и os.putenv позволяют получать и изменять значения переменных окружения. Функция os.system позволяет выполнять консольные команды, запуская при этом дочерний процесс. Рассмотрим следующий скрипт:
# test.py import os import sys print(f' HOME: {os.getenv("HOME")}') os.putenv('NEWENV', 'value') print(f'NEWENV: {os.getenv("NEWENV")}') if os.getenv('NEWENV') is not None: sys.exit(0) os.system('python test.py')
При работе скрипта можно получить вывод, подобный такому:
HOME: /home/vitaly NEWENV: None HOME: /home/vitaly NEWENV: value
Разберемся с тем что произошло. Переменная окружения HOME
содержит путь к домашней директории пользователя. Мы получили значение этой переменной с помощью os.genenv
(в данном случае /home/vitaly
) и вывели его в консоль. Затем, c помощью sys.putenv
, мы задали значение value
новой переменной окружения NEWENV
и сразу прочитали его. Функция os.getenv
вернула None
, поскольку функция sys.putenv
оказывает влияние только на окружение дочерних процессов. Чтобы это проверить, мы снова запустили интерпретатор python с нашим скриптом test.py
, используя os.system
. В дочернем процессе снова были выведены переменные окружения HOME
и NEWENV
. В дочернем процессе переменная NEWENV
определена, поэтому сработало условие для выхода из программы с помощью sys.exit(0)
.
Функция os.listdir
возвращает список названий объектов, лежащий в заданной директории.
Модуль os.path
Модуль os.path содержит полезные инструменты для работы с путями файловой системы. Функция os.path.exists проверяет указывает ли путь на существующий объект в файловой системе. Функция os.path.isfile имеет схожий смысл, но возвращает True
только в том случае, если объект является обычным файлом (не директория и не ссылка):
os.path.exists('/home/vitaly') # True os.path.exists('/home/david') # False os.path.isfile('/home/vitaly') # False
Функции os.path.join
, os.path.split
и os.path.splitext
выполняют часто встречающиеся манипуляции со строками путей:
path = os.path.join('/home', 'vitaly', 'test.py') # /home/vitaly/test.py head, tail = os.path.split(path) # ['/home/vitaly', 'test.py'] root, ext = os.path.splitext(path) # ['/home/vitaly/test', '.py']
Модуль shutil
Модуль shutil
предоставляет высокоуровневые инструменты для операций с файлами. Вот несколько примеров:
# копирование файла в директорию shutil.copy('filename', 'path/to/dir') # копирование файла в файл с другим именем shutil.copyfile('filename1', 'filename2') # рекурсивное копирование директории dir1 в директорию dir2 shutil.copytree('path/to/dir1', 'path/to/dir2') # рекурсивное удаление содержимого директории dir shutil.rmtree('path/to/dir') # рекурсивное перемещение файла или директории shutil.move(src, dst)
Модуль glob
Модуль glob
позволяет выполнять поиск объектов в файловой системе, имена которых удовлетворяют заданному паттерну:
# список текстовых файлов в текущей директории text_files = glob.glob('./*.txt') # рекурсивный поиск файлов с расширением .py, # начиная с текущей директории text_files_all = glob.glob('./**/*.py', recursive=True)
Работа со строками
Модуль string
Модуль string
содержит различные инструменты для работы со строками, многие из которых дублируют возможности стандартного типа str
. Модуль string
содержит набор констант, которые часто оказываются полезны:
string.ascii_lowercase # 'abcdefghijklmnopqrstuvwxyz' string.ascii_uppercase # 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' string.ascii_letters # 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' string.digits # '0123456789' string.punctuation # !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
Модуль re
Модуль re
содержит инструменты для работы с регулярными выражениями. Обсуждение регулярных выражений выходит за рамки этого курса. Мы рекомендуем читателю самостоятельно изучить базовые приемы работы с регулярными выражениями.
Вычисления с произвольной точностью
Модуль decimal
Модуль decimal
позволяет выполнять арифметические операции с плавающей точной с фиксированной точностью:
from decimal import * getcontext().prec = 6 Decimal(1) / Decimal(7) # Decimal('0.142857') getcontext().prec = 28 Decimal(1) / Decimal(7) # Decimal('0.1428571428571428571428571429')
Объекты Decimal
представлены в памяти точно. Это значит, что числа Decimal
можно сравнивать с помощью операторов ==
и !=
, не опасаясь погрешности из-за округления двоичного представления (как это происходит в случае с типом float
).
В модуле decimal
доступны некоторые математические функции:
getcontext().prec = 28 Decimal(2).sqrt() # Decimal('1.414213562373095048801688724') Decimal(1).exp() # Decimal('2.718281828459045235360287471') Decimal('10').ln() # Decimal('2.302585092994045684017991455') Decimal('10').log10() # Decimal('1')
Модуль fractions
Тип Fraction
из модуля fractions
описывает рациональные числа — числа, которые можно представить в виде обыкновенной дроби:
from fractions import Fraction from math import pi, cos Fraction(16, -10) # Fraction(-8, 5) Fraction('3.1415926535897932').limit_denominator(1000) # Fraction(355, 113) Fraction(cos(pi/3)) # Fraction(4503599627370497, 9007199254740992)
В последнем примере мы воспользовались модулем math
, который мы не будем обсуждать, поскольку его возможности перекрываются модулем numpy
. Модуль numpy
будет рассмотрен в следующих частях.
Продвинутые структуры данных и эффективное итерирование
Модуль queue
Модуль queue
содержит реализацию нескольких структур данных, среди которых FIFO-очередь queue.Queue
и очередь с приоритетом queue.PriorityQueue
. Очередь с приоритетом возвращает не первый добавленный элемент, а наименьший:
from queue import Queue, PriorityQueue arr = [3, 6, 1, 9, 4, 7, 2, 5, 8, 1] q = Queue() for i in arr: q.put_nowait(i) while not q.empty(): print(q.get_nowait(), end=' ') # 3 6 1 9 4 7 2 5 8 1 pq = PriorityQueue() for i in arr: pq.put_nowait(i) while not pq.empty(): print(pq.get_nowait(), end=' ') # 1 1 2 3 4 5 6 7 8 9
Типы модуля queue
созданы для работы в многопоточной среде исполнения. С особенностями многопоточной работы, которые мы не будем обсуждать, связано использование методов get_nowait
и put_nowait
вместо get
и put
.
Модуль collections
Модуль collections
расширяет набор стандартных контейнеров python. Рассмотрим три типа данных из этого модуля.
Функция namedtuple()
позволяет создавать типы данных с именованными полями:
from collections import namedtuple Vector = namedtuple('Vector', ['x', 'y', 'z']) v1 = Vector(1., 0.5, 0.6) v1.x # 1. v1.y # 0.5 v1.z # 0.6
Тип deque
реализует контейнер двусторонняя очередь, или дек. Это последовательный контейнер, который позволяет эффективно добавлять и удалять элементы в начало и в конец:
from collections import deque deq = deque([1, 3, 5]) deq.append('a') # [1, 3, 5, 'a'] deq.appendleft(False) # [False, 1, 3, 5, 'a'] a = deq.pop() # a = 'a', deq = ['False', 1, 3, 5] b = deq.popleft() # b = False, deq = [1, 3, 5]
Тип Counter
является подклассом типа dict
и позволяет удобно подсчитывать количество вхождений элементов в контейнере, например:
from collections import Counter the_longest_word_in_english\ = 'pneumonoultramicroscopicsilicovolcanoconiosis' cnt = Counter(the_longest_word_in_english) for key, val in cnt.items(): print(f'{key}: {val}', end=', ') # p: 2, n: 4, e: 1, u: 2, m: 2, o: 9, l: 3, t: 1, r: 2, a: 2, i: 6, c: 6, s: 4, v: 1 cnt.most_common(1) # [('o', 9)]
Модуль itertools
Модуль itertools
содержит множество инструментов для эффективного итерирования по элементам контейнеров. Эффективное в данном случае означает, что необходимое следующее значение генерируется на лету, без хранения всех значений, количество которых может быть очень большое. Рассмотрим несколько инструментов из этого модуля:
import itertools arr = list(range(5)) # arr = [0, 1, 2, 3, 4] for item in itertools.accumulate(arr): print(item, end=' ') # 0 1 3 6 10 for perm in itertools.permutations(arr): print(''.join(map(str, perm)), end=' ') # 01234 01243 01324 01342 01423 01432 ... for comb in itertools.combinations(arr, 3): print(''.join(map(str, comb)), end=' ') # 012 013 014 023 024 034 123 124 134 234
Время и дата с модулем datetime
Модуль datetime
позволяет полноценно работать с объектами даты и времени:
from datetime import date, timedelta d1 = date.fromisoformat('2019-12-04') d2 = date(2002, 12, 31) d1 < d2 # False delta = d1 - d2 delta.days # 6182 type(delta) # <class 'datetime.timedelta'> delta2 = timedelta(days=15) d3 = d1 + delta2 # 2019-12-19 d3.weekday() # 3 (Среда) d4 = date.today() # 2020-07-15
import time from datetime import datetime dt1 = datetime.fromtimestamp(time.time()) # 2020-07-15 21:47:09.036145 dt2 = datetime.fromisoformat('2020-07-15 21:47:09.036145') dt2.timestamp() # 1594824429.036145 (секунд прошло с 1970-01-01)
Резюме
В этом разделе мы выполнили краткий обзор возможностей некоторых стандартных модулей языка python. На этаме планирования нового проекта на python разумно изучить возможности существующих модулей (не только стандартных). Большое сообщество разработчиков и разнообразие доступных модулей являются сильными сторонами python.
Источники
Работа с папками и создание путей с модулем OS в Python
Модуль Python OS используется для работы с операционной системой и является достаточно большим, что бы более конкретно описать его применение. С помощью его мы можем получать переменные окружения PATH, названия операционных систем, менять права на файлах и многое другое. В этой статье речь пойдет про работу с папками и путями, их создание, получение списка файлов и проверка на существование. Примеры приведены с Python 3, но и с предыдущими версиями ошибок быть не должно.
Модуль OS не нуждается в дополнительной установке, так как поставляется вместе с инсталлятором Python.
Есть несколько способов вернуть список каталогов и файлов по указанному пути. Первый способ используя os.walk, который возвращает генератор:
import os
path = 'C:/windows/system32/drivers/'
print(path)
Такие объекты можно итерировать для понятного отображения структуры:
import os
path = 'C:/Folder1'
for el in os.walk(path):
print(el)
Сам кортеж делится на 3 объекта: текущая директория, имя вложенных папок (если есть), список файлов. Я так же разделил их на примере ниже:
import os
path = 'C:/Folder1'
for dirs,folder,files in os.walk(path):
print('Выбранный каталог: ', dirs)
print('Вложенные папки: ', folder)
print('Файлы в папке: ', files)
print('\n')
Os.walk является рекурсивным методом. Это значит, что для поиска файлов в конкретной директории вы будете итерировать и все вложенные папки. Обойти это с помощью самого метода нельзя, но вы можете использовать break так как os.walk возвращает указанную директорию первой. Можно так же использовать next():
import os
path = 'C:/Folder1'
for dirs,folder,files in os.walk(path):
print('Выбранный каталог: ', dirs)
print('Вложенные папки: ', folder)
print('Файлы в папке: ', files)
print('\n')
# Отобразит только корневую папку и остановит цикл
break
# Отобразит первый итерируемый объект
directory = os.walk(path)
print(next(directory))
Получение файлов через listdir
Есть еще один метод получения файлов используя listdir. Отличия от предыдущего метода в том, что у нас не будет разделения файлов и папок. Он так же не является рекурсивным:
import os
path = 'C:/Folder1'
directory = os.listdir(path)
print(directory)
Получение полного абсолютного пути к файлам
Для последующего чтения файла нам может понадобится абсолютный путь. Мы можем использовать обычный метод сложения строк или метод os.path.join, который сделает то же самое, но и снизит вероятность ошибки если программа работает на разных ОС:
import os
path = 'C:/Folder1'
for dirs,folder,files in os.walk(path):
print('Выбранный каталог: ', dirs)
print('Вложенные папки: ', folder)
print('Файлы в папке: ', files)
print('Полный путь к файлу: ', os.path.join(dirs, files))
Исключение каталогов или файлов из списка
У нас может быть список полных путей, например из списка выше, из которого мы хотим исключить папки или файлы. Для этого используется os.path.isfile:
import os
path = ['C:/Folder1',
'C:/Folder1/Folder2/file2.txt']
for el in path:
if os.path.isfile(el):
print('Это файл: ', el)
else:
print('Это папка: ', el)
Такой же принцип имеют следующие методы:
- os.path.isdir() — относится ли путь к папке;
- os.path.islink() — относится ли путь к ссылке;
Получение расширения файлов
Расширение файла можно получить с помощью os.path.splittext(). Этот метод вернет путь до расширения и само расширение. Этот метод исключает ситуацию, когда точка может стоять в самом пути. Если в качестве пути мы выберем каталог (который не имеет расширения) , результатом будет пустая строка:
import os
path = ['C:/Folder1',
'C:/Folder1/Folder2/file2.txt']
for el in path:
print(os.path.splitext(el))
os.path.basename(path) — вернет имя файла и расширение.
Методы по изменению папок следующие:
- os.mkdir() — создаст папку;
- os.rename() — переименует;
- os.rmdir() — удалит.
import os
# Имя новой папки
path = 'C:/Folder1/NewFolder'
# Ее создание
os.mkdir(path)
# Переименуем папку
os.rename(path, 'C:/Folder1/NewFolder2')
# Удалим
os.rmdir('C:/Folder1/NewFolder2')
Если попытаться создать несколько вложенных папок сразу, используя предыдущий пример, появится ошибка FileNotFoundError. Создание папок включая промежуточные выполняется с os.makedirs():
import os
path = 'C:/Folder1/Folder1/Folder1/'
os.makedirs(path)
Проверка директорий и файлов на существование
Если мы пытаемся создать папку с существующим именем, то получим ошибку FileExistsError. Один из способов этого избежать — использование os.path.exists(), который вернет True в случае существования файла или папки:
import os
path = ['C:/Folder1/file1.txt',
'C:/Folder1/NotExistFolder']
for el in path:
if os.path.exists(el):
print('Такой путь существует: ', el)
else:
print('Такого пути нет', el)
Запуская любую программу или консоль, например CMD, мы это делаем из определенной директории. С этой и соседней директорией мы можем работать без указания полного пути. Для того что бы узнать такую директорию в Python используется метод os.getcwd():
import os
current_dir = os.getcwd()
print(current_dir)
В директории ‘D:\’ сохранен мой файл, с которого я запускаю методы. Вы можете изменить такую директорию с os.chdir() . Такой подход удобен, когда файлы, с которыми вы работаете в основном находятся в другом месте и вы сможете избежать написания полного пути:
import os
current_dir = os.getcwd()
print(current_dir)
new_dir = os.chdir('D:/newfolder/')
print(os.getcwd())
Так же как и в любых языках, в любых методах описанных выше, вы можете использовать ‘..’ для работы с директорией выше или ‘/’ для работы со внутренней:
import os
# Текущая директория
print(os.getcwd())
# Переход во внутреннюю
old_dir = os.chdir('/newfolder/')
print(os.getcwd())
# Переход на уровень выше
new_dir = os.chdir('..')
print(os.getcwd())
…
Теги:
#python
#os
Глава 16. Модуль ОС — документация Python 101 1.0
Модуль os имеет множество применений. Мы не будем рассказывать обо всем, на что он способен. Вместо этого мы получим обзор его использования, а также рассмотрим один из его подмодулей, известный как os.path . В частности, мы рассмотрим следующее:
- os.name
- os.environ
- os.chdir ()
- os.getcwd ()
- os.getenv ()
- os.putenv ()
- os.mkdir ()
- os.makedirs ()
- ос. Удалить ()
- os.rename ()
- os.rmdir ()
- os.startfile ()
- ос. Прогулка ()
- os.path
Похоже, здесь много, но есть как минимум в десять раз больше других действий, которые может выполнять модуль операционной системы. В этой главе вы только немного познакомитесь с тем, что доступно. Чтобы использовать любой из методов, упомянутых в этом разделе, вам необходимо импортировать модуль os , например:
Давайте начнем изучать, как использовать этот модуль!
os.название
Модуль os имеет как вызываемые функции, так и нормальные значения. В случае os.name это просто значение. При доступе к os.name вы получите информацию о том, на какой платформе вы работаете. Вы получите одно из следующих значений: «posix», «nt», «os2», «ce», «java», «riscos». Посмотрим, что мы получим, когда запустим его в Windows 7:
.
>>> импорт ОС >>> os.name 'нет'
Это говорит нам, что наш экземпляр Python работает в Windows.Откуда нам это знать? Потому что Microsoft много лет назад начала называть свою операционную систему NT. Например, Windows 7 также известна как Windows NT 6.1.
os.environ, os.getenv () и os.putenv ()
Значение os.environ известно как объект сопоставления , который возвращает словарь переменных среды пользователя. Возможно, вы этого не знаете, но каждый раз, когда вы используете свой компьютер, устанавливаются некоторые переменные среды. Они могут дать вам ценную информацию, такую как количество процессоров, тип процессора, имя компьютера и т. Д.Давайте посмотрим, что мы можем узнать о нашей машине:
>>> импорт ОС >>> os.environ {'ALLUSERSPROFILE': 'C: \\ ProgramData', 'APPDATA': 'C: \\ Users \\ mike \\ AppData \\ Roaming', 'CLASSPATH': '.; C: \ Program Files \ QuickTime \ QTSystem \ QTJava.zip', 'COMMONPROGRAMFILES': 'C: \ Program Files \ Common Files', "ИМЯ КОМПЬЮТЕРА": "МАЙК-ПК", 'COMSPEC': 'C: \ Windows \ system32 \ cmd.exe', 'FP_NO_HOST_CHECK': 'НЕТ', 'HOMEDRIVE': 'C:', 'HOMEPATH': '\\ Пользователи \\ mike', 'LOCALAPPDATA': 'C: \ Users \ mike \ AppData \ Local', 'LOGONSERVER': '\\\\ MIKE-PC', 'NUMBER_OF_PROCESSORS': '2', 'ОС': 'Windows_NT', 'ПУТЬ': '.COM; .EXE; .BAT; .CMD; .VBS; .VBE; .JS; .JSE; .WSF; .WSH; .MSC ', 'ПРОЦЕССОР_АРХИТЕКТУРА': 'x86', 'PROCESSOR_IDENTIFIER': 'Семейство x86, модель 15, шаг 13, GenuineIntel', 'PROCESSOR_LEVEL': '6', 'PROGRAMDATA': 'C: \\ ProgramData', 'ПРОГРАММЫ': '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": "Консоль", 'SYSTEMDRIVE': 'C:', 'SYSTEMROOT': 'C: \ Windows', 'TEMP': 'C: \ Users \ mike \ AppData \ Local \ Temp', 'TMP': 'C: \ Users \ mike \ AppData \ Local \ Temp', 'USERDOMAIN': 'mike-PC', "ИМЯ ПОЛЬЗОВАТЕЛЯ": "Майк", 'ПРОФИЛЬ ПОЛЬЗОВАТЕЛЯ': 'C: \\ Users \\ mike', 'VBOX_INSTALL_PATH': 'C: \ Program Files \ Oracle \ VirtualBox \', 'VS90COMNTOOLS': 'C: \ Program Files \ Microsoft Visual Studio 9.0 \ Common7 \ Tools \ ', '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'}
Ваш результат не будет таким же, как у меня, поскольку конфигурация ПК у всех немного отличается, но вы увидите нечто похожее. Как вы могли заметить, это вернуло словарь. Это означает, что вы можете получить доступ к переменным окружения, используя обычные словарные методы.Вот пример:
>>> print (os.environ ["TMP"]) 'C: \\ Users \\ mike \\ AppData \\ Local \\ Temp'
Вы также можете использовать функцию os.getenv для доступа к этой переменной среды:
>>> os.getenv ("TMP") 'C: \\ Users \\ mike \\ AppData \\ Local \\ Temp'
Преимущество использования os.getenv () вместо словаря os.environ заключается в том, что если вы попытаетесь получить доступ к несуществующей переменной среды, функция getenv просто вернет None.Если вы проделаете то же самое с os.environ, вы получите сообщение об ошибке. Давайте попробуем, и вы увидите, что происходит:
>>> os.environ ["TMP2"] Отслеживание (последний вызов последний): Файл "", строка 1, в os.environ ["TMP2"] Файл "C: \ Python27 \ lib \ os.py", строка 423, в __getitem__ вернуть self.data [key.upper ()] KeyError: 'TMP2' >>> print (os.getenv ("TMP2")) Никто
os.chdir () и os.getcwd ()
Операционная система os.Функция chdir позволяет нам изменить каталог, в котором мы в настоящее время запускаем наш сеанс Python. Если вы действительно хотите знать, по какому пути вы сейчас находитесь, вы должны вызвать os.getcwd () . Давайте попробуем оба:
>>> os.getcwd () 'C: \\ Python27' >>> os.chdir (r "c: \ Users \ mike \ Documents") >>> os.getcwd () 'c: \\ Users \\ mike \\ Documents'
Приведенный выше код показывает нам, что мы начали работу в каталоге Python по умолчанию, когда запускали этот код в IDLE.Затем мы меняем папки с помощью os.chdir () . Наконец, мы вызываем os.getcwd () второй раз, чтобы убедиться, что мы успешно перешли в папку.
os.mkdir () и os.makedirs ()
Возможно, вы уже догадались об этом, но два метода, описанные в этом разделе, используются для создания каталогов. Первый — os.mkdir () , который позволяет нам создать единую папку. Давай попробуем:
>>> os.mkdir ("тест") >>> путь = r'C: \ Users \ mike \ Documents \ pytest ' >>> os.mkdir (путь)
Первая строка кода создаст папку с именем test в текущем каталоге. Вы можете использовать методы из предыдущего раздела, чтобы выяснить, где вы только что запустили свой код, если забыли. Во втором примере назначается путь к переменной, а затем мы передаем путь os.mkdir (). Это позволяет вам создать папку в любом месте вашей системы, на которую у вас есть разрешение.
Функция os.makedirs () создаст все промежуточные папки в пути, если они еще не существуют.В основном это означает, что вы можете создать путь, в котором есть вложенные папки. Я часто делаю это, когда создаю файл журнала с датированной структурой папок, например Год / Месяц / День. Давайте посмотрим на пример:
>>> путь = r'C: \ Users \ mike \ Documents \ pytest \ 2014 \ 02 \ 19 ' >>> os.makedirs (путь)
Что здесь произошло? Этот код только что создал кучу папок! Если у вас все еще была папка pytest в вашей системе, тогда она просто добавила папку 2014 с другой папкой внутри нее, которая также содержала папку.Попробуйте сами, используя действительный путь в вашей системе.
os.remove () и os.rmdir ()
Функции os.remove () и os.rmdir () используются для удаления файлов и каталогов соответственно. Давайте посмотрим на пример os.remove () :
.
>>> os.remove ("test.txt")
Этот фрагмент кода попытается удалить файл с именем test.txt из текущего рабочего каталога. Если он не может найти файл, вы, скорее всего, получите какую-то ошибку.Вы также получите сообщение об ошибке, если файл используется (т. Е. Заблокирован) или у вас нет разрешения на его удаление. Вы также можете проверить os.unlink , который делает то же самое. Термин unlink — традиционное имя Unix для этой процедуры.
Теперь давайте посмотрим на пример os.rmdir () :
Приведенный выше код попытается удалить каталог с именем pytest из вашего текущего рабочего каталога. В случае успеха вы увидите, что каталог больше не существует.Возникнет ошибка, если каталог не существует, у вас нет разрешения на его удаление или если каталог не пуст. Вы также можете взглянуть на os.removedirs () , который может рекурсивно удалять вложенные пустые каталоги.
os.rename (src, dst)
Функция os.rename () переименует файл или папку. Давайте посмотрим на пример, в котором мы переименовываем файл:
>>> os.rename ("test.txt", "pytest.txt")
В этом примере мы сообщаем os.переименовать , чтобы переименовать файл с именем test.txt в pytest.txt . Это происходит в нашем текущем рабочем каталоге. Вы увидите сообщение об ошибке, если попытаетесь переименовать несуществующий файл или у вас нет соответствующих прав на переименование файла.
Существует также функция os.renames , которая рекурсивно переименовывает каталог или файл.
os.startfile ()
Метод os.startfile () позволяет нам «запустить» файл со связанной с ним программой.Другими словами, мы можем открыть файл с помощью связанной с ним программы, как если бы вы дважды щелкнули PDF-файл, и он откроется в Adobe Reader. Давайте попробуем!
>>> os.startfile (r'C: \ Users \ mike \ Documents \ labels.pdf ')
В приведенном выше примере я передаю полный путь к os.startfile , который сообщает ему открыть файл с именем labels.pdf . На моем компьютере это откроет PDF-файл в Adobe Reader. Вы должны попробовать открыть свои собственные PDF-файлы, MP3-файлы и фотографии с помощью этого метода, чтобы увидеть, как он работает.
ос. Прогулка ()
Метод os.walk () дает нам возможность перебирать путь корневого уровня. Это означает, что мы можем передать путь к этой функции и получить доступ ко всем ее подкаталогам и файлам. Давайте воспользуемся одной из имеющихся у нас папок Python, чтобы протестировать эту функцию. Мы будем использовать: C: \ Python27 \ Tools
.
>>> путь = r'C: \ Python27 \ Tools ' >>> для root, dirs, файлов в os.walk (путь): печать (корень) C: \ Python27 \ Инструменты C: \ Python27 \ Инструменты \ i18n C: \ Python27 \ Инструменты \ pynche C: \ Python27 \ Инструменты \ pynche \ X C: \ Python27 \ Инструменты \ Скрипты C: \ Python27 \ Tools \ versioncheck C: \ Python27 \ Tools \ webchecker
Если хотите, вы также можете перебрать каталогов и файлов .Вот один из способов сделать это:
>>> для root, dirs, файлов в os.walk (путь): печать (корень) для _dir в каталогах: печать (_dir) для _file в файлах: распечатать файл)
Этот фрагмент кода распечатает много чего, поэтому я не буду показывать его вывод здесь, но вы можете попробовать. Теперь мы готовы научиться работать с путями!
os.path
Подмодуль os.path модуля os имеет множество встроенных функций.Мы будем рассматривать следующие функции:
- базовое имя
- имя каталога
- существует
- isdir и isfile
- присоединиться
- сплит
В этом подмодуле есть множество других функций. Вы можете прочитать о них в документации Python, раздел 10.1.
os.path.basename
Функция basename вернет только имя файла пути. Вот пример:
>>> os.путь.basename (r'C: \ Python27 \ Tools \ pynche \ ChipViewer.py ') "ChipViewer.py"
Я нахожу это полезным всякий раз, когда мне нужно использовать имя файла для присвоения имени некоторому связанному файлу, например, файлу журнала. Это часто случается, когда я обрабатываю файл данных.
os.path.dirname
Функция dirname вернет только часть пути, указанную в каталоге. Это легче понять, если взглянуть на какой-нибудь код:
.
>>> os.path.dirname (r'C: \ Python27 \ Tools \ pynche \ ChipViewer.ру ') 'C: \ Python27 \ Tools \ pynche'
В этом примере мы просто возвращаем путь к каталогу. Это также полезно, когда вы хотите хранить другие файлы рядом с файлом, который вы обрабатываете, например, вышеупомянутый файл журнала.
os.path.exists
существует Функция сообщит вам, существует ли путь или нет. Все, что вам нужно сделать, это пройти путь. Давайте посмотрим:
>>> os.path.exists (r'C: \ Python27 \ Tools \ pynche \ ChipViewer.py ') Правда >>> os.path.exists (r'C: \ Python27 \ Tools \ pynche \ fake.py ') Ложь
В первом примере мы передаем функции exists реальный путь, и она возвращает True , что означает, что путь существует. Во втором примере мы передали неверный путь, и он сообщил нам, что путь не существует, вернув False .
os.path.isdir / os.path.isfile
Методы isdir и isfile тесно связаны с методом exists в том, что они также проверяют наличие.Однако isdir проверяет только, является ли путь каталогом, а isfile проверяет только, является ли путь файлом. Если вы хотите проверить, существует ли путь независимо от того, является ли он файлом или каталогом, вам следует использовать метод exists . В любом случае, давайте изучим несколько примеров:
>>> os.path.isfile (r'C: \ Python27 \ Tools \ pynche \ ChipViewer.py ') Правда >>> os.path.isdir (r'C: \ Python27 \ Tools \ pynche \ ChipViewer.py ') Ложь >>> os.path.isdir (r'C: \ Python27 \ Tools \ pynche ') Правда >>> os.path.isfile (r'C: \ Python27 \ Tools \ pynche ') Ложь
Найдите минутку, чтобы изучить этот набор примеров. В первом мы передаем путь к файлу и проверяем, действительно ли путь является файлом. Затем во втором примере проверяется тот же путь, чтобы убедиться, что это каталог. Вы сами видите, как это обернулось. Затем в последних двух примерах мы немного изменили ситуацию, передав путь к каталогу тем же двум функциям. Эти примеры демонстрируют, как работают эти две функции.
ос.path.join
Метод join дает вам возможность объединить один или несколько компонентов пути вместе с помощью соответствующего разделителя. Например, в Windows разделителем является обратная косая черта, но в Linux разделителем является косая черта. Вот как это работает:
>>> os.path.join (r'C: \ Python27 \ Tools \ pynche ',' ChipViewer.py ') 'C: \ Python27 \ Tools \ pynche \ ChipViewer.py'
В этом примере мы объединили путь к каталогу и путь к файлу, чтобы получить полный путь.Однако обратите внимание, что метод join выполняет , а не , проверяет, существует ли результат на самом деле!
os.path.split
Метод split разбивает путь на кортеж, содержащий каталог и файл. Давайте посмотрим:
>>> os.path.split (r'C: \ Python27 \ Tools \ pynche \ ChipViewer.py ') ('C: \ Python27 \ Tools \ pynche', 'ChipViewer.py')
Этот пример показывает, что происходит, когда мы вводим путь к файлу. Посмотрим, что произойдет, если в конце пути нет имени файла:
>>> os.path.split (r'C: \ Python27 \ Tools \ pynche ') ('C: \ Python27 \ Tools', 'pynche')
Как видите, он взял путь и разделил его таким образом, что последняя подпапка стала вторым элементом кортежа с остальной частью пути в первом элементе.
В нашем последнем примере я подумал, что вы могли бы увидеть общий вариант использования split :
>>> dirname, fname = os.path.split (r'C: \ Python27 \ Tools \ pynche \ ChipViewer.py ') >>> dirname 'C: \ Python27 \ Tools \ pynche' >>> fname 'ChipViewer.py '
Это показывает, как выполнить множественное присвоение. Когда вы разделяете путь, он возвращает двухэлементный кортеж. Поскольку слева у нас две переменные, первый элемент кортежа присваивается первой переменной, а второй элемент — второй переменной.
Завершение
На этом этапе вы должны быть хорошо знакомы с модулем os . В этой главе вы узнали следующее:
- как работать с переменными среды
- сменить каталоги и узнать свой текущий рабочий каталог
- создавать и удалять папки и файлы
- переименовать файлы / папки
- запустить файл со связанным с ним приложением
- ходить по каталогу
- работа с дорожками
В модуле os есть множество других функций, которые здесь не рассматриваются.Обязательно прочтите документацию, чтобы узнать, что еще вы можете сделать. В следующей главе мы узнаем о модулях email и smtplib .
Как использовать модуль ОС в Python 3
Модуль ОС Python обеспечивает способ использования функций, зависящих от операционной системы. Функции, предоставляемые модулем ОС, позволяют взаимодействовать с базовой операционной системой, в которой работает Python: будь то Windows, Mac или Linux.
Если вы просто хотите прочитать или записать файл, используйте функцию open () , если вы хотите управлять путями, используйте os.path модуль , и если вы хотите прочитать все строки во всех файлах в командной строке, используйте модуль fileinput . Для создания временных файлов и каталогов используйте модуль tempfile , а для файлов и каталогов высокого уровня обработка видит модуль shutil .
Функциональный модуль ОС предоставляет нам возможность работать с основными задачами операционной системы, независимо от того, является ли она платформой Windows, Macintosh или Linux.
Пример модуля ОС Python
Модуль ОС в Python предоставляет функции для взаимодействия с операционной системой.ОС входит в состав стандартных служебных модулей Python. Модуль os обеспечивает переносимый способ использования функций, зависящих от операционной системы. Модули * os * и * os.path * включают множество функций для взаимодействия с файловой системой.
Модуль os является частью стандартной библиотеки или stdlib в Python 3. Это означает, что он поставляется вместе с вашей установкой Python, но вы все равно должны его импортировать.
Напишите следующий код для импорта модуля ОС . Если вы не знаете, что такое модуль в Python, вы можете прочитать эту статью о модуле Python.
import os
Теперь давайте подробно рассмотрим некоторые основные функции os .
# os.name
Функция os.name дает имя импортируемого модуля ОС. Это зависит от базовой операционной системы.
# app.py импорт ОС print (os.name)
См. вывод.
# os.environ
Окружающая среда — это не функция, а параметр процесса, с помощью которого мы можем получить доступ к переменным среды системы.
Давайте посмотрим на следующий пример.
импорт ОС print (os.environ)
См. вывод.
Мы также можем распечатать домашнюю среду.
# app.py импорт ОС print (os.environ ['HOME'])
См. вывод.
# os.getcwd ()
Функция getcwd модуля ОС предоставит нам текущий каталог проекта.
# app.py импорт ОС print (os.getcwd ())
См. вывод.
Если вы хотите создать новый каталог, введите следующий код.
# app.py импорт ОС os.mkdir ('newDir')
Он создаст новый каталог с именем newDir внутри текущей папки.
# os.execvp ()
Функция execvp — это один из способов запуска других команд в системе. Давайте посмотрим на следующий пример.
Создайте в той же папке один файл с именем mod.py и добавьте следующий код.
# mod.py student = { 'name': 'Крунал', 'enno': 21, 'колледж': 'ввп колледж' } print (student)
Теперь напишите следующий код в файле app.py .
# app.py импорт ОС программа = 'питон' аргументы = ['mod.py'] print (os.execvp (program, (program,) + tuple (arguments)))
Теперь запустите файл app.py .
Вывод
# os.getgid ()
Возвращает реальный идентификатор группы текущего процесса.
# app.py импорт ОС print (os.getgid ())
Возвращает 20. Это означает, что идентификатор группы текущего процесса равен 20.
# os.getuid ()
Функция модуля OS os.getuid возвращает идентификатор пользователя или UID текущего процесса, как это обычно известно.
См. Следующий пример.
импорт ОС print (os.getuid ())
Возвращает 501.
# os.getpid ()
Операционная система .getpid возвращает идентификатор текущего процесса.
# app.py импорт ОС print (os.getpid ())
Вывод
# os.system
Системная функция Python os позволяет нам запускать команду в скрипте Python, как если бы я запускал ее в своей оболочке . См. Пример ниже.
# app.py импорт ОС newFile = os.system ('users> app.txt')
Если вы запустите указанный выше файл app.py , будет создан новый файл с именем app.txt и внутри этого krunal написано, потому что я являюсь пользователем своего компьютера. Вы можете видеть свое имя.
Есть так много других модулей ОС, которые вы можете использовать в своем проекте в соответствии с вашими требованиями.
# os.error
Все функции в этом модуле вызывают ошибку OSError в случае недопустимых или недоступных имен и путей к файлам или других аргументов, которые имеют правильный тип, но которым операционная система не доверяет. Python os.error — это псевдоним для встроенного исключения OSError.
# app.py импорт ОС пытаться: filename = 'omg.txt' f = open (имя файла, 'rU') текст = f.read () f.close () кроме IOError: print ('Проблема с чтением:' + имя файла)
Выход
➜ pyt python3 app.py Проблемы с чтением: omg.txt ➜ pyt
Наконец, пример модуля Python OS завершен.
Модуль ОС Python — JournalDev
Модуль ОС Python предоставляет простые функции, которые позволяют нам взаимодействовать и получать информацию об операционной системе и даже контролировать процессы до предела.
Модуль ОС Python
Функции, предоставляемые модулем ОС, позволяют нам работать с основными задачами операционной системы, независимо от того, является ли она платформой Windows, Macintosh или Linux. В этом уроке мы рассмотрим эти функции и то, что с ними можно сделать.
Давайте начнем наше путешествие с этих функций и той информации, которую они предлагают.
Python import os
Обратите внимание, что в первую очередь мы должны импортировать модуль ОС в нашу программу, только тогда мы можем выполнять любую из его функций.
os.name
Эта функция дает имя импортируемого модуля ОС. Это зависит от базовой операционной системы. В настоящее время регистрируются «posix», «os2», «ce», «nt», «riscos» и «java».
Выполним это в системе:
>>> печать (os.name)
Posix
Понятно, что это может выводить разные платформы на основе интерпретатора.
os.environ
Environment
— это не функция, а параметр процесса, с помощью которого мы можем получить доступ к переменным среды системы.
Рассмотрим пример фрагмента кода:
импорт ОС
output = os.environ ['ГЛАВНАЯ']
печать (вывод)
Когда мы запустим этот скрипт, на выходе будет следующее:
Мы можем использовать его для работы с переменными среды, подробнее читайте в Python set environment variable.
os.execvp
Функция execvp
является одним из способов запуска других команд в системе.
Давайте посмотрим пример фрагмента кода для этой функции:
импорт ОС
program = "питон"
arguments = ["привет.py "]
print (os.execvp (программа, (программа,) + кортеж (аргументы)))
Для этого мы только что создали образец сценария как hello.py
со следующим кодом:
print ('Привет')
Когда мы запустим этот сценарий, на выходе будет следующее:
os.getuid
Эта функция модуля операционной системы возвращает идентификатор пользователя или UID текущего процесса, как это известно в народе.
>>> os.getuid ()
501
Итак, текущий идентификатор процесса оболочки — 501.
os.rename
С помощью функции переименования в python os мы можем легко переименовать файл.
импорт ОС
fileDir = "JournalDev.txt"
os.rename (fd, 'JournalDev_Hi.txt')
Обратите внимание, что для этого мы должны предоставить правильные разрешения для нашего скрипта.
os.system
Системная функция Python os позволяет нам запускать команду в скрипте Python, как если бы я запускал ее в своей оболочке. Например:
импорт ОС
currentFiles = os.система ("пользователи> users.txt")
Когда я запускал этот скрипт, в том же каталоге был создан новый файл с именем users.txt и строкой содержимого как ‘shubham’, так как он также возвращается исходной оболочкой:
Обратите внимание, что это очень мощный команду и следует использовать с осторожностью.
os.error
Класс ошибки модуля ОС Python является базовым классом для ошибок, связанных с вводом-выводом. Таким образом, мы можем поймать ошибки ввода-вывода, используя OSError в предложении except.
импорт ОС
пытаться:
f = open ('abc.txt ',' r ') # файл отсутствует
кроме OSError:
print ('Ошибка')
os.getpid
Эта функция возвращает текущий идентификатор процесса или PID, как это известно в народе.
>>> os.getpid ()
71622
Итак, идентификатор пользователя текущего процесса оболочки — 71622.
os.listdir
Эта функция просто выводит список файлов и каталогов, имеющихся в текущем рабочем каталоге.
>>> import os
>>> os.listdir ()
['.DS_Store ',' .localized ',' JournalDev ',' Java ',' Python ']
Возвращает повторяющийся список имен каталогов и файлов.
os.uname
Эта функция возвращает информацию, которая идентифицирует текущую операционную систему, в которой она выполняется.
>>> os.uname ()
posix.uname_result (sysname = 'Darwin', nodename = 'Shubham.local', release = '17 .2.0 ', version =' Darwin Kernel Version 17.2.0: Fri Sep 29 18:27:05 PDT 2017; root: xnu -4570.20.62 ~ 3 / RELEASE_X86_64 ', machine =' x86_64 ')
На самом деле это было довольно подробно.
import os.path vs import os
os.path
на самом деле работает странно. Похоже, что os
упакован с подмодулем path
, но на самом деле os
— это обычный модуль, который работает с sys.module
для поддержки os.path
. Перечислим, что происходит за кулисами:
- Когда Python запускается, он загружает множество модулей в
sys.module
. -
os
модуль также загружается при запуске Python.Он назначает свой путьos
. - Он вводит
sys.modules ['os.path'] = path
, так что вы можете выполнитьimport os.path
, как если бы это был подмодуль.
Резюме
В этом уроке мы прочитали о различных функциях, предоставляемых модулем ОС в Python, и увидели, как они работают. Дополнительные уроки по Python см. Здесь.
Ссылка: API Doc
Модуль ОС Python
В настоящее время Python довольно популярен, и он приобрел популярность, потому что он поставляется с рядом встроенных модулей и подпрограмм для выполнения различных задач.Модуль ОС Python — это один из модулей Python, который позволяет выполнять операции, связанные с операционной системой.
Python поставляется с уже установленным модулем ОС во всех операционных системах. Многие встроенные функции для получения файловой системы и взаимодействия с ней доступны в модулях ОС. Более того, Python не требует, чтобы операционная система хоста выполняла задачи.
В этой статье мы собираемся обсудить основные функции, которые может выполнять модуль ОС Python с примерами в системе Linux (Ubuntu).Чтобы получить доступ к модулю ОС Python, внимательно ознакомьтесь с функциями:
Требование:
- Вход в систему Ubuntu
- Python установлен в вашей системе
Начать работу с модулем ОС
Чтобы запустить модуль ОС, вам нужно сначала создать файл Python с помощью редактора nano или vim, как я создал образец файла «sample.py» :
Затем в этом файле перед выполнением любой функции ОС, описанной ниже, вам понадобится модуль импорта «os» в скрипте:
import os
print («привет, мир»)
Первый — это оператор импорта, а второй — оператор Python для вывода «hello world» на экран.
Теперь сохраните файл, нажав «Ctrl + O» , и выйдите из файла, нажав «Ctrl + X»:
Теперь запустите файл с помощью указанной ниже команды:
Python3 — это версия, предустановленная в моей системе, если она не установлена, вы можете установить любую версию Python и выполнить файл, используя эту функцию:
Итак, все функции модуля Python OS, которые обсуждаются ниже, будут следовать вышеупомянутой процедуре.
Функции модуля Python OS
Есть много функций, которые могут быть выполнены с использованием модуля ОС Python, некоторые из них упомянуты ниже:
Как использовать функцию name ()
Имя операционной системы возвращается функцией name () . Если вы используете Ubuntu, Linux Mint, Debian или любую другую операционную систему на базе Linux , то возвращаемое имя операционной системы будет «posix». Запустите указанный ниже сценарий:
Заявление после # является комментарием:
Как использовать функцию getcwd ()
Метод getcwd () возвращает путь «текущий рабочий каталог », и эта функция не требует аргументов; она похожа на команду pwd .
Запустите указанный ниже сценарий, записанный в файле «sample.py» , чтобы распечатать текущий рабочий каталог на терминале:
импорт ОС
печать (os.getcwd ())
Как использовать функции mkdir () и makedirs
Функция mkdir () используется для создания каталога (папки), а makedirs () используется для создания нескольких каталогов (папок).
Создать каталог в текущем каталоге
Запустите указанный ниже сценарий, написанный в образце “.py »для создания каталога « linuxhint »в текущем каталоге:
import os
os.mkdir («linuxhint»)
Поскольку я создал файл в текущем каталоге (домашнем каталоге), он должен существовать дома после запуска файла, как показано ниже:
Создать каталог в другой папке
Запустите указанный ниже сценарий, чтобы создать каталог «linuxhint» в папке «Загрузки»:
import os
os.mkdir («/ home / alishba / Downloads / linuxhint»)
Замените «alishba» на имя пользователя, которое вы используете.
Запустите сценарий на терминале Ubuntu и получите результат, показанный ниже:
Создать несколько каталогов
Запустите указанный ниже сценарий для рекурсивного создания нескольких каталогов, например , создайте каталог «linuxhint1» и рекурсивно создайте «linuxhint2» в linuxhint1 в текущем каталоге .
import os
os.makedirs («linuxhint1 / linuxhint2»)
Запускаем скрипт:
Как использовать функцию chdir ()
Функция chdir () изменяет текущий рабочий каталог аналогично команде «cd» в различных терминалах . Изменяет каталог на указанный каталог после функции chdir () . Запустите указанный ниже сценарий:
import os
#change directory
print («Текущий рабочий каталог: {0}». format (os.getcwd ()))
os.chdir (‘/ tmp’)
print («Текущий рабочий каталог: {0} «. Format (os.getcwd ()))
Измените «alishba» на имя пользователя, которое вы используете.
Запускаем скрипт:
Как использовать функцию remove ()
Функция remove () удаляет файл из системы .Мы указываем имя файла, а также путь, и он удаляет файл. При удалении файла из текущего каталога указывать путь не нужно; однако мы должны указать путь при удалении файлов или каталогов из других каталогов. Давайте используем os.remove () , чтобы стереть файл:
Чтобы удалить файл из текущего каталога: Запустите указанный ниже сценарий, чтобы удалить файл из текущего каталога:
import os
os.remove («file1.txt»)
print («файл удален !!»)
Сначала проверьте файл «file1.txt »в текущем каталоге с помощью команды ls, а затем запустите сценарий:
После запуска скрипта «file1.txt» не существует:
Удалить файл из другого каталога
Чтобы удалить файл, отличный от текущего каталога, вы должны указать путь к файлу, как указано в сценарии ниже, здесь я удаляю «file1.txt» из каталога «Документы» во время работы в домашнем каталоге:
import os
os.remove («/ home / alishba / Documents / file1.txt «)
print (» файл удален !! «)
Запускаем скрипт:
Как использовать функцию listdir ()
Файловая система, которая обслуживает и сохраняет файлы, является одним из важнейших компонентов любой операционной системы. Метод os.listdir () отображает файлы и подкаталоги каталога. Если каталог не указан, то предполагается текущий рабочий каталог, и возвращаются файлы и подкаталоги текущего рабочего каталога.Это похоже на команду «ls» в Linux.
Запустите указанный ниже сценарий, чтобы вывести список файлов и подкаталогов текущего рабочего каталога (домашнего) и каталога документов. Вы можете выбрать любой каталог, чтобы просмотреть его файлы и папки.
import os
print («файл и папка текущего каталога»)
print (os.listdir ())
print («файл и папка каталога документов»)
print (os.listdir («/ home / alishba / Документы »))
Как использовать функцию rename ()
Функция rename () переименовывает уже существующий файл: В качестве параметров принимает два аргумента, первый аргумент — старое имя, второй аргумент — новое имя файла, как показано ниже:
ос.переименовать ([имя-файла], [имя-нового-файла])
Запустите указанный ниже сценарий, чтобы переименовать файл в текущем каталоге:
импорт ОС
os.rename («файл1», «файл2»)
Сначала проверьте, существует ли «file1» , используя команду ls , затем запустите указанный выше сценарий и проверьте, переименован ли файл, как показано ниже:
Запустите указанный ниже сценарий, чтобы переименовать файл в другом каталоге. Я переименовываю «файл1» в папке «Документы» в «файл2»:
импорт ос
ос.переименовать («/ home / alishba / Documents / file1», «/ home / alishba / Documents / file2»)
Снова используйте команду ls , чтобы проверить наличие «file1», затем запустите указанный выше сценарий и проверьте, переименован ли файл или нет, как показано ниже:
Как использовать функцию rmdir ()
Функция rmdir () используется для удаления каталога из операционной системы. Он удаляет каталог и принимает в качестве аргументов имя и путь к файлу. В каталоге не должно быть файлов.Функцию rmdir () нельзя использовать для удаления текущего рабочего каталога. Запустите указанный ниже сценарий, чтобы удалить каталог из текущего каталога:
import os
os.rmdir («linuxhint»)
Сначала проверьте, существует ли каталог “linuxhint” , с помощью команды ls , затем запустите указанный выше сценарий и проверьте, удален ли каталог, как показано ниже:
Запустите указанный ниже сценарий, чтобы удалить каталог «linuxhint» из папки загрузок:
импорт ос
ос.rmdir («/ home / alishba / Downloads / linuxhint»)
Сначала проверьте наличие каталога «linuxhint» в каталоге загрузок с помощью команды ls , затем запустите указанный выше сценарий и проверьте, удален ли каталог, как показано ниже:
Заключение
Модуль
Python OS — это один из модулей Python, который помогает выполнять задачи операционной системы с использованием Python без использования операционной системы хост-машины. Чтобы получить доступ к модулю ОС, вам необходимо ознакомиться с командами операционной системы.В этой статье мы обсудили некоторые функции ОС, используя модуль ОС Python и его примеры. Прочитав эту статью, вы поймете, как работает модуль Python OS.
Все еще используете модуль ОС в Python? Эта альтернатива намного лучше | Дарио Радечич | Сентябрь, 2021
Время от времени вам нужен абсолютный путь к вашему рабочему каталогу с включенным именем файла Python. Вы можете быстро получить его с помощью pathlib
. Имейте в виду, что эта команда не будет работать в Jupyter Notebooks, так как вы не можете получить доступ к свойству __file__
там.Пропустите этот раздел, если вы пользователь Блокнота.
В любом случае, вот как получить абсолютный путь + имя файла скрипта Python:
curr_file = pathlib.Path (__ file__)
print (curr_file)
Вот как это выглядит на моей машине:
>>> /Users/dradecic/Desktop/pathlib_guide/python_pathlib.py
Все просто, правда? Правильно.
Если вам не нужно имя файла, есть более простое решение.
Это эквивалентно выполнению pwd
в оболочке Unix.Он вернет путь к каталогу, в котором вы сейчас находитесь или где находится запущенный скрипт.
Вот как его использовать:
cwd = pathlib.Path.cwd ()
print (cwd)
И вот что он печатает на моем компьютере:
>>> / Users / dradecic / Desktop / pathlib_guide
Как видите, имени файла нет.
Но что, если вам нужен доступ к файлу в родительской папке? В моем случае это будет Desktop
. Давайте поговорим об этом дальше.
Это просто. Вам нужно только получить доступ к родительскому свойству
текущего рабочего каталога. Вот как это делается:
one_above = pathlib.Path.cwd (). Parent
print (one_above)
Вот что он печатает на моем компьютере:
>>> / Users / dradecic / Desktop
Отлично! Но что, если одной родительской папки недостаточно? Давайте посмотрим, какие у вас есть варианты.
У вас есть варианты. Первый — вызвать access к родительскому свойству
несколько раз, как сумасшедший.Вот пример:
mul_above = pathlib.Path.cwd (). Parent.parent.parent
Более простой вариант — получить доступ к массиву свойств parent
и проиндексировать его. Например, вот как можно получить путь ко второму пути родительской папки:
mul_above = pathlib.Path.cwd (). Родители [1]
print (mul_above)
Вот результаты:
>> > / Users / dradecic
Индексирование массива начинается с 0, поэтому доступ к родительским папкам [1]
приведет вас ко второй родительской папке.
Теперь у вас достаточно знаний, чтобы начать объединять пути. Посмотрим, как дальше.
Допустим, папка с отчетами о продажах расположена на два каталога выше вашего текущего местоположения, а отчет называется summer-sales.csv
. Есть ли способ получить к нему доступ по абсолютному пути?
Конечно, есть.
Вы уже знаете, как получить доступ к N-й родительской папке. Вы расширите эту функциональность, вызвав joinpath ()
и указав имя отчета в качестве аргумента:
tgt_path = pathlib.Path.cwd (). Родители [1]
tgt_fname = 'summer-sales.csv'
print (tgt_path.joinpath (tgt_fname))
Вот что он печатает на моем компьютере:
>>> / Users / dradecic / summer-sales.csv
Функция joinpath ()
, вероятно, является той, которую я использую чаще всего. Это очень полезно.
Если бы у меня был доллар каждый раз, когда что-то в производстве выходило из строя из-за того, что я забыл создать каталог… Это довольно распространенная ошибка, и pathlib
позволяет обойти ее без особых хлопот.
Допустим, вы хотите хранить отчеты о продажах в папке reports
, расположенной в вашем текущем рабочем каталоге. Вам нужно будет создать эту папку, прежде чем вы сможете хранить в ней файлы. Вы должны создать его, только если его не существует.
Вкратце — используйте mkdir ()
для создания папки и exists ()
, чтобы проверить, существует ли уже папка.
Вот полный фрагмент кода:
tgt_path = pathlib.Path.cwd (). Joinpath ('reports'), если не tgt_path.exists ():
tgt_path.mkdir ()
Выполнение приведенного выше кода приведет, как вы уже догадались, к созданию папки отчетов .
:
Изображение 1 — Создание папок с помощью Pathlib (изображение автора)
Neat. Давайте посмотрим, как вы можете создавать файлы в этой папке.
Обычно отчеты сохраняются с помощью сторонних библиотек. Тем не менее, вы также можете использовать pathlib
для создания пустых файлов любого типа.
Вот как создать файл CSV и TXT в папке reports
:
tgt_path = pathlib.Path.cwd (). Joinpath ('reports')tgt_path.joinpath ('summer-sales.csv'). Touch (exist_ok = True)
tgt_path.joinpath ('winter-sales.txt'). Touch (exist_ok = True)
Параметр exist_ok = True
указывает Python перезаписать файл, если он уже существует.
Посмотрим, были ли созданы файлы:
Изображение 2 — Создание файлов с помощью Pathlib (изображение автора)
Прекрасно работает.
Если вы хотите проверить, является ли указанный путь папкой, не ищите ничего, кроме функции is_dir ()
.Возвращает логическое значение.
В следующем примере упомянутая функция используется как в папке, так и в файле:
tgt_path = pathlib.Path.cwd (). Joinpath ('reports')print (tgt_path.is_dir ())
print (tgt_path. joinpath ('summer-sales.csv'). is_dir ())
Вот что вы должны увидеть напечатанным:
>>> True
>>> False
И это все!
Как и в предыдущем примере, вы можете использовать функцию is_file ()
, чтобы проверить, приводит ли данный путь к файлу.
В приведенном ниже примере он используется как в папке, так и в файле:
tgt_path = pathlib.Path.cwd (). Joinpath ('reports')print (tgt_path.is_dir ())
print (tgt_path.joinpath ( 'summer-sales.csv'). is_dir ())
Как вы могли догадаться, на этот раз вы получите прямо противоположные результаты:
>>> False
>>> True
Давайте рассмотрим еще несколько полезные функции перед его вызовом в день.
Вы можете получить доступ к свойству name
, если вам нужно извлечь имя файла из абсолютного пути.
Вот простой и не очень полезный пример. Он печатает имя нашего файла summer-sales.csv
:
tgt_path = pathlib.Path.cwd (). Joinpath ('reports / summer-sales.csv')
print (tgt_path.name)
Вот что вы должны увидеть в консоли:
>>> summer-sales.csv
Не особо.
Иногда все, что вам нужно, — это расширение файла. Возможно, вы хотите обрабатывать разные типы файлов по-разному и не слишком заботитесь об имени файла.Свойство с суффиксом
поможет вам.
Вот как вы можете получить расширение файла из того же файла summer-sales.csv
:
tgt_path = pathlib.Path.cwd (). Joinpath ('reports / summer-sales.csv')
print (tgt_path .suffix)
Вот что вы должны увидеть в распечатанном виде:
>>> .csv
И, наконец, давайте рассмотрим итерацию.
Допустим, у вас есть несколько отчетов CSV в одном каталоге, и вы хотите обрабатывать их один за другим.Функция iterdir ()
— это все, что вам нужно.
Весь процесс не может быть проще:
tgt_path = pathlib.Path.cwd (). Joinpath ('reports')для файла в tgt_path.iterdir ():
print (file)
Вот что он печатает на моей машине:
>>> /Users/dradecic/Desktop/pathlib_guide/reports/summer-sales.csv
/Users/dradecic/Desktop/pathlib_guide/reports/winter-sales.txt
И это делает на сегодня. Теперь у вас есть все необходимое, чтобы больше никогда не вызвать глупую производственную ошибку.
Модуль ОС — Стандартная библиотека Python [Книга]
Модуль os
обеспечивает унифицированный интерфейс для многих операционных систем.
системные функции.
Большинство функций в этом модуле реализованы модулями для конкретной платформы, такими как posix
или nt
. ОС
модуль автоматически загружает правильный модуль реализации, когда он
сначала импортируется.
Встроенная функция open
позволяет создавать, открывать,
и измените файлы, как показано в Примере 1-27.Этот модуль добавляет те дополнительные функции, которые вам нужны
переименовывать и удалять файлы.
Пример 1-27. Использование модуля os для переименования и удаления файлов
Файл: os-example-3.py импорт ОС строка импорта def replace (файл, search_for, replace_with): # заменить строки в текстовом файле back = os.path.splitext (файл) [0] + ".bak" temp = os.path.splitext (файл) [0] + ".tmp" пытаться: # удалить старый временный файл, если есть os.remove (темп) кроме os.error: проходить fi = open (файл) fo = open (temp, "w") для s в fi.readlines (): fo.write (string.replace (s, search_for, replace_with)) fi.close () fo.close () пытаться: # удалить старый файл резервной копии, если есть os.remove (назад) кроме os.error: проходить # переименовать оригинал в резервную копию ... os.rename (файл, назад) # ... и от временного к исходному os.rename (временный, файл) # # попробуйте! file = "samples / sample.txt" replace (файл, "привет", "тжена") replace (file, "tjena", "hello")
Модуль os
также содержит множество функций, которые работают на всех
каталоги.
Функция listdir
возвращает список всех
имена файлов в заданном каталоге, как показано в Примере 1-28. Текущий и родительский каталог
маркеры, используемые в Unix и Windows (,
и
..
) не включены в этот список.
Пример 1-28. Использование модуля os для вывода списка файлов в каталоге
Файл: os-example-5.py импорт ОС для файла в os.listdir ("образцы"): распечатать файлпробл.ау
образец.jpg
sample.wav
...
Модели getcwd
и chdir
функции используются для получения и установки текущего каталога, как показано в Примере 1-29.
Пример 1-29. Использование модуля os для изменения рабочего каталога
Файл: os-example-4.py импорт ОС # Где мы? cwd = os.getcwd () вывести «1», cwd # опускаться os.chdir ("образцы") напечатайте "2", os.getcwd () # вернуться os.chdir (os.pardir) напечатать «3», ос.getcwd ()1 / ematter / librarybook
2 / ematter / librarybook / samples
3 / ematter / librarybook
македиров
и удаленных
функции используются для создания и удаления иерархий каталогов, как показано в Примере 1-30.
Пример 1-30. Использование модуля os для создания и удаления нескольких каталогов
Уровни
Файл: os-example-6.py импорт ОС os.makedirs ("тест / несколько / уровни") fp = open ("тест / несколько / уровни / файл", "ш") fp.написать («инспектор пралине») fp.close () # удалить файл os.remove ("тест / несколько / уровни / файл") # и все пустые каталоги над ним os.removedirs ("test / multiple / levels")
Обратите внимание, что deletedirs
удаляет все пустые
каталоги по заданному пути, начиная с последнего каталога в
указанный путь. Напротив, mkdir
и
rmdir
функции могут обрабатывать только один
уровень каталога, как показано в Примере 1-31.
Пример 1-31. Использование модуля os для создания и удаления каталогов
Файл: os-example-7.ру импорт ОС os.mkdir ("тест") os.rmdir ("тест") os.rmdir ("samples") # это не сработаетTraceback (самый внутренний последний):
Файл "os-example-7", строка 6, в?
OSError: [Errno 41] Каталог не пуст: 'samples'
Чтобы удалить непустые каталоги, вы можете использовать
Функция rmtree
в модуле shutil
.
Работа с атрибутами файлов
Функция stat
извлекает информацию о
существующий файл, как показано в Примере 1-32.Он возвращает 9-кортеж, содержащий размер, индексный дескриптор
изменить метку времени, метку времени модификации и права доступа.
Пример 1-32. Использование модуля os для получения информации о файле
Файл: os-example-1.py импорт ОС время импорта file = "samples / sample.jpg" def dump (st): режим, ino, dev, nlink, uid, gid, size, atime, mtime, ctime = st print "- size:", size, "bytes" print "- owner:", uid, gid print "- создано:", time.ctime (ctime) print "- последний доступ:", время.ctime (время) print "- последнее изменение:", time.ctime (mtime) печать "- режим:", окт (режим) print "- inode / dev:", ino, dev # # получить статистику для имени файла st = os.stat (файл) напечатать "stat", файл свалка (ул) Распечатать # # получить статистику для открытого файла fp = open (файл) st = os.fstat (fp.fileno ()) напечатать "fstat", файл свалка (ул)stat samples / sample.jpg
- размер: 4762 байта
- собственник: 0 0
- создано: Tue Sep 07 22:45:58 1999
- последний доступ: 19 сен 00:00:00 1999
- последнее изменение: вс 19 мая 01:42:16 1996
- режим: 0100666
- индексный дескриптор / устройство: 0 2
fstat образцов / образец.jpg
- размер: 4762 байта
- собственник: 0 0
- создано: Tue Sep 07 22:45:58 1999
- последний доступ: 19 сен 00:00:00 1999
- последнее изменение: вс 19 мая 01:42:16 1996
- режим: 0100666
- inode / dev: 0 0
Некоторые поля не имеют смысла на платформах, отличных от Unix; например,
( inode
, dev
) кортеж обеспечивает уникальный идентификатор для каждого файла в Unix,
но может содержать произвольные данные на других платформах.
Модуль stat
содержит ряд полезных констант и вспомогательных функций для работы с
с членами кортежа stat. Некоторые из них показаны в
следующие примеры.
Вы можете изменить поля режима и времени, используя
chmod
и utime
, как показано в Примере 1-33.
Пример 1-33. Использование модуля os для изменения привилегий файла и
Метки времени
Файл: os-example-2.py импорт ОС статистика импорта, время infile = "образцы / образец.jpg " Outfile = "out.jpg" # копировать содержимое fi = open (infile, "rb") fo = open (Outfile, "wb") а 1: s = fi.read (10000) если не s: перерыв fo.write (s) fi.close () fo.close () # режим копирования и отметка времени st = os.stat (infile) os.chmod (Outfile, stat.S_IMODE (st [stat.ST_MODE])) os.utime (Outfile, (st [stat.ST_ATIME], st [stat.ST_MTIME])) напечатать "оригинал", "=>" print "режим", окт (stat.S_IMODE (st [stat.ST_MODE])) выведите "atime", time.ctime (st [stat.ST_ATIME]) напечатайте "mtime", time.ctime (st [stat.ST_MTIME]) распечатать "копия", "=>" st = os.stat (исходящий файл) print "режим", окт (stat.S_IMODE (st [stat.ST_MODE])) выведите "atime", time.ctime (st [stat.ST_ATIME]) напечатайте "mtime", time.ctime (st [stat.ST_MTIME])исходное =>
режим 0666
одновременно Чт 14 октября 15:15:50 1999
mtime Mon Nov 13 15:42:36 1995
копия =>
режим 0666
одновременно Чт 14 октября 15:15:50 1999
mtime Mon Nov 13 15:42:36 1995
Система Функция
запускает новую команду под
текущий процесс и ожидает его завершения, как показано в Примере 1-34.
Пример 1-34. Использование модуля os для запуска команды операционной системы
Файл: os-example-8.py импорт ОС если os.name == "nt": command = "dir" еще: command = "ls -l" os.system (команда)-rwxrw-r-- 1 effbot effbot 76 9 октября, 14:17 README
-rwxrw-r-- 1 effbot effbot 1727 7 октября 19:00 SimpleAsyncHTTP.py
-rwxrw-r-- 1 effbot effbot 314 7 октября 20:29 aifc-example-1.py
-rwxrw-r-- 1 effbot effbot 259 7 октября 20:38 anydbm-example-1.ру
...
Команда запускается через стандартную оболочку операционной системы, и
возвращает статус выхода оболочки. В Windows 95/98 оболочка
обычно command.com
, статус выхода которого всегда равен 0.
Предупреждение
С os.system
передает команду на
оболочку как есть, ее использование может быть опасным, если вы не проверяете
с аргументами (рассмотрите возможность запуска os.system ("viewer% s"% file)
с файловой переменной, установленной на
"образец.jpg; rm -rf $ HOME "
). Когда
не уверен, обычно лучше использовать exec
или
Вместо этого порождает
(объяснено позже).
Функция exec
запускает новый процесс, заменяя
текущий (другими словами, «перейти к обработке»). В
Пример 1-35, обратите внимание, что сообщение «до свидания»
никогда не печатал.
Пример 1-35. Использование модуля ОС для запуска нового процесса
Файл: os-exec-example-1.py
импорт ОС
import sys
program = "питон"
arguments = ["привет.py "]
print os.execvp (программа, (программа,) + кортеж (аргументы))
печать "до свидания"
привет еще раз, и добро пожаловать на шоу
Python предоставляет целую кучу функций exec
,
со слегка различающимся поведением. В примере 1-35 используется
execvp
, который ищет программу по
стандартный путь, передает содержимое кортежа второго аргумента как
отдельные аргументы этой программы и запускает ее с текущим набором
переменных среды. См. Библиотеку Python
Ссылка для получения дополнительной информации о других семи
способы вызова этой функции.
В Unix вы можете вызывать другие программы из текущей, используя
объединение exec
с двумя другими функциями,
fork
и ждут
, как показано в Примере 1-36. Вилка функция
делает копию текущего процесса, а функция wait
ожидает дочернего
процесс, чтобы закончить.
Пример 1-36. Использование модуля os для запуска другой программы (Unix)
Файл: os-exec-example-2.py импорт ОС import sys def run (программа, * args): pid = os.вилка() если не pid: os.execvp (программа, (программа,) + аргументы) return os.wait () [0] run ("питон", "hello.py") печать "до свидания"привет еще раз и добро пожаловать на шоу
до свидания
Вилка
возвращает ноль в новом процессе (
возврат с вилки
— это первое, что происходит
в этом процессе!) и ненулевой идентификатор процесса в исходном
процесс. Или, другими словами, «, а не pid
».
верно, только если мы находимся в новом процессе.
Вилка ,
и , ожидание, функции
не работают.
доступно в Windows, но вы можете использовать порождение
вместо этого, как показано в Примере 1-37. К сожалению, стандартной версии
порождает
, который ищет исполняемый файл в
путь, поэтому вы должны сделать это сами.
Пример 1-37. Использование модуля os для запуска другой программы (Windows)
Файл: os-spawn-example-1.py импорт ОС строка импорта def run (программа, * args): # найти исполняемый файл для пути в строке.split (os.environ ["ПУТЬ"], os.pathsep): file = os.path.join (путь, программа) + ".exe" пытаться: вернуть os.spawnv (os.P_WAIT, file, (file,) + args) кроме os.error: проходить поднять os.error, "не удается найти исполняемый файл" run ("питон", "hello.py") печать "до свидания"привет еще раз и добро пожаловать на шоу
до свидания
Вы также можете использовать spawn
для запуска других программ в
фон. Пример 1-38 добавляет необязательный
Режим
аргумент для выполнения
функция; при установке на ос.P_NOWAIT
, скрипт
не ждет завершения другой программы. Значение флага по умолчанию os.P_WAIT
сообщает
порождает
, чтобы дождаться завершения нового процесса.
Другие флаги включают os.P_OVERLAY
, что делает
spawn
ведет себя как exec
и
os.P_DETACH
, который запускает новый процесс в
фон, отделенный как от консоли, так и от клавиатуры.
Пример 1-38. Использование модуля ОС для запуска другой программы в фоновом режиме
(Windows)
Файл: os-spawn-example-2.ру импорт ОС строка импорта def run (program, * args, ** kw): # найти исполняемый файл mode = kw.get ("режим", os.P_WAIT) для пути в string.split (os.environ ["ПУТЬ"], os.pathsep): file = os.path.join (путь, программа) + ".exe" пытаться: return os.spawnv (режим, файл, (файл,) + аргументы) кроме os.error: проходить поднять os.error, "не удается найти исполняемый файл" run ("python", "hello.py", mode = os.P_NOWAIT) печать "до свидания"до свидания
снова привет и добро пожаловать на шоу
Пример 1-39 предоставляет метод создания
который работает на любой платформе.
Пример 1-39. Использование spawn или fork / exec для запуска другой программы
Файл: os-spawn-example-3.py импорт ОС строка импорта если os.name in ("nt", "dos"): exefile = ".exe" еще: exefile = "" def spawn (программа, * args): пытаться: # возможный ярлык 2.0! return os.spawnvp (программа, (программа,) + аргументы) кроме AttributeError: проходить пытаться: spawnv = os.spawnv кроме AttributeError: # предположим, что это unix pid = os.fork () если не pid: Операционные системы.execvp (программа, (программа,) + аргументы) return os.wait () [0] еще: # есть spawnv, но нет spawnp: ищите исполняемый файл для пути в string.split (os.environ ["ПУТЬ"], os.pathsep): file = os.path.join (путь, программа) + exefile пытаться: вернуть spawnv (os.P_WAIT, file, (file,) + args) кроме os.error: проходить поднять IOError, "не удается найти исполняемый файл" # # попробуйте! spawn ("питон", "hello.py") печать "до свидания"привет еще раз и добро пожаловать на шоу
до свидания
Пример 1-39 первые попытки вызвать функцию с именем
спавнvp
.Если этого не существует (его нет, в
2.0 и ранее) функция ищет функцию с именем
spawnv
и ищет путь самостоятельно. Как
в крайнем случае, он возвращается к exec
и
вилка
.
Работа с демоническими процессами
В Unix вы также можете использовать вилку
, чтобы включить
текущий процесс в фоновый процесс («демон»).
По сути, вам нужно разветвить копию текущего
процесс и завершить исходный процесс, как показано в Примере 1-40.
Пример 1-40. Использование модуля os для запуска от имени демона (Unix)
Файл: os-example-14.py импорт ОС время импорта pid = os.fork () если pid: os._exit (0) # убить оригинал напечатать "демон запущен" время сна (10) напечатать "демон завершен"
Однако для создания настоящего демона требуется немного больше работы.
Сначала вызовите setpgrp
, чтобы сделать новый процесс
«Руководитель группы процессов». В противном случае сигналы, отправленные на (
в этот раз) несвязанная группа процессов может вызвать проблемы в вашем
демон:
ос.setpgrp ()
Также рекомендуется удалить маску пользовательского режима, чтобы файлы
созданные демоном фактически получают флаги режима, указанные
программа:
os.umask (0)
Затем вы должны перенаправить файлы stdout / stderr
, а не просто
закрывая их (если вы этого не сделаете, вы можете получить неожиданные исключения
в тот день, когда часть вашего кода пытается что-то записать в консоль через
stdout
или stderr
).
класс NullDevice: def write (self, s): проходить sys.stdin.close () sys.stdout = NullDevice () sys.stderr = NullDevice ()
Другими словами, в то время как Python печатает
и C
printf / fprintf
не приведет к сбою вашей программы, если
устройства были отключены, sys.stdout.write ()
с радостью выдает исключение IOError
, когда
приложение работает как демон. Но ваша программа отлично работает, когда
работает на переднем плане …
Кстати, функция _exit
использовалась в предыдущем
examples завершает текущий процесс.В отличие от
sys.exit
, это работает также, если вызывающий абонент происходит
для перехвата исключения SystemExit
, как показано в Примере 1-41.
Пример 1-41. Использование модуля os для выхода из текущего процесса
Файл: os-example-9.py
импорт ОС
import sys
пытаться:
sys.exit (1)
кроме SystemExit, значение:
напечатайте "пойманный выход (% s)"% значение
пытаться:
os._exit (2)
кроме SystemExit, значение:
напечатайте "пойманный выход (% s)"% значение
напечатайте "пока!"
пойманный выход (1)
16.1. os — Различные интерфейсы операционной системы — документация Python 2.7.6
Создание имен файлов в дереве каталогов путем обхода дерева
либо сверху вниз, либо снизу вверх. Для каждого каталога в дереве с корнем в каталоге
верхний (включая верхний ), это дает 3-кортеж (dirpath, dirnames,
.
имена файлов)
dirpath — строка, путь к каталогу. dirnames — это список
имена подкаталогов в dirpath (исключая '.'
и ' .. '
).
имен файлов — это список имен файлов, не относящихся к каталогам, в dirpath .
Обратите внимание, что имена в списках не содержат компонентов пути. Чтобы получить полный путь
(который начинается с top ) в файл или каталог в dirpath , выполните
os.path.join (dirpath, имя)
.
Если необязательный аргумент сверху вниз равен Истинно
или не указан, тройка для
каталог создается до троек для любого из его подкаталогов
(каталоги создаются сверху вниз).Если сверху вниз равно Ложь
, тройная
для каталога создается после троек для всех его подкаталогов
(каталоги создаются снизу вверх). Независимо от значения сверху вниз ,
список подкаталогов извлекается перед кортежами для каталога и
его подкаталоги будут созданы.
Когда сверху вниз равно Истина
, вызывающий может изменить список dirnames на месте
(возможно, используя del
или назначение среза), а walk ()
будет только
рекурсивный переход в подкаталоги, имена которых остаются в именах каталогов ; это может быть
используется для сокращения результатов поиска, установления определенного порядка посещения или даже для информирования
walk ()
о каталогах, которые вызывающий абонент создает или переименовывает перед его возобновлением
walk ()
снова.Изменение dirnames , когда сверху вниз равно False
имеет
не влияет на поведение прогулки, потому что в восходящем режиме каталоги
в dirnames генерируются до того, как dirpath генерируется.
По умолчанию ошибки вызова listdir ()
игнорируются. Если необязательно
указан аргумент при ошибке , это должна быть функция; он будет называться с
один аргумент, экземпляр OSError
. Он может сообщить об ошибке, чтобы продолжить
с обходом или вызовите исключение, чтобы отменить обход.Обратите внимание, что имя файла
доступен как атрибут filename
объекта исключения.
По умолчанию walk ()
не переходит к символическим ссылкам, которые разрешают
каталоги. Установите followlinks с на True
для посещения каталогов, на которые указывает
символические ссылки в системах, которые их поддерживают.
Примечание
Имейте в виду, что установка следующих ссылок с на Истинный
может привести к бесконечному
рекурсия, если ссылка указывает на свой родительский каталог. прогулка ()
не отслеживает уже посещенные каталоги.
Примечание
Если вы передаете относительный путь, не меняйте текущий рабочий каталог
между возобновлениями ходьбы ()
. walk ()
никогда не меняет текущий
каталог, и предполагает, что его вызывающий тоже не делает этого.
В этом примере отображается количество байтов, занятых файлами, не относящимися к каталогам, в каждом
каталог в начальном каталоге, за исключением того, что он не смотрит ни в какие
Подкаталог CVS:
импорт ОС из os.присоединение к импорту пути, getsize для root, dirs, файлов в os.walk ('python / Lib / email'): print (root, "потребляет", end = "") print (sum (getsize (join (root, name)) для имени в файлах), end = "") print ("байтов в", len (файлы), "файлы вне каталога") если 'CVS' в каталогах: dirs.remove ('CVS') # не посещать каталоги CVS
В следующем примере (простая реализация shutil.rmtree ()
),
необходимо ходить по дереву снизу вверх, rmdir ()
не позволяет
удаление каталога до того, как каталог станет пустым:
# Удалить все доступное из каталога, указанного в "top",
# при условии, что нет символических ссылок.