Как создать файл python в windows 10

Как создать файл с расширением py Для создания программ на Python нам потребуется интерпретатор. Для его установки перейдем на страницу

Для создания программ на Python нам потребуется интерпретатор. Для его установки перейдем на страницу https://www.python.org/downloads/ и найдем ссылку на загрузку последней версии языка:

Установка Python

По нажатию на кнопку будет загружен соответствующей текущей ОС установщик Python. Следует учитывать, что Windows 7 и более ранние версии не поддерживаются.

На ОС Windows при запуске инсталлятора запускает окно мастера установки:

Установка дистрибутива Python 3.10 на Windows

Здесь мы можем задать путь, по которому будет устанавливаться интерпретатор. Оставим его по умолчанию, то есть C:Users[имя_пользователя]AppDataLocalProgramsPythonPython310 .

Кроме того, в самом низу отметим флажок «Add Python 3.10 to PATH», чтобы добавить путь к интерпретатору в переменные среды.

После этого мы можем проверить установку Python и его версию, запустив в командной строке/треминале команду

Запуск интерпретатора

После установки интерпретатора, как было описано в прошлой теме, мы можем начать создавать приложения на Python. Итак, создадим первую простенькую программу.

Как было сказано в прошлой теме, программа интерпретатора, если при установке не был изменен адрес, по умолчанию устанавливается на Linux по пути usr/local/bin/python310 , а на Windows по пути C:Users[имя_пользователя]AppDataLocalProgramsPythonPython310 и представляет файл под названием python.exe .

Интерпретатор Python

Запустим интерпретатор и введем в него следующую строку:

И консоль выведет строку «hello world»:

Первая программа на Python

Для этой программы использовалась функция print() , которая выводит некоторую строку на консоль.

Создание файла программы

В реальности, как правило, программы определяются во внешних файлах-скриптах и затем передаются интерпретатору на выполнение. Поэтому создадим файл программы. Для этого на диске C или где-нибудь в другом месте файловой системы определим для скриптов папку python . А в этой папке создадим новый текстовый файл, который назовем hello.py . По умолчанию файлы с кодом на языке Python, как правило, имеют расширение py .

Создание скрипта на языке Python

Откроем этот файл в любом текстовом редакторе и добавим в него следующий код:

Python в Notepad++

Скрипт состоит из двух строк. Первая строка с помощью функции input() ожидает ввода пользователем своего имени. Введенное имя затем попадает в переменную name .

Вторая строка с помощью функции print() выводит приветствие вместе с введенным именем.

Теперь запустим командную строку/терминал и с помощью команды cd перейдем к папке, где находится файл с исходным кодом hello.py (например, в моем случае это папка C:python).

Далее вначале введем полный путь к интерпретатору, а затем полный путь к файлу скрипта. К примеру, в моем случае в консоль надо будет вести:

Но если при установке была указана опция «Add Python 3.10 to PATH» , то есть путь к интерпретатору Python был добавлен в переменные среды, то вместо полного пути к интерпретатору можно просто написать python:

Варианты с обоими способами запуска:

Первое приложение на Python

В итоге программа выведет приглашение к вводу имени, а затем приветствие.

Не могу создать файл .py (Python)

Если ты решил именно создать файл, так и создавай его в консольке:

copy con file.py

А лучше используй какую-нибудь IDE, все будет гораздо проще.

если у тебя windows 10
1. открыть панель управления
2. найти в панели управления «параметры проводника»
3. убрать галочку с функции «скрывать расширения для зарегистрированных типов файлов

Как запустить скрипт Python (пошаговое руководство)

В этом руководстве рассказывается о том, как создать и как запустить скрипт на Python.

Программирование или скриптинг?

Обработку данных на основе Python можно разбить на маленькие этапы. Например:

  1. Импорт numpy и pandas.
  2. Загрузка необработанных данных из .csv файла в DataFrame.
  3. Загрузка необработанных данных из словаря Python в другой DataFrame.
  4. Объединение двух фреймов данных.
  5. Сортировка значений.
  6. Заполнение пустых значений.
  7. И так далее…

Можно выполнить эти задачи вручную. Или поместить эти команды в скрипт Python . Это и есть скриптинг.

Скрипт Python похож на сценарий фильма. В нем вы точно записываете, должен делать компьютер.

Как создать скрипт Python

Вы можете использовать любой код, написанный ранее в Jupyter. Например, вот мой Jupyter Notebook .

Как создать скрипт Python

Как превратить код Python для Jupyter Notebook в скрипт Python?

Для этого нужно скопировать все строки из Jupyter Notebook и поместить их в текстовый редактор. После чего сохранить в файл с расширением .py.

Создадим скрипт Python

Шаг №1 — откройте текстовый редактор.

Если вы находитесь на удаленном сервере, откройте свой любимый текстовый редактор. Для этого введите команду:

Шаг №1 - откройте текстовый редактор.

Вы можете использовать любой текстовый редактор (vim, nano и т. д.).
Но если вы хотите что-то более продвинутое, я настоятельно рекомендую Sublime Text 3.

Шаг №1 - откройте текстовый редактор. - 2

Шаг №2 — скопируйте и вставьте код!

Скопируйте и вставьте весь код из Jupyter Notebook в текстовый редактор:

Шаг №2 - скопируйте и вставьте код!

Шаг №3 — Сохраните файл как файл .py!

Нажмите кнопку 10-Quit в правом нижнем углу (или Esc+0 на клавиатуре).

Шаг №3 - Сохраните файл как файл .py!

После чего mcedit спросит, хотите ли вы сохранить файл? Нажмите: Yes! Затем задайте имя новому текстовому файлу. Скрипты Python имеют собственное расширение: .py.

Шаг №3 - Сохраните файл как файл .py! - 2

Нажмите ОК . Теперь текстовый файл теперь стал скриптом Python.

Шаг № 4 — Снова откройте текстовый файл

Вернемся к редактированию файла, набрав команду:

Теперь код выглядит более похожим на Python с различной подсветкой:

Шаг № 4 - Снова откройте текстовый файл

Это потому, что вы добавили расширение .py . В результате этого редактор mcedit распознал текстовый файл как скрипт Python.

Шаг № 5 — Добавьте Shebang!

Shebang — это строка кода, которую нужно поместить в самом начале скрипта. Его задача – сообщить ОС, что у вас есть исполняемый файл Python3.

Строка shebang для скриптов Python3 выглядит следующим образом:

Шаг № 5 - Добавьте Shebang!

Если честно, ваш скрипт будет работать и без него. Несмотря на это, я предпочитаю добавлять Shebang по нескольким причинам:

  • В среде разработки, в которой доступно сразу несколько версий Python, Shebang прояснит, какой интерпретатор должен выполнить скрипт.
  • Когда один из ваших коллег откроет скрипт, он сразу увидит, на каком языке он написан.

Дополнительно: шаг № 6 — сделать скрипты на Python исполняемыми

После добавления Shebang, снова сохраните файл и попробуйте запустить скрипт, введя команду:

В некоторых случаях (в зависимости от конфигурации используемого сервера) вы получите ошибку прав доступа:

В Python подобная ошибка прав доступа не возникает. Если вы не столкнулись с этой проблемой, просто перейдите к шагу № 7.

Если у вас возникла ошибка прав доступа, в командной строке введите этот код:

Затем введите свой пароль.

Шаг №7 — запустите скрипт на Python!

Запустите скрипт, введя команду:

Это означает, что ваш скрипт на Python запущен. Но вы не видите никакого результата на экране.

Шаг № 8 — почему я ничего не вижу?

В большинстве случаев, когда вы конвертируете проект Jupyter Notebook в скрипт Python, вы не увидите на экране ничего. Это потому, что последняя строка вашего кода была такой:

Шаг № 8 - почему я ничего не вижу?

Вернитесь к своему скрипту и измените последнюю строку на эту:

Шаг № 8 - почему я ничего не вижу? - 2

Нажмите 10-Quit и Save.

Перезапустите скрипт, введя для этого команду:

Шаг № 9 — Вы создали скрипт на Python

Шаг № 9 - Вы создали скрипт на Python

Вы создали скрипт на Python, и он работает. Но вы все равно захотите использовать Jupyter Notebook. Так как он является идеальным инструментом для тестирования и настройки процессов. Поэтому:

  1. Я создаю прототип проекта на Python в Jupyter Notebook. Затем создаю код и выясняю, какие шаги необходимы.
  2. Затем удаляю ненужные фрагменты кода и импортированные пакеты, сортирую задачи Python в порядке их выполнения.
  3. Добавляю комментарии к коду.
  4. Перемещаю все в текстовый редактор (Sublime Text или mcedit) и создаю скрипт Python, который можно автоматизировать.

Заключение

Написание и запуск скриптов Python это не магия. Если вы знаете, как писать код на Python, то сможете освоить и скрипты

Дайте знать, что вы думаете по данной теме статьи в комментариях. За комментарии, отклики, дизлайки, лайки, подписки низкий вам поклон!

Дайте знать, что вы думаете по этой теме статьи в комментариях. За комментарии, подписки, лайки, отклики, дизлайки низкий вам поклон!

Установка PyInstaller не отличается от установки любой другой библиотеки Python.

pip install PyInstaller

Вот так можно проверить версию PyInstaller.

pyinstaller --version

Я использую PyInstaller версии 4.2.

Создание exe файла с помощью PyInstaller

PyInstaller собирает в один пакет Python-приложение и все необходимые ему библиотеки следующим образом:

  1. Считывает файл скрипта.
  2. Анализирует код для выявления всех зависимостей, необходимых для работы.
  3. Создает файл spec, который содержит название скрипта, библиотеки-зависимости, любые файлы, включая те параметры, которые были переданы в команду PyInstaller.
  4. Собирает копии всех библиотек и файлов вместе с активным интерпретатором Python.
  5. Создает папку BUILD в папке со скриптом и записывает логи вместе с рабочими файлами в BUILD.
  6. Создает папку DIST в папке со скриптом, если она еще не существует.
  7. Записывает все необходимые файлы вместе со скриптом или в одну папку, или в один исполняемый файл.

Если использовать параметр команды onedir или -D при генерации исполняемого файла, тогда все будет помещено в одну папку. Это поведение по умолчанию. Если же использовать параметр onefile или -F, то все окажется в одном исполняемом файле.

Возьмем в качестве примера простейший скрипт на Python c названием simple.py, который содержит такой код.

import time
name = input("Введите ваше имя ")
print("Ваше имя ", name)
time.sleep(5)

Создадим один исполняемый файл. В командной строке введите:

pyinstaller --onefile simple.py

После завершения установки будет две папки, BUILD и DIST, а также новый файл с расширением .spec. Spec-файл будет называться так же, как и файл скрипта.

папки, BUILD и DIST, а также файл .spec

Python создает каталог распространения, который содержит основной исполняемый файл, а также все динамические библиотеки.

 исполняемый файл

Вот что произойдет после запуска файла.

Добавление файлов с данными, которые будут использоваться exe-файлом

Есть CSV-файл netflix_titles.csv, и Python-script, который считывает количество записей в нем. Теперь нужно добавить этот файл в бандл с исполняемым файлом. Файл Python-скрипта назовем просто simple1.py.

import time
# pip install pandas
import pandas as pd


def count_records():
    data = pd.read_csv('netflix_titles.csv')
    print("Всего фильмов:", data.shape[0])


if __name__ == "__main__":
    count_records()
    time.sleep(5)

Создадим исполняемый файл с данными в папке.

pyinstaller --add-data "netflix_titles.csv;." simple1.py

Параметр --add-data позволяет добавить файлы с данными, которые нужно сохранить в одном бандле с исполняемым файлом. Этот параметр можно применить много раз.

Синтаксис add-data:

  • add-data — Windows.
  • add-data — Linux.

Можно увидеть, что файл теперь добавляется в папку DIST вместе с исполняемым файлом.

Добавление файлов с данными

Также, открыв spec-файл, можно увидеть раздел datas, в котором указывается, что файл netflix_titles.csv копируется в текущую директорию.

...
a = Analysis(['simple1.py'],
             pathex=['E:\myProject\pyinstaller-tutorial'],
             binaries=[],
             datas=[('netflix_titles.csv', '.')],
...

Запустим файл simple1.exe, появится консоль с выводом: Всего фильмов: 7787.

Добавление файлов с данными и параметр onefile

Если задать параметр --onefile, то PyInstaller распаковывает все файлы в папку TEMP, выполняет скрипт и удаляет TEMP. Если вместе с add-data указать onefile, то нужно считать данные из папки. Путь папки меняется и похож на «_MEIxxxxxx-folder».

import time
import sys
import os
# pip install pandas
import pandas as pd


def count_records():
    os.chdir(sys._MEIPASS)
    data = pd.read_csv('netflix_titles.csv')
    print("Всего фильмов:", data.shape[0])


if __name__ == "__main__":
    count_records()
    time.sleep(5)

Скрипт обновлен для чтения папки TEMP и файлов с данными. Создадим exe-файл с помощью onefile и add-data.

pyinstaller --onefile --add-data "netflix_titles.csv;." simple1.py

После успешного создания файл simple1.exe появится в папке DIST.

Можно скопировать исполняемый файл на рабочий стол и запустить, чтобы убедиться, что нет никакой ошибки, связанной с отсутствием файла.

Добавление файлов с данными и параметр onefile

Дополнительные импорты с помощью Hidden Imports

Исполняемому файлу требуются все импорты, которые нужны Python-скрипту. Иногда PyInstaller может пропустить динамические импорты или импорты второго уровня, возвращая ошибку ImportError: No module named

Для решения этой ошибки нужно передать название недостающей библиотеки в hidden-import.

Например, чтобы добавить библиотеку os, нужно написать вот так:

pyinstaller --onefile --add-data "netflix_titles.csv;." — hidden-import "os" simple1.py

Файл spec

Файл spec — это первый файл, который PyInstaller создает, чтобы закодировать содержимое скрипта Python вместе с параметрами, переданными при запуске.

PyInstaller считывает содержимое файла для создания исполняемого файла, определяя все, что может понадобиться для него.

Файл с расширением .spec сохраняется по умолчанию в текущей директории.

Если у вас есть какое-либо из нижеперечисленных требований, то вы можете изменить файл спецификации:

  • Собрать в один бандл с исполняемым файлы данных.
  • Включить другие исполняемые файлы: .dll или .so.
  • С помощью библиотек собрать в один бандл несколько программы.

Например, есть скрипт simpleModel.py, который использует TensorFlow и выводит номер версии этой библиотеки.

import time
import tensorflow as tf


def view_model():
    print(tf.__version__)


if __name__ == "__main__" :
    model = view_model()
    time.sleep(5)

Компилируем модель с помощью PyInstaller:

pyinstaller -F simpleModel.py

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

...
File "site-packagestensorflow_corepython_init_.py", line 49, in ImportError: cannot import name 'pywrap_tensorflow' from 'tensorflow_core.python' 

Исправим ее, обновив файл spec. Одно из решений — создать файл spec.

$ pyi-makespec simpleModel.py -F
wrote E:pyinstaller-tutorialsimpleModel.spec
now run pyinstaller.py to build the executable

Команда pyi-makespec создает spec-файл по умолчанию, содержащий все параметры, которые можно указать в командной строке. Файл simpleModel.spec создается в текущей директории.

Поскольку был использован параметр --onefile, то внутри файла будет только раздел exe.

...
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='simpleModel',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=True )

Если использовать параметр по умолчанию или onedir, то вместе с exe-разделом будет также и раздел collect.

Можно открыть simpleModel.spec и добавить следующий текст для создания хуков.

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None
import os
spec_root = os.path.realpath(SPECPATH)
options = []
from PyInstaller.utils.hooks import collect_submodules, collect_data_files
tf_hidden_imports = collect_submodules('tensorflow_core')
tf_datas = collect_data_files('tensorflow_core', subdir=None, include_py_files=True)

a = Analysis(['simpleModel.py'],
             pathex=['E:\myProject\pyinstaller-tutorial'],
             binaries=[],
             datas=tf_datas + [],
             hiddenimports=tf_hidden_imports + [],
             hookspath=[],
...

Создаем хуки и добавляем их в hidden imports и раздел данных.

Хуки

Файлы хуков расширяют возможность PyInstaller обрабатывать такие требования, как необходимость включать дополнительные данные или импортировать динамические библиотеки.

Обычно пакеты Python используют нормальные методы для импорта своих зависимостей, но в отдельных случаях, как например TensorFlow, существует необходимость импорта динамических библиотек. PyInstaller не может найти все библиотеки, или же их может быть слишком много. В таком случае рекомендуется использовать вспомогательный инструмент для импорта из PyInstaller.utils.hooks и собрать все подмодули для библиотеки.

Скомпилируем модель после обновления файла simpleModel.spec.

pyinstaller simpleModel.spec

Скопируем исполняемый файл на рабочий стол и увидим, что теперь он корректно отображает версию TensorFlow.

Вывод:

PyInstaller предлагает несколько вариантов создания простых и сложных исполняемых файлов из Python-скриптов:

  • Исполняемый файл может собрать в один бандл все требуемые данные с помощью параметра --add-data.
  • Исполняемый файл и зависимые данные с библиотеками можно собрать в один файл или папку с помощью --onefile или --onedir соответственно.
  • Динамические импорты и библиотеки второго уровня можно включить с помощью hidden-imports.
  • Файл spec позволяет создать исполняемый файл для обработки скрытых импортов и других файлов данных с помощью хуков.

Для работы с файловой системой в Python используют модули
os, os.path и shututil, а для операций с файлами – встроенные функции open(), close(), read(), readline(), write() и т. д. Прежде, чем мы перейдем
к примерам использования конкретных методов, отметим один важный момент – корректный формат пути к файлам и каталогам.

Дело в том, что Python считает некорректным стандартный
для Windows формат: если указать путь к файлу в привычном виде 'C:UsersUserPythonletters.py', интерпретатор вернет ошибку. Лучше
всего указывать путь с помощью r-строк
или с экранированием слэшей:

        r'C:UsersUserPythonletters.py'
'C:\Users\User\Python\letters.py'

    

Иногда также путь указывают с обратными слэшами:

        'C:/Users/User/Python/letters.py'

    

Получение информации о файлах и директориях

Метод getcwd() возвращает
путь к текущей рабочей директории в виде строки:

        >>> import os
>>> os.getcwd()
'C:\Users\User\Python'

    

С помощью метода os.listdir() можно получить список всех поддиректорий и файлов текущего рабочего каталога, при этом содержимое вложенных папок не отображается:

        >>> os.listdir()
['Data', 'lambda_functions.py', 'letters.py', 'os_methods.py', 'passw_generator.py', 'points.py', 'population.py']

    

Метод os.walk() возвращает генератор, в котором содержится
вся информация о рабочем каталоге, включая содержимое всех поддиректорий:

        >>> import os
>>> my_cwd = os.getcwd()
>>> result = os.walk(my_cwd)
>>> for i, j, k in result:
    for file in k:
        print(file)
        
lambda_functions.py
letters.py
os_methods.py
passw_generator.py
points.py
population.py
books_to_process.txt
challenge_data.txt
ledger.txt

    

Много полезных методов содержится в модуле os.path. Так можно извлечь имя файла из полного пути:

        >>> os.path.basename(r'C:UsersUserPythonletters.py')
'letters.py'

    

А так можно получить путь к директории / файлу, в который не
включается собственно поддиректория или имя файла:

        >>> os.path.dirname(r'C:UsersUserPythonData')
'C:\Users\User\Python'

    

Метод path.isabs() покажет, является ли
путь абсолютным или относительным:

        >>> os.path.isabs(r'C:UsersUserPythonData')
True
>>> os.path.isabs(r'.PythonData')
False
>>>

    

Метод path.isdir() возвращает True, если переданная в метод директория существует, и False – в противном случае:

        >>> os.path.isdir(r'C:UsersUserPythonDataSamples')
False

    

Для установления факта существования файла служит path.isfile():

        >>> os.path.isfile(r'C:UsersUserPythonmatrix_challenge.py')
False

    

Для преобразования пути в нижний регистр и нормализации слэшей используют path.normcase():

        >>> os.path.normcase('C:/Users/User/Python')
'c:\users\user\python'

    

Хотя путь к файлу (директории) представляет собой строку,
создавать полный путь с помощью конкатенации считается моветоном – нужно
использовать метод os.path.join():

        # Неправильно:
my_cwd = os.getcwd()
file_name = 'my_solution.py'
path = my_cwd + '\' + file_name

# Правильно:
path = os.path.join(my_cwd, file_name)

    

Результат:

        C:UsersUserPythonmy_solution.py
    

Операции с каталогами и файлами в Python

Для создания новых директорий служит os.mkdir(); в метод нужно передать полный путь, включающий название
нового каталога:

        import os
my_cwd = os.getcwd()
new_dir = 'Solutions'
path = os.path.join(my_cwd, new_dir)
os.mkdir(path)
print(os.listdir())

    

Результат:

        ['Data', 'lambda_functions.py', 'letters.py', 'os_methods.py', 'passw_generator.py', 'points.py', 'population.py', 'Solutions']

    

Изменить рабочую директорию можно с помощью метода os.chdir(), это аналог CLI команды cd:

        >>> import os
>>> os.getcwd()
'C:\Users\User\Python'
>>> os.chdir(r'C:UsersUserPythonData')
>>> os.getcwd()
'C:\Users\User\Python\Data'

    

Использование os.chdir()
может привести к ошибке, если путь к переданной в метод директории указан
неправильно или не существует. Поэтому этот метод стоит использовать только с
обработкой ошибок:

        import sys, os

my_cwd = os.getcwd()
new_cwd = r'C:UsersUserPythonMyData'

try:
    os.chdir(new_cwd)
    print(f'Изменяем рабочую директорию на {os.getcwd()}')
except:
    print(f'Произошла ошибка {sys.exc_info()}')
finally:
    print('Восстанавливаем рабочую директорию на прежнюю')
    os.chdir(my_cwd)
    print(f'Текущая рабочая директория - {os.getcwd()}')

    

Вывод:

        Произошла ошибка (<class 'FileNotFoundError'>, FileNotFoundError(2, 'Не удается найти указанный файл'), <traceback object at 0x024E9828>)
Восстанавливаем рабочую директорию на прежнюю
Текущая рабочая директория - C:UsersUserPython

    

Создание директорий в Python

Для создания новых каталогов используют два метода:

  • os.mkdir() – аналог CLI команды mkdir; создает новую папку по указанному пути, при условии, что все указанные промежуточные (вложенные) директории уже существуют.
  • os.makedirs() – аналог CLI команды mkdir -p dir1dir2; помимо создания целевой папки, создает все промежуточные директории, если они не существуют.

Пример использования os.mkdir():

        import os
new_dir = 'NewProjects'
parent_dir = r 'C:UsersUserPython'
path = os.path.join(parent_dir, new_dir)
os.mkdir(path)
print(f'Директория {new_dir} создана: {os.listdir()}')

    

Результат:

        Директория NewProjects создана: ['Data', 'lambda_functions.py', 'letters.py', 'NewProjects', 'os_methods.py', 'Other', 'passw_generator.py', 'points.py', 'population.py', 'Solutions']

    

Пример использования makedirs():

        import os
new_dir = 'Django'
parent_dir = r'C:UsersUserPythonOtherProjectsModules'
path = os.path.join(parent_dir, new_dir)
os.makedirs(path)
print(f'Директория {new_dir} создана по адресу {os.path.dirname(path)}')

    

Результат:

        Директория Django создана по адресу C:UsersUserPythonOtherProjectsModules

    

Копирование файлов и директорий в Python

Для копирования файлов используют метод shutil.copy2(), который принимает два аргумента
– источник файла и директорию, в которую нужно скопировать файл:

        import os
import shutil
dest_path = r'C:UsersUserPythonData'
source_path = r'C:UsersUserlambda_exp.txt'
print(f'Файлы в директории {os.path.basename(dest_path)} до копирования файла 
{os.path.basename(source_path)}: {os.listdir(dest_path)}n')
copy_file = shutil.copy2(source_path, dest_path)
print(f'Файлы в директории {os.path.basename(dest_path)} после копирования файла 
{os.path.basename(source_path)}: {os.listdir(dest_path)}')

    

Вывод:

        Файлы в директории Data до копирования файла lambda_exp.txt: ['books_to_process.txt', 'challenge_data.txt', 'ledger.txt']
Файлы в директории Data после копирования файла lambda_exp.txt: ['books_to_process.txt', 'challenge_data.txt', 'lambda_exp.txt', 'ledger.txt']

    

Помимо метода shutil.copy2(),
для копирования файлов можно пользоваться методом shutil.copy(). Разница между
этими двумя методами в том, что в отличие от shutil.copy2(),
метод shutil.copy() копирует только
содержимое файла, но не метаданные:

        import os
import shutil
dest_path = r'C:UsersUserPythonData'
source_path = r'C:UsersUserlogfile.txt'
print(f'Файлы в директории {os.path.basename(dest_path)} до копирования файла 
{os.path.basename(source_path)}: {os.listdir(dest_path)}n')
print(f'Метаданные: {os.stat(source_path)}n')
copy_file = shutil.copy(source_path, dest_path)
print(f'Файлы в директории {os.path.basename(dest_path)} после копирования файла 
{os.path.basename(source_path)}: {os.listdir(dest_path)}n')
print(f'Метаданные: {os.stat(dest_path)}n')

    

Вывод:

        Файлы в директории Data до копирования файла logfile.txt: ['books_to_process.txt', 'challenge_data.txt', 'lambda_exp.txt']
Метаданные: os.stat_result(st_mode=33206, st_ino=18014398509552989, st_dev=4236505663, st_nlink=1, st_uid=0, st_gid=0, st_size=455, st_atime=1629682315, st_mtime=1629681887, st_ctime=1629682315)
Файлы в директории Data после копирования файла logfile.txt: ['books_to_process.txt', 'challenge_data.txt', 'lambda_exp.txt', 'logfile.txt']
Метаданные: os.stat_result(st_mode=16895, st_ino=11821949021901021, st_dev=4236505663, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1675257729, st_mtime=1675257729, st_ctime=1675084801)

    

Все содержимое каталога сразу можно скопировать с помощью shutil.copytree():

        import os
import shutil
dest_path = r'C:UsersUserPythonOtherFiles'
source_path = r'C:UsersUserPythonOtherScripts'
print(f'Содержимое директории {os.path.basename(dest_path)} до копирования каталога 
{os.path.basename(source_path)}: {os.listdir(dest_path)}n')
copy_dir = shutil.copytree(source_path, dest_path, dirs_exist_ok=True)
print(f'Содержимое директории {os.path.basename(dest_path)} после копирования 
{os.path.basename(source_path)}: {os.listdir(dest_path)}n')

    

Вывод:

        Содержимое директории Files до копирования каталога Scripts: []
Содержимое директории Files после копирования Scripts: ['progression.py', 'sitemap_generator.py']

    

Перемещение файлов и директорий

Для перемещения файлов используют метод shutil.move():

        import os
import shutil
dest_path = r'C:UsersUserPythonOtherScripts'
source_path = r'C:UsersUserDesktopsitemap_generator.py'
print(f'Содержимое директории {os.path.basename(dest_path)} до копирования каталога 
{os.path.basename(source_path)}: {os.listdir(dest_path)}n')
copy_dir = shutil.move(source_path, dest_path)
print(f'Содержимое директории {os.path.basename(dest_path)} после копирования 
{os.path.basename(source_path)}: {os.listdir(dest_path)}n')

    

Вывод:

        Содержимое директории Scripts до копирования каталога sitemap_generator.py: ['progression.py', 'wiki_scraping.py']
Содержимое директории Scripts после копирования sitemap_generator.py: ['progression.py', 'sitemap_generator.py', 'wiki_scraping.py']

    

Для перемещения содержимого всей директории в качестве
функции указывают shutil.copytree():

        copy_dir = shutil.move(source_path, dest_path, copy_function = shutil.copytree)
    

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

Для удаления директории вместе со всеми файлами используют shutil.rmtree():

        import os
import shutil
dir_path = r'C:UsersUserPythonOther'
remove_dir = 'Files'
path = os.path.join(dir_path, remove_dir)
print(f'Содержимое директории {os.path.basename(dir_path)} до удаления каталога 
{remove_dir}: {os.listdir(dir_path)}n')
shutil.rmtree(path)
print(f'Содержимое директории {os.path.basename(dir_path)} после удаления 
{remove_dir}: {os.listdir(dir_path)}n')

    

Вывод:

        Содержимое директории Other до удаления каталога Files: ['Files', 'Projects']
Содержимое директории Other после удаления Files: ['Projects']

    

Другой метод для удаления пустых директорий – os.rmdir():

        import os
import shutil
dir_path = r'C:UsersUserPythonOther'
remove_dir = 'Scripts'
path = os.path.join(dir_path, remove_dir)
print(f'Содержимое директории {os.path.basename(dir_path)} до удаления каталога 
{remove_dir}: {os.listdir(dir_path)}n')
os.rmdir(path)
print(f'Содержимое директории {os.path.basename(dir_path)} после удаления 
{remove_dir}: {os.listdir(dir_path)}n')

    

Вывод:

        Содержимое директории Other до удаления каталога Scripts: ['Projects', 'Scripts']
Содержимое директории Other после удаления Scripts: ['Projects']

    

Очевидный минус метода os.rmdir()
в том, что он работает только на пустых директориях – если поместить в каталог Scripts хотя бы один файл,
удалить его с os.rmdir() уже не получится:

        Traceback (most recent call last):
  File "C:UsersUserPythonos_methods.py", line 8, in <module>
    os.rmdir(path)
OSError: [WinError 145] Папка не пуста: 'C:\Users\User\Python\Other\Scripts'

    

Для удаления файлов используют метод os.remove():

        import os
import shutil
dir_path = r'C:UsersUserPythonOtherScripts'
remove_file = 'tetris_game.py'
path = os.path.join(dir_path, remove_file)
print(f'Содержимое директории {os.path.basename(dir_path)} до удаления файла 
{remove_file}: {os.listdir(dir_path)}n')
os.remove(path)
print(f'Содержимое директории {os.path.basename(dir_path)} после удаления 
{remove_file}: {os.listdir(dir_path)}n')

    

Вывод:

        Содержимое директории Scripts до удаления файла tetris_game.py: ['tetris_game.py']
Содержимое директории Scripts после удаления tetris_game.py: []

    

Работа с файлами в Python

Открыть файл для проведения каких-либо манипуляций можно
двумя способами:

  • С помощью функции open() – в этом случае после завершения работы нужно будет закрыть файл с помощью close():
        f = open('task.txt', 'a', encoding='utf-8')
f.write('n2) Написать модуль авторизации')
f.close()

    
  • С использованием менеджера контекста with, который автоматически и самостоятельно закроет файл, когда надобность в нем отпадет:
        with open('task.txt', 'a', encoding='utf-8') as f:
    f.write('n2) Написать модуль авторизации')

    

Типы файлов

В Python все файлы делятся на:

  • Текстовые 't'
  • Бинарные (двоичные) 'b'

Если никакой определенный тип файла не указан, по умолчанию Python считает, что пользователь работает с текстовыми файлами. Поэтому для работы с изображениями, мультимедийными файлами и pdf, например, следует указывать, что тип файла относится к 'b'.

Режимы доступа и записи

‘r’ Открывает файл для чтения. Возвращает ошибку, если указанный файл не существует.
‘w’ Открывает файл для записи, причем перезаписывает содержимое, если оно есть. Создает файл, если он не существует.
‘a’ Открывает файл для записи и добавляет новую информацию, не перезаписывая существующую. Создает файл, если он не существует.
‘w+’ Открывает файл для чтения и записи, перезаписывает содержимое.
‘r+’ Открывает файл для чтения и дополнения, не перезаписывает содержимое.
‘x’ Создает новый пустой файл. Возвращает ошибку, если файл с таким именем уже существует.

Примечание: для операций с двоичными файлами к указанным
параметрам нужно добавлять b,
то есть вместо 'r'
должно быть 'rb', а
вместо 'w+''wb+'.

Методы работы с файлами

Для чтения данных используют read(). Метод read() по умолчанию возвращает все содержимое файла:

        with open('books.txt', 'r', encoding='utf-8') as f:
    info = f.read()
print(info)

    

Вывод:

        1. "Террор", Дэн Симмонс
2. "Она же Грейс", Маргарет Этвуд
3. "Облачный атлас", Дэвид Митчелл
4. "Искупление", Иэн Макьюэн
5. "Госпожа Бовари", Гюстав Флобер

    

При необходимости объем выводимой информации можно ограничить
определенным количеством символов:

        with open('movies.txt', 'r', encoding='utf-8') as f:
    info = f.read(15)
print(info)

    

Вывод:

        1. "Из машины"
    

Метод readline()
позволяет считывать информацию из текстовых файлов построчно:

        with open('books.txt', 'r', encoding='utf-8') as f:
    info = f.readline()
print(info)

    

Вывод:

        1. "Террор", Дэн Симмонс
    

Для получения всех строк файла используют метод readlines(),
который возвращает содержимое в виде списка – вместе со всеми спецсимволами:

        with open('books.txt', 'r', encoding='utf-8') as f:
    info = f.readlines()
print(info)

    

Вывод:

        ['1. "Террор", Дэн Симмонсn', '2. "Она же Грейс", Маргарет Этвудn', '3. "Облачный атлас", Дэвид Митчеллn', '4. "Искупление", Иэн Макьюэнn', '5. "Госпожа Бовари", Гюстав Флобер']
    

Чтобы избавиться от лишних пробелов, символа новой строки (и любых других
спецсимволов), используют методы rstrip(), lstrip()
или strip():

        with open('books.txt', 'r', encoding='utf-8-sig') as f:
    info = [line.strip() for line in f.readlines()]
print(info)

    

Вывод:

        ['1. "Террор", Дэн Симмонс', '2. "Она же Грейс", Маргарет Этвуд', '3. "Облачный атлас", Дэвид Митчелл', '4. "Искупление", Иэн Макьюэн', '5. "Госпожа Бовари", Гюстав Флобер']
    

Для записи информации в файл используют метод write():

        with open('books.txt', 'a', encoding='utf-8') as f:
    f.write('n6. "Война и мир", Лев Толстойn')

    

Или writelines():

        with open('books.txt', 'a', encoding='utf-8') as f:
    f.writelines(['7. "Преступление и наказание", Федор Достоевскийn',
                 '8. "Мизери", Стивен Кингn',
                  '9. "Джейн Эйр", Шарлотта Бронтеn'])

    

Кроме того, записывать данные в файл можно с помощью print():

        with open('crm_log.txt', 'a', encoding='utf-8') as file:
    print('nСергей Леонов, 11:18, 12:23', file=file)
    

Чтобы узнать текущую позицию курсора в файле, используют метод tell():

        with open('books.txt', 'r', encoding='utf-8-sig') as f:
    f.readline()
    f.read(5)
    print(f.tell())

    

Вывод:

        51
    

Для считывания данных из определенной позиции используют seek():

        with open('movies.txt', 'r', encoding='utf-8') as f:
    f.seek(53)
    print(f.read())

    

Вывод:

        3. "Дракула Брэма Стокера"
    

Практика

Задание 1

Имеется файл books.txt, содержащий следующую
информацию:

        1. "Террор", Дэн Симмонс
2. "Она же Грейс", Маргарет Этвуд
3. "Облачный атлас", Дэвид Митчелл
4. "Искупление", Иэн Макьюэн
5. "Госпожа Бовари", Гюстав Флобер
6. "Война и мир", Лев Толстой
7. "Преступление и наказание", Федор Достоевский
8. "Мизери", Стивен Кинг
9. "Джейн Эйр", Шарлотта Бронте

    

Напишите программу, которая выводит первые 3 строки файла.

Решение:

        with open('books.txt', 'r', encoding='utf-8') as file:
    for i in range(3):
        line = file.readline().strip()
        print(line)

    

Задание 2

Напишите программу, которая получает от пользователя имя
файла и возвращает следующие данные о его содержимом:

  • количество строк;
  • количество слов;
  • число символов без пробелов и точек.

Пример ввода:

        series.txt
    

Содержимое файла:

        1. Последнее королевство 2015
2. Рим 2005
3. Версаль 2015
4. Тюдоры 2007
5. Террор 2018
6. Человек в высоком замке 2015
7. Белая королева 2013
8. Братья по оружию 2001
9. Медичи 2016
10. Спартак 2010

    

Вывод:

        Количество строк в файле series.txt: 10
Количество слов: 17
Число символов: 153

    

Решение:

        filename = input()
lines, words, symbols = 0, 0, 0
with open(filename, 'r', encoding='utf-8') as file:
    for i in file:
        lines += 1
        words += len([w for w in i.split() if w.isalpha()])
        symbols += len([s for s in i if s.isalnum()])
print(f'Количество строк в файле {filename}: {lines}n'
      f'Количество слов: {words}n'
      f'Число символов: {symbols}n'
     )

    

Задание 3

Напишите программу, которая находит самое длинное слово в
списке книг из первого задания.

Ожидаемый результат:

        Преступление
    

Решение:

        with open('books.txt', 'r', encoding='utf-8') as file:
    words = file.read().replace('"', '').split()
    result = [w for w in words if len(w) == len(max(words, key=len))]
 
print(*result)  

    

Задание 4

Имеется файл fruit.txt со
следующим содержимым:

        Апельсин маракуйя папайя айва Яблоко
апельсин яблоко ананас банан персик Слива
Банан груша слива виноград авокадо Цитрон
Слива Груша яблоко мандарин цитрон
лимон Лайм апельсин ананас персик айва 
Хурма киви хурма манго авокадо лайм
Нектарин Инжир гранат Папайя Гранат

    

Напишите программу, которая подсчитывает, сколько раз
название каждого фрукта встречается в тексте.

Вывод:

        Названия этих фруктов встречаются в тексте:
"апельсин" - 3 раз(а)
"маракуйя" - 1 раз(а)
"папайя" - 2 раз(а)
"айва" - 2 раз(а)
"яблоко" - 3 раз(а)
"ананас" - 2 раз(а)
"банан" - 2 раз(а)
"персик" - 2 раз(а)
"слива" - 3 раз(а)
"груша" - 2 раз(а)
"виноград" - 1 раз(а)
"авокадо" - 2 раз(а)
"цитрон" - 2 раз(а)
"мандарин" - 1 раз(а)
"лимон" - 1 раз(а)
"лайм" - 2 раз(а)
"хурма" - 2 раз(а)
"киви" - 1 раз(а)
"манго" - 1 раз(а)
"нектарин" - 1 раз(а)
"инжир" - 1 раз(а)
"гранат" - 2 раз(а)
    

Решение:

        with open('fruit.txt', 'r', encoding='utf-8') as file:
    result = {}
    for line in file:
        words = line.strip().lower().split()
        for w in words:
            result[w] = result.get(w, 0) + 1
print(f'Названия этих фруктов встречаются в тексте:')
for k, v in result.items():
    print(f'"{k}" - {v} раз(а)'
    

Задание 5

Имеются два файла, first.txt и second.txt. В первом файле
перечислены имена, во втором – должности:

Содержимое файла first.txt

        Сергей Ковалев
Ирина Егорова
Никита Степанов
Марина Арефьева
Кирилл Евстегнеев
Елена Моисеева

    

Файл second.txt

        мидл разработчик
девопс
тимлид
сеньор разработчик
продакт-менеджер
дизайнер

    

Напишите программу, которая открывает оба файла и выводит
сведения о сотрудниках в следующем формате:

        Сотрудник Сергей Ковалев, должность - мидл разработчик
Сотрудник Ирина Егорова, должность - девопс
Сотрудник Никита Степанов, должность - тимлид
Сотрудник Марина Арефьева, должность - сеньор разработчик
Сотрудник Кирилл Евстегнеев, должность - продакт-менеджер
Сотрудник Елена Моисеева, должность – дизайнер

    

Решение:

        with open('first.txt', 'r', encoding='utf-8') as file1, 
open('second.txt', 'r', encoding='utf-8') as file2:
    for line_x, line_y in zip(file1, file2):
        print(f'Сотрудник {line_x.strip()}, должность - {line_y.strip()}')

    

Задание 6

Напишите программу, которая:

  • генерирует коды букв русского алфавита от а до я;
  • вставляет в полученный список код ё;
  • записывает полный алфавит (строчный и прописной варианты каждой буквы) в столбик в файл alphabet.txt.

Содержимое файла после выполнения программы:

        Аа
Бб
Вв
Гг
Дд
Ее
Ёё
Жж
Зз
Ии
Йй
Кк
Лл
Мм
Нн
Оо
Пп
Рр
Сс
Тт
Уу
Фф
Хх
Цц
Чч
Шш
Щщ
Ъъ
Ыы
Ьь
Ээ
Юю
Яя

    

Решение:

        alpha = [i for i in range(ord('а'), ord('я') + 1)]
alpha.insert(6, 1105)
with open('alphabet.txt', 'w', encoding='utf-8') as file:
    for i in alpha:
        file.write(chr(i).upper() + chr(i) + 'n')

    

Задание 7

Сведения о доходах и расходах компании хранятся в двух
файлах, income.txt и
outcome.txt. Напишите программу для
подсчета прибыли компании.

Пример файла income.txt:

        RUB100000
RUB200000
RUB200000
RUB500000
RUB600000
RUB100000
RUB700000

    

Пример файла outcome.txt:

        -RUB1000
-RUB2000
-RUB50000
-RUB200000
-RUB10000
-RUB5000
-RUB6000
-RUB10000
-RUB19000
-RUB7000

    

Ожидаемый результат:

        Прибыль за прошлый месяц: 2090000 RUB

    

Решение:

        income, outcome = 0, 0
with open('income.txt', 'r', encoding='utf-8') as file1, 
open('outcome.txt', 'r', encoding='utf-8') as file2:
    for line in file1:
        num = line.strip()[3:]
        income += int(num)

    for line in file2:
        num = line.strip()[4:]
        outcome += int(num)
print(f'Прибыль за прошлый месяц: {income - outcome} RUB')    

    

Задание 8

Напишите программу, которая считывает сведения об
успеваемости по основным предметам из файла grades.txt,
и определяет, кто из студентов имеет средний балл >= 4.5.

Пример файла grades.txt:

        Арефьева И. 5 5 4 4
Богданов С. 5 5 3 4
Гаврилов Е. 4 4 3 3
Егорова А.  3 3 3 4
Семенова Е. 4 3 3 4
Хворостов И. 5 4 5 5

    

Ожидаемый результат:

        Арефьева И., средний балл: 4.50
Хворостов И., средний балл: 4.75

    

Решение:

        result = {}
with open('grades.txt', 'r', encoding='utf-8') as file1:
    for line in file1:
        l = line.strip().split()
        grades = [int(i) for i in l[-4:]]
        aver_grade = sum(grades) / len(grades)
        if aver_grade >= 4.5:
            result[l[0] + ' ' + l[1]] = aver_grade
for student, aver_grade in result.items():
    print(f'{student}, средний балл: {aver_grade:.2f}')  

    

Задание 9

Напишите программу, которая получает от пользователя
название файла с информацией на русском языке, и выполняет транслитерацию
текста в соответствии с приведенным ниже словарем. Результат нужно записать в
файл result.txt.

Словарь:

        translit = {'а': 'a', 'к': 'k', 'х': 'h', 'б': 'b', 'л': 'l', 'ц': 'c', 'в': 'v', 'м': 'm', 'ч': 'ch', 'г': 'g', 'н': 'n',
     'ш': 'sh', 'д': 'd', 'о': 'o', 'щ': 'shh', 'е': 'e', 'п': 'p', 'ъ': '*', 'ё': 'jo', 'р': 'r', 'ы': 'y', 'ж': 'zh',
     'с': 's', 'ь': "'", 'з': 'z', 'т': 't', 'э': 'je', 'и': 'i', 'у': 'u', 'ю': 'ju', 'й': 'j', 'ф': 'f', 'я': 'ya',
     'А': 'A', 'К': 'K', 'Х': 'H', 'Б': 'B', 'Л': 'L', 'Ц': 'C', 'В': 'V', 'М': 'M', 'Ч': 'Ch', 'Г': 'G', 'Н': 'N',
     'Ш': 'Sh', 'Д': 'D', 'О': 'O', 'Щ': 'Shh', 'Е': 'E', 'П': 'P', 'Ъ': '*', 'Ё': 'Jo', 'Р': 'R', 'Ы': 'Y', 'Ж': 'Zh',
     'С': 'S', 'Ь': "'", 'З': 'Z', 'Т': 'T', 'Э': 'Je', 'И': 'I', 'У': 'U', 'Ю': 'Ju', 'Й': 'J', 'Ф': 'F', 'Я': 'Ya'}

    

Пример русского текста:

        Python — это язык программирования, который широко используется в интернет-приложениях, разработке программного обеспечения, науке о данных и машинном обучении (ML). Разработчики используют Python, потому что он эффективен, прост в изучении и работает на разных платформах.

    

Ожидаемое содержимое result.txt:

        Python — jeto yazyk programmirovaniya, kotoryj shiroko ispol'zuetsya v internet-prilozheniyah, razrabotke programmnogo obespecheniya, nauke o dannyh i mashinnom obuchenii (ML). Razrabotchiki ispol'zujut Python, potomu chto on jeffektiven, prost v izuchenii i rabotaet na raznyh platformah.

    

Решение:

        translit = {'а': 'a', 'к': 'k', 'х': 'h', 'б': 'b', 'л': 'l', 'ц': 'c', 'в': 'v', 'м': 'm', 'ч': 'ch', 'г': 'g', 'н': 'n',
     'ш': 'sh', 'д': 'd', 'о': 'o', 'щ': 'shh', 'е': 'e', 'п': 'p', 'ъ': '*', 'ё': 'jo', 'р': 'r', 'ы': 'y', 'ж': 'zh',
     'с': 's', 'ь': "'", 'з': 'z', 'т': 't', 'э': 'je', 'и': 'i', 'у': 'u', 'ю': 'ju', 'й': 'j', 'ф': 'f', 'я': 'ya',
     'А': 'A', 'К': 'K', 'Х': 'H', 'Б': 'B', 'Л': 'L', 'Ц': 'C', 'В': 'V', 'М': 'M', 'Ч': 'Ch', 'Г': 'G', 'Н': 'N',
     'Ш': 'Sh', 'Д': 'D', 'О': 'O', 'Щ': 'Shh', 'Е': 'E', 'П': 'P', 'Ъ': '*', 'Ё': 'Jo', 'Р': 'R', 'Ы': 'Y', 'Ж': 'Zh',
     'С': 'S', 'Ь': "'", 'З': 'Z', 'Т': 'T', 'Э': 'Je', 'И': 'I', 'У': 'U', 'Ю': 'Ju', 'Й': 'J', 'Ф': 'F', 'Я': 'Ya'}
filename = input()
with open(filename, 'r', encoding='utf-8') as source, open('result.txt', 'w', encoding='utf-8') as tr_result:
    for l in source.read():
        trans = translit.get(l.lower(), l)
        tr_result.write(trans if l.islower() else trans.capitalize())

    

Задание 10

Имеется лог-файл crm_log.txt с
информацией о времени входа пользователей в CRM-систему и о времени выхода. Напишите программу, которая
определяет пользователей, работавших в системе более 4 часов, и записывает их
имена и фамилии в файл best_employees.txt.

Пример лога crm_log.txt:

        Егор Тимофеев, 09:10, 16:50
Марина Абрамова, 12:00, 15:59
Никита Круглов, 09:10, 12:45
Анна Семенова, 08:10, 12:30
Юлия Сафонова, 10:10, 10:50
Михаил Колесников, 11:10, 12:10

    

Ожидаемый результат в файле best_employees.txt:

        Егор Тимофеев
Анна Семенова

    

Решение:

        with open('crm_log.txt', encoding='utf-8') as file_input, 
     open('best_employees.txt', 'w', encoding='utf-8') as file_output:

    for line in file_input:
        start, end = [int(h) * 60 + int(m) for t in line.split(', ')[1:] for h, m in [t.split(':')]]
        if end - start > 240:
            file_output.write(line.split(', ')[0] + 'n')

    

Подведем итоги

Python
предоставляет множество простых и удобных методов для работы с файловой
системой и файлами. С помощью этих методов можно легко:

  • Получать любую информацию о файлах и директориях.
  • Создавать, изменять, перемещать и удалять директории и файлы.
  • Проводить любые операции с содержимым текстовых и двоичных файлов.

В следующей статье будем изучать регулярные выражения.

***

Содержание самоучителя

  1. Особенности, сферы применения, установка, онлайн IDE
  2. Все, что нужно для изучения Python с нуля – книги, сайты, каналы и курсы
  3. Типы данных: преобразование и базовые операции
  4. Методы работы со строками
  5. Методы работы со списками и списковыми включениями
  6. Методы работы со словарями и генераторами словарей
  7. Методы работы с кортежами
  8. Методы работы со множествами
  9. Особенности цикла for
  10. Условный цикл while
  11. Функции с позиционными и именованными аргументами
  12. Анонимные функции
  13. Рекурсивные функции
  14. Функции высшего порядка, замыкания и декораторы
  15. Методы работы с файлами и файловой системой

***

Все курсы > Программирование на Питоне > Занятие 13

Сегодня мы сделаем шаг назад и посмотрим в целом, что такое программа на Питоне.

Способ 1. Писать код в облаке в Google Colab.

Способ 2. Написать программу в отдельном файле (скрипте) с расширением .py и передать этот код специальному интерпретатору для исполнения.

Способ 3. Установить Jupyter Notebook (локальный аналог Google Colab).

программа на Питоне, способы исполнения кода

С первым способом мы уже познакомились в рамках вводного курса. Сегодня мы займемся написанием программы в отдельном файле, а в следующий раз — изучим Jupyter Notebook.

Кроме того, мы рассмотрим возможности по созданию собственных модулей и пакетов в Питоне.

Установка Питона на Windows

Прежде чем мы начнем писать программу, нам нужно установить библиотеки (libraries) и интерпретатор (interpreter) для обработки кода.

Шаг 1. Проверить, установлен ли Питон на вашем компьютере

Для этого вначале нажмите клавишу Windows и клавишу R на клавиатуре.

клавиши Windows + R

В появившемся окне «Выполнить» введите
cmd и нажмите Enter.

окно "Выполнить" в Windows

Появится так называемая «командная строка» (Command Line Promt) — отдельная программа, позволяющая взаимодействовать с Windows не графически (как мы привыкли делать), а через текстовые команды.

командная строка (Command Line Promt)

Теперь введите
python —version. Если Питон установлен, то программа сообщит текущую версию. В противном случае появится вот такая запись.

проверка, установлен ли Питон

Если Питон не установлен, переходите к шагу 2. В случае если вы его уже установили, переходите сразу к шагу 3.

Шаг 2. Скачать Питон с официального сайта

Перейдем на сайт www.python.org/dowloads/⧉ и скачаем, среди прочего, базовый функционал Питона, а также интерпретатор для Windows, который позволит нам исполнять написанный нами код.

скачивание Питона с официального сайта

После скачивания и запуска файла откроется мастер установки.

добавление Питона в переменную PATH

Нижняя галочка добавит Питон в переменную окружения PATH. Благодаря этому мы сможем исполнять код на Питоне напрямую из командной строки. Мы разберем как это делается уже на следующем шаге.

Снова проверим установку Питона на компьютере, повторив действия Шага 1. В командной строке должна появиться установленная на данный момент версия Питона.

проверка версии Питона

Шаг 3. Запустить Питон из командной строки

Теперь давайте введем в командной строке команду
py. Должны появиться символы
>>>.

запуск Питона из командной строки

Это значит, что командная строка перешла в интерактивный режим, и мы можем писать код на Питоне.

Напишем классическую фразу:

При корректном исполнении кода фраза будет выведена на экран.

написание и исполнение кода на Питоне в интерактивном режиме

Однако, как вы помните, наша задача — исполнить не отдельную команду, а скрипт, то есть целую программу на Питоне, а для этого нам нужно эту программу создать.

Поэтому выйдем из интерактивного режима с помощью команды
quit() или
exit(), закроем окно командной строки и перейдем к созданию программы на Питоне.

Создание программы на Питоне

Технически для создания программы нам понадобится редактор кода. В нем мы будем создавать файлы с расширением .py и передавать их интерпретатору.

Шаг 1. Скачать редактор кода

Редактор кода — это текстовый редактор, который, среди прочего, правильно подсвечивает код на том языке, на котором вы программируете.

В принципе, если вы работаете на Windows, то можете воспользоваться и «Блокнотом» (Notepad), который уже установлен в этой операционной системе (MS Word использовать не стоит). Достаточно написать в нем код, сохранить файл и изменить расширение с .txt на .py.

Если вы не видите расширения файлов, в «Проводнике» нажмите на вкладку «Вид» и поставьте галочку напротив «Расширения имен файлов».

При этом гораздо удобнее писать код в специально предназначенных для этого редакторах. Приведу ссылки на несколько популярных программ.

  • Notepad++⧉
  • Sublime⧉
  • Atom⧉

На сегодняшнем занятии мы будем использовать Atom.

Редактор Atom

После установки и запуска редактора Atom закройте ненужные вкладки и нажмите FileNew File.

Затем, чтобы сообщить редактору, что мы хотим писать код на Питоне, сохраним этот файл с расширением .py. Для этого нажмем FileSave As и сохраним файл, например, под именем script.py на Рабочий стол.

интерфейс редактора Atom

Благодаря расширению .py Atom будет знать, что в файле script.py мы собираемся писать код на Питоне.

Шаг 2. Написать программу на Питоне

Первой программой будет алгоритм линейного поиска (linear search algorithm). Этот алгоритм проверяет наличие числа в массиве путем простого перебора всех значений от первого до последнего.

алгоритм линейного поиска

Напишем такую программу в редакторе Atom и сохраним файл script.py.

# возьмем массив,

arr = [3, 7, 0, 2, 5]

# в котором нам нужно найти число 2

x = 2

# в цикле пройдемся по индексу массива

for i in range(len(arr)):

    # если искомое число находится на этом индексе

    if (arr[i] == x):

        # выведем индекс

        print(i)

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

В результате исполнения этого кода компьютер должен выдать цифру три, потому что искомое число два находится именно под этим индексом. Посмотрим, так ли это.

Шаг 3. Запустить программу из командной строки

Запустим этот код с помощью командной строки.

  1. Откроем командную строку через клавиши Window + R
    cmd. Перейдем на Рабочий стол (напомню, файл script.py мы сохранили именно туда) с помощью команды
    cd Desktop.

Команда cd (change directory) позволяет перейти в другую папку, а Desktop — это Рабочий стол, то есть название той папки, куда мы хотим перейти. В результате командная строка должна выглядеть вот так:

смена папки в командной строке

  1. Теперь просто введите script.py. Так мы вызовем интерпретатор и исполним код.

исполнение программы на Питоне в командной строке

Все, наша первая программа на Питоне готова.

Установка библиотек

Как уже было сказано, по умолчанию, с сайта www.python.org устанавливается лишь базовый функционал. Если мы хотим использовать, например, библиотеку Numpy или библиотеку Matplotlib нам нужно установить их отдельно. В этом нам поможет программа pip.

Программа pip

pip — это программа, которая помогает устанавливать (обновлять и удалять) дополнительные библиотеки на вашем компьютере. По сути эта программа связывается с репозиторием (хранилищем) пакетов/библиотек Python Package Index или PyPI (pypi.org⧉) и скачивает запрашиваемые файлы.

Все действия осуществляются из командной строки.

Если вы устанавливали Питон в соответствии с приведенной выше инструкцией, то pip уже присутствует на вашем компьютере. Проверить это можно с помощью команды
pip —version.

проверка версии программы pip

Кроме того, мы можем посмотреть на список всех установленных на компьютере библиотек через команду
pip list.

список установленных библиотек Питона

Установка библиотеки Numpy через pip install

Установим библиотеку Numpy. Для этого введем в командной строке
pip install numpy.

установка Numpy через pip

Проверить установку отдельного пакета можно с помощью команды
pip show numpy.

проверка версии Numpy

Использование установленной библиотеки

Теперь мы можем использовать установленную библиотеку Numpy внутри командной строки. Вначале перейдем в интерактивный режим с помощью команды py. После этого построчно (каждый раз нажимая Enter) введем следующие команды:

import numpy as np

arr=np.array([1, 2, 3])

type(arr)

использование установленной через pip библиотеки

Как мы видим, в результате исполнения этого кода Питон успешно создал массив Numpy.

Обновление и удаление библиотек

Создатели библиотек периодически вносят в них обновления, и эти обновления полезно скачивать на свой компьютер. Воспользуйтесь следующей командой:
pip install —upgrade numpy.

обновление библиотек через pip

Для удаления пакета введите команду
pip uninstall numpy.

удаление библиотек через pip

В процессе удаления будет нужно нажать Y + Enter для подтверждения операции. Другие библиотеки устанавливаются, обновляются и удаляются точно так же.

Модуль в Питоне

Помимо использования Питона в интерактивном режиме и запуска кода из файла мы можем создавать собственные модули.

Модуль в Питоне — это программа на Питоне (файл с расширением .py), которую мы можем использовать в других программах с помощью команды import.

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

Создание собственного модуля

Наш первый модуль на Питоне будет состоять из двух алгоритмов поиска: линейного и бинарного.

Алгоритм линейного поиска

Алгоритм линейного поиска у нас уже готов. Достаточно «обернуть» его в функцию.

# объявим функцию linear()

def linear(arr, x):

    for i in range(len(arr)):

        if arr[i] == x:

            return i

Теперь перейдем к бинарному поиску.

Алгоритм бинарного поиска

Вначале поговорим о том, что такое бинарный поиск. Представьте, что у вас есть телефонная книга, и вам нужно найти номер телефона определенного человека.

телефонная книга

Если фамилия этого человека начинается с буквы А, то мы довольно быстро найдем его номер, используя уже известный нам алгоритм линейного поиска. А если он Яковлев? Линейному поиску придется перебрать все буквы от А до Я.

Бинарный же поиск действует иначе. Вначале мы открываем книгу посередине, скажем, на букве П.

алгоритм бинарного поиска: поиск по словарю

После этого мы посмотрим, находится ли буква Я в первой или во второй половине книги. Так как Я очевидно находится во второй половине справочника, мы разобьем пополам вторую половину. И снова посмотрим справа искомая буква или слева.

алгоритм бинарного поиска: поиск по словарю 2

Так мы будем действовать до тех пор, пока не найдем нужную нам букву.

Важно, что в случае бинарного поиска элементы всегда упорядочены.

Напишем код такого алгоритма на Питоне, только поиск будем выполнять не по буквам, а по числам.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

# создадим класс BinarySearch

class BinarySearch:

    # метод __init__() пропишем, но оставим пустым

    def __init__(self):

        pass

    # метод .srt() будет сортировать список чисел

    def srt(self, arr):

        # для этого мы используем функцию sorted()

        arr = sorted(arr)

        return arr

    # сам бинарный поиск будет выполняться через метод .check()

    def check(self, arr, x):

        # вначале зададим индексы первого и последнего значений

        # отсортированного списка

        low, high = 0, len(arr)1

        # цикл while будет длиться до тех пор, пока индекс последнего значения

        # больше или равен первому

        while low <= high:

            # найдем индекс среднего значения списка

            mid = low + (high low) // 2

            # если число с этим индексом равно искомому,

            if arr[mid] == x:

                # вернем этот индекс

                return mid

            # если меньше искомого (число «справа» от середины)

            elif arr[mid] < x:

                # новым нижним индексом будет «середина + 1»

                low = mid + 1

            # если больше искомого (число «слева» от середины)

            else:

                # новым верхним индексом будет «середина — 1»

                high = mid 1

        # если число так и не найдено, вернем -1

        mid = 1

        return mid

Хотя это уводит нас в сторону от темы сегодняшнего занятия, поясню код нахождения индекса среднего значения списка.

mid = low + (high low) // 2

На первый взгляд индекс среднего значения можно найти вот так

Однако первый вариант расчета индекса среднего значения позволяет избежать переполнения памяти (overflow) при использовании слишком больших значений.

Также замечу, что мы используем оператор целочисленного деления
//, потому что в Питоне результатом обычного деления является число с плавающей точкой (float). Индекс же таким числом быть не может.

Полностью код для обоих алгоритмов будет выглядеть следующим образом.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

def linear(arr, x):

    for i in range(len(arr)):

        if arr[i] == x:

            return i

class BinarySearch:

    def __init__(self):

        pass

    def srt(self, arr):

        arr = sorted(arr)

        return arr

    def check(self, arr, x):

        low, high = 0, len(arr)1

        while low <= high:

            mid = low + (high low) // 2

            if arr[mid] == x:

                return mid

            elif arr[mid] < x:

                low = mid + 1

            else:

                high = mid 1

        mid = 1

        return mid

Документирование кода с помощью docstrings

До сих пор мы писали комментарии, которые помогали нам разобраться в том, как работает та или иная часть кода. При этом, такие комментарии при исполнении кода полностью пропадают.

Одновременно в Питоне существуют так называемые строки документации (docstrings). Они используются для описания работы функции, метода, класса или модуля. Доступ к ним можно получить через атрибут __doc__ или функцию help().

В чем основные особенности создания docstrings?

  • Docstrings заключаются в тройные одинарные или двойные кавычки
  • Их следует располагать сразу после объявления функции, метода, класса или модуля

Добавим соответствующие docstrings в только что созданный нами модуль и параллельно разберем основные принципы написания документации. Начнем с модуля в целом.

Строки документации для модуля в Питоне

Документация модуля описывает модуль и перечисляет все доступные функции и классы. Например, для модуля mymodule документация могла бы выглядеть следующим образом.

«»»

Модуль для поиска элементов в массиве чисел.

============================================

Classes

——-

BinarySearch

Functions

———

linear

«»»

Строки документации для функции описывают саму функцию, параметры и возвращаемое значение. Напишем документацию к функции linear().

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

def linear(arr, x):

    «»»Выполняет линейный поиск по массиву чисел.

    Parameters

    ———-

    arr : {list, ndarray}

        Массив чисел, по которому выполняется поиск.

    x : int

        Искомое число.

    Returns

    ——-

    i : int

        Индекс искомого числа, если оно присутствует в массиве.

    «»»

    for i in range(len(arr)):

        if arr[i] == x:

            return i

Строк документации для класса описывают сам класс, а также перечисляют доступные атрибуты и методы. Каждый метод внутри класса сопровождается отдельной документацией.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

class BinarySearch:

    «»»Бинарный поиск по массиву чисел.

    «»»

    def __init__(self):

        pass

    def srt(self, arr):

        «»»Сортирует массив чисел в возрастающем порядке.

        Parameters

        ———-

        arr : {list, ndarray}

            Массив для сортировки.

        Returns

        ——-

        arr : {list, ndarray}

            Массив, отсортированный в возрастающем порядке.

        «»»

        arr = sorted(arr)

        return arr

    def check(self, arr, x):

        «»»Проверяет наличие числа в массиве c помощью алгоритма бинарного поиска.

        Parameters

        ———-

        arr : {list, numpy array}

            Массив чисел, по которому выполняется поиск.

        x : int

            Искомое число.

        Returns

        ——-

        mid : int

            Индекс числа в отсортированном по возрастанию массиве чисел.

            Возвращает -1, если число не найдено.

        «»»

        low, high = 0, len(arr)1

        while low <= high:

            mid = low + (high low) // 2

            if arr[mid] == x:

                return mid

            elif arr[mid] < x:

                low = mid + 1

            else:

                high = mid 1

        mid = 1

        return mid

Полностью снабженный документацией модуль выглядит следующим образом.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

«»»

Модуль для поиска элементов в массиве чисел.

============================================

Classes

——-

BinarySearch

Functions

———

linear

«»»

def linear(arr, x):

    «»»Выполняет линейный поиск по массиву чисел.

    Parameters

    ———-

    arr : {list, ndarray}

        Массив чисел, по которому выполняется поиск.

    x : int

        Искомое число.

    Returns

    ——-

    i : int

        Индекс искомого числа, если оно присутствует в массиве.

    «»»

    for i in range(len(arr)):

        if arr[i] == x:

            return i

class BinarySearch:

    «»»Бинарный поиск по массиву чисел.

    «»»

    def __init__(self):

        pass

    def srt(self, arr):

        «»»Сортирует массив чисел в возрастающем порядке.

        Parameters

        ———-

        arr : {list, ndarray}

            Массив для сортировки.

        Returns

        ——-

        arr : {list, ndarray}

            Массив, отсортированный в возрастающем порядке.

        «»»

        arr = sorted(arr)

        return arr

    def check(self, arr, x):

        «»»Проверяет наличие числа в массиве c помощью алгоритма бинарного поиска.

        Parameters

        ———-

        arr : {list, numpy array}

            Массив чисел, по которому выполняется поиск.

        x : int

            Искомое число.

        Returns

        ——-

        mid : int

            Индекс числа в отсортированном по возрастанию массиве чисел.

            Возвращает -1, если число не найдено.

        «»»

        low, high = 0, len(arr)1

        while low <= high:

            mid = low + (high low) // 2

            if arr[mid] == x:

                return mid

            elif arr[mid] < x:

                low = mid + 1

            else:

                high = mid 1

        mid = 1

        return mid

Замечу, что в данном случае мы использовали стиль документирования Numpy (NumPy documentation style). Он используется во многих известных пакетах: NumPy, SciPy, Pandas или, например, Scikit-Learn. При этом существуют и другие стили документирования.

Сохраним этот файл под именем mymodule.py. Все, наш модуль готов. Если у вас не получилось создать этот файл, вы можете скачать его по ссылке ниже.

Создание документации с помощью Pyment

Дополнительно замечу, что шаблон или «каркас» документации можно создать с помощью специального пакета Pyment. Для этого:

  1. Скачайте пакет Pyment через
    pip install pyment
  2. Убедитесь, что командная строка указывает на ту папку, в которой находится ваш модуль mymodule.py (например, на Рабочий стол)
  3. Введите команду
    pyment -w -o numpydoc mymodule.py. В данном случае вы буквально просите pyment создать документацию в стиле Numpy в файле под названием mymodule.py
  4. Откройте файл в редакторе кода и начинайте заполнять шаблон.

Загрузка и импорт модуля в Google Colab

Откроем ноутбук к этому занятию⧉

Давайте подгрузим файл mymodule.py в сессионное хранилище Google Colab.

подгрузка собственного модуля на Питоне в Google Colab

Теперь мы можем работать с этим модулем так, как мы работали с функциями модуля random или классами библиотеки sklearn.

Вначале импортируем функцию linear() из модуля mymodule.

from mymodule import linear

Создадим список, по которому будет выполняться поиск, а также искомое число.

arr = [3, 7, 0, 2, 5]

target = 2

Вызовем функцию linear() и передадим ей список и целевое значение в качестве аргументов.

Теперь возьмем список большего размера и другое целевое значение.

arr = [9, 3, 343, 5, 8, 1, 20111, 32, 11, 6, 4]

target = 9

Импортируем модуль mymodule под псевдонимом mm.

Воспользуемся бинарным поиском. Для этого вначале создадим объект класса BinarySearch и поместим его в переменную src.

Прежде чем выполнить поиск нам необходимо отсортировать список чисел. Вызовем метод .srt() класса BinarySearch.

# передадим методу .srt() список arr для сортировки

sorted_arr = srch.srt(arr)

# посмотрим на результат

sorted_arr

[1, 3, 4, 5, 6, 8, 9, 11, 32, 343, 20111]

Теперь воспользуемся методом .check(), чтобы проверить, присутствует ли в списке число девять.

# напомню, что индекс числа 9 мы будем отсчитывать с нуля

src.check(sorted_arr, target)

В отсортированном списке это число присутствует под индексом шесть.

Просмотр документации модуля

Вначале выведем документацию модуля в целом.

Модуль для поиска элементов в массиве чисел.

============================================

Classes

——-

BinarySearch

Functions

———

linear

Посмотрим на функию linear().

Выполняет линейный поиск по массиву чисел.

    Parameters

    ———-

    arr : {list, ndarray}

        Массив чисел, по которому выполняется поиск.

    x : int

        Искомое число.

    Returns

    ——-

    i : int

        Индекс искомого числа, если оно присутствует в массиве.

И класс BinarySearch.

print(mm.BinarySearch.__doc__)

Бинарный поиск по массиву чисел.

Мы также можем посмотреть документацию отдельного метода внутри класса.

print(mm.BinarySearch.srt.__doc__)

Сортирует массив чисел в возрастающем порядке.

        Parameters

        

        arr : {list, ndarray}

            Массив для сортировки.

        Returns

        

        arr : {list, ndarray}

            Массив, отсортированный в возрастающем порядке.

Напомню, что документацию можно также посмотреть с помощью функции help().

Импорт собственного модуля в командной строке

Модуль в Питоне не обязательно подгружать в Google Colab, его также можно импортировать локально в командной строке.

Когда в интерактивном режиме мы пытаемся импортировать модуль с помощью команды import, Питон начинает искать этот модуль в конкретных папках. Посмотреть, что это за папки можно с помощью встроенного в базовый функционал модуля sys. В интерактивном режиме (команда
py) последовательно введите следующие команды.

содержание переменной sys.path

Обратите внимание, что первой в списке
[»] указана текущая папка.

Если ваш модуль не находится в одной из этих папок, импортировать его не получится. Здесь есть два варианта: либо переместить файл в одну из указанных папок, либо добавить новую папку в переменную path.

Способ 1. Переместить файл в папку из списка

Текущая папка будет иметь адрес, похожий на
C:Usersuser (замените user на имя вашей учетной записи). Введите этот адрес в Проводнике.

ввод адреса в Проводнике на Windows

Переместите туда наш модуль mymodule.py. Теперь войдем в интерактивный режим (команда
py) и импортируем модуль с помощью команды
import. После этого создадим массив, целевую переменную и вызовем функцию linear().

import mymodule

arr = [3, 7, 0, 2, 5]

target = 2

mymodule.linear(arr, target)

импорт модуля на Питоне в интерактивном режиме из командной строки

Как вы видите, мы смогли успешно импортировать наш модуль и использовать необходимую функцию.

Способ 2. Добавить новый путь (папку) в переменную path

Добавим Рабочий стол в список sys.path. Для этого прекрасно подойдет метод .append(), который мы использовали для обычных питоновских списков.

Например, добавим Desktop (Рабочий стол).

добавление папки в переменную sys.path

Не забудьте заменить user на имя пользователя на вашем компьютере, а также обратите внимание на двойные обратные косые черты
в абсолютном пути к папке Desktop.

содержание переменной sys.path после добавления папки

Мы готовы импортировать наш модуль с Рабочего стола. Вернем файл mymodule.py на Рабочий стол, войдем в интерактивный режим (команда
py и последовательно введем код ниже.

import mymodule

arr = [3, 7, 0, 2, 5]

target = 2

mymodule.linear(arr, target)

импорт модуля из добавленной в sys.path папки

Нам снова удалось импортировать необходимую нам функцию linear().

Интерпретация и компиляция

Небольшое отступление от темы занятия. В самом начале мы сказали, что вместе с базовым функционалом Питона мы импортируем еще и интерпретатор. Давайте, разберемся, что это такое.

Как вы помните, компьютер понимает только нули и единицы, но никак не код на Питоне. Перевести понятный человеку язык программирования на машинный можно двумя способами: через компилятор (compiler) и через интерпретатор (interpreter).

Проведем следующую аналогию. Предположим, что у нас есть текст, скажем, на французском языке, и нам нужно понять, что в нем написано.

Компилятор

Первый вариант, отдать текст в бюро переводов. Там выполнят перевод всего документа и вернут текст на русском языке. Если в исходный текст внесут изменения, нам придется вновь заказывать его перевод. Можно сказать, что бюро переводов — это компилятор.

Компилятор берет файл с понятным человеку исходным кодом, переводит его в нули и единицы и сохраняет получившийся машинный код в исполняемом (executable) файле (на Windows — это файл с расширением .exe).

компилятор

После этого мы можем запустить файл .exe и увидеть результат работы программы.

Интерпретатор

Интерпетатор действует иначе. Возвращаясь к аналогии с текстом на французском языке, вместо того чтобы отправлять документ в бюро переводов, мы просим человека, говорящего на этом языке на ходу, с листа передавать нам содержание текста.

интерпретатор

Другими словами, интерпретатор — это программа, которая позволяет обрабатывать код и сразу выдавать результат.

Как следствие, языки делятся на компилируемые и интерпретируемые. Питон относится к интерпретируемым языкам, а, например, С — к компилируемым.

Впрочем, программа на Питоне может быть скомпилирована, например, с помощью пакета PyInstaller.

Кроме того, возможно вы обратили внимание, что когда мы вызывали модуль mymodule в командной строке, то Питон автоматически создал папку под названием __pycache__.pyc. В ней содержится скомпилированный байт-код программы (промежуточный код между Питоном и машинным языком), который ускоряет последующий запуск нашего модуля.

Пакет в Питоне

Поговорим про пакеты. Предположим, что вы создали довольно много полезных функций и классов и хранить их в одном модуле не слишком удобно. Самое время задуматься над созданием собственного пакета (package).

программа на Питоне (скрипт) - модуль - пакет

Примечание. Некоторые пакеты (например, Numpy или Pandas) принято называть библиотеками. При этом с технической точки зрения пакет и библиотека — это одно и то же.

Создание собственного пакета

В качестве упражнения создадим несложный пакет на Питоне и поместим его в тестовый репозиторий TestPyPI. Это своего рода «песочница», в которой можно научиться создавать пакеты перед их загрузкой в «большой» репозиторий PyPI.

Обратите внимание, PyPI и TestPyPI — это разные сайты, для которых требуются разные учетные записи.

Добавлю, что по большей части этот раздел создан на основе примера, приведенного в документации Питона⧉.

Шаг 1. Создание учетной записи

В первую очередь зарегистрируйтесь на сайте https://test.pypi.org/⧉.

Шаг 2. Создание файлов

Теперь создайте пакет example_package (по сути, набор папок и файлов) со следующей структурой.

base/

└── src/

    └── example_package/

        ├── __init__.py

        └── example_module.py

В пакет мы поместим модуль example_module.py. В модуле объявим функцию для возведения числа в квадрат square().

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

«»»

Модуль для выполнения арифметических операций.

============================================

Functions

———

square

«»»

def square(number):

    «»»Возводит число в квадрат.

    Parameters

    ———-      

    number : int

        Возводимое во вторую степень число.

    Returns

    ——-

    int

        Квадрат числа.

    «»»

    return number ** 2

Также создадим пустой файл __init__.py. Он необходим для того, чтобы папка распознавалась именно как питоновский пакет.

Все последующие инструкции в командной строке будут выполняться из папки base/.

Например, если папка base/ находится на Рабочем столе, то перейти в нее можно с помощью команды
cd Desktopbase.

переход в папку base в командной строке

Дополнительные файлы

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

base/

├── LICENSE.txt

├── pyproject.toml

├── README.md

├── setup.py

└── src/

    └── example_package/

        ├── __init__.py

        └── example_module.py

  1. В файл pyproject.toml поместим следующий код:

[build-system]

requires = [«setuptools>=42»]

build-backend = «setuptools.build_meta»

build-system.requires указывает на пакеты, необходимые для создания дистрибутива (то есть готового к распротранению пакета),
build-system.build-backend прописывает, какой объект будет использован для его создания.

  1. В setuptools.py содержится информация о пакете. Там же прописывается, какие файлы следует использовать при создании дистрибутива.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

import setuptools

with open(«README.md», «r», encoding=«utf-8») as fh:

    long_description = fh.read()

setuptools.setup(

    name=«example-package-DmitryMakarov»,

    version=«0.0.1»,

    author=«Dmitry Makarov»,

    author_email=«dm.v.makarov@gmail.com»,

    description=«Simple arithmetic package»,

    long_description=long_description,

    long_description_content_type=«text/markdown»,

    url=«https://github.com»,

    project_urls={

        «Bug Tracker»: «https://github.com»,

    },

    classifiers=[

        «Programming Language :: Python :: 3»,

        «License :: OSI Approved :: MIT License»,

        «Operating System :: OS Independent»,

    ],

    package_dir={«»: «src»},

    packages=setuptools.find_packages(where=«src»),

    python_requires=«>=3.6»,

)

Вначале мы импортируем пакет setuptools. После этого открываем файл README.md и помещаем его содержимое в переменную longdescription.

Затем вызываем функцию setuptools.setup() и передаем ей целый ряд параметров. При создании собственного пакета замените значения следующих параметров:

  • Название пакета (name). Оно должно быть уникальным. Для того чтобы обеспечить уникальность названия, проще всего добавить к нему свой логин на сайте https://test.pypi.org/ в формате «название-пакета-логин».
  • Также вы можете заменить поля author и author_email.

Менять остальные поля, в принципе, не обязательно.

  1. Файл README.md

В файле README.md содержатся описание пакета, примеры и технические детали проекта. Расширение .md указывает на то, что этот файл сохранен в формате markdown и поддерживает форматирование текста.

В документации на сайте www.markdownguide.org⧉ вы найдете рекомендации по использованию языка markdown.

В нашем файле мы напишем следующий текст.

# Тестовый пакет

Файл README.md может содержать описание, примеры и технические детали пакета.

Формат .md (markdown) поддерживает форматирование текста. Например, **полужирный шрифт** или *курсив*. Более полный перечень можно найти по [ссылке](https://guides.github.com/features/mastering-markdown/)

  1. Файл LICENSE.txt

Остается создать файл с лицензией LICENSE.txt. Мы будем использовать лицензию открытого и свободного программного обеспечения MIT (Массачусетского технологического института).

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

MIT License

Copyright (c) 2022 Dmitry Makarov

Permission is hereby granted, free of charge, to any person obtaining a copy

of this software and associated documentation files (the «Software»), to deal

in the Software without restriction, including without limitation the rights

to use, copy, modify, merge, publish, distribute, sublicense, and/or sell

copies of the Software, and to permit persons to whom the Software is

furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all

copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED «AS IS», WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,

FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE

AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER

LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,

OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE

SOFTWARE.

Шаг 3. Создание дистрибутива

Скачаем инструменты, необходимые для создания дистрибутива.

Теперь из папки base/ введите команду
py -m build. После ее выполнения должно появиться уведомление об успешном создании дистрибутива пакета.

создание дистрибутива собственного тестового пакета на Питоне

Сам дистрибутив появится в папке base/.

дистрибутив тестового пакета

Шаг 4. Подгрузка дистрибутива

Скачаем инструмент для подгрузки twine.

И выполним подгрузку посредством следующей команды

py -m twine upload —repository testpypi dist/*

Пароль при вводе отображаться не будет (ни в явном, ни в скрытом виде). Просто введите нужные символы и нажмите Enter.

Должен появиться вот такой результат.

подгрузка собственного пакета на TestPyPI

Как вы видите, подгруженный пакет доступен по адресу: https://test.pypi.org/project/example-package-DmitryMakarov/0.0.1/⧉. Мы создали свой первый пакет.

Установка и использование пакета

Если вы захотите воспользоваться этим пакетом, то в командной строке введите команду, которая представлена на первой странице пакета.

страница тестового пакета на Test.PyPI.org

pip install -i https://test.pypi.org/simple/ example-package-DmitryMakarov==0.0.1

Результат исполнения этой команды вы видите ниже.

установка собственного тестового пакета через pip

Теперь мы можем пользоваться нашим пакетом. В интерактивном режиме (команду py) импортируем модуль example_module из пакета example_package и вызовем функцию square(), передав ей, например, число два.

from example_package import example_module

example_module.square(2)

использование пакета, установленного из TestPyPI

В целом создание «взрослого» пакета на PyPI следует похожей схеме.

Подведем итог

Сегодня мы расширили наше представление о том, как запускать код на Питоне. Если раньше мы использовали только Google Colab, то теперь можем создавать собственные программы, модули и пакеты.

Вопросы для закрепления

Вопрос. Чем программа (скрипт) отличается от модуля?

Посмотреть правильный ответ

Ответ: технически и то, и другое — файл с расширением .py, при этом скрипт не предполагает его использования в других программах, а модуль предназначен именно для этого.

Вопрос. Зачем добавлять Питон в переменнаую окружения PATH в ОС Windows?

Посмотреть правильный ответ

Ответ: мы добавляем Питон в переменную PATH ОС Windows, чтобы в командной строке мы могли исполнять Питон в интерактивном режиме.

Вопрос. Что такое переменная path модуля sys в Питоне?

Посмотреть правильный ответ

Ответ: в переменной path модуля sys указаны те папки компьютера, в которых интерпретатор Питона будет искать файл для его импорта. Эта переменная отличается от переменной PATH в операционной системе.


Ответы на вопросы

Вопрос. Что такое
if __name__ == ‘__main__’:?

Ответ. Перед тем как исполнить код (например, в командной строке), интерпретатор Питона объявляет несколько переменных. Одна из них называется
__name__. Этой переменной присваивается значение __main__. Создадим файл script.py со следующим кодом и запустим его в командной строке.

значение переменной __name__ при исполнении кода напрямую

Теперь создадим еще один файл и назовем его module.py. Если вызвать его напрямую, то разумеется переменная
__name__ также будет иметь значение __main__.

При этом если импортировать файл module.py внутри script.py, то значение переменной
__name__ файла module.py изменится на его название (то есть слово module). Создадим файл module.py со следующим кодом.

Заменим код в файле script.py и исполним его.

import module

print(__name__)

значение переменной __name__ при исполнении импортированного файла

Вероятно, чтобы лучше понять как работает приведенный в ответе код, имеет смысл самостоятельно прописать и исполнить каждый из примеров.

Как мы получили такой результат? Сначала был импортирован код из файла module.py, внутри которого переменной
__name__ было присвоено значение module. Именно это значение мы видим на первой строке вывода. Затем было выведено значение переменной
__name__ файла script.py (то есть __main__).

Теперь давайте изменим код файла module.py.

if __name__ == ‘__main__’:

    print(‘This runs as the main file’)

else:

    print(‘This runs as an imported file’)

(1) Запустим его как основной файл напрямую из командной строки.

if __name__ == '__main__'

(2) Теперь импортируем его в script.py (код файла module.py оставим без изменений).

if __name__ == '__main__' внутри импортированного файла

Как вы видите, в импортированном файле module.py переменная
__name__ не содержит значения __main__, поэтому исполнилось выражение после else. В script.py переменная
__name__ по-прежнему имеет значение __main__.

Зачем может быть нужно такое условие? Если вы пишете код, который в первую очередь предназначен для импорта (то есть модуль), будет разумно не вызывать содержащиеся в нем функции автоматически. В этом случае вызов функций можно заключить в обсуждаемое условие.

Изменим файл module.py.

def foo():

    print(‘This is an imported function’)

if __name__ == ‘__main__’:

    foo()

Теперь внутри script.py вначале просто импортируем файл module.py.

функция с условием if __name__ == '__main__'

При вызове модуля ничего не произошло. Так и должно быть. Для того чтобы вызвать функцию foo() нам нужно обратиться к ней напрямую. Изменим файл script.py и исполним его.

import module

module.foo()

вызов функции с условием if __name__ == '__main__'

На следующем занятии, как мы и планировали, мы посмотрим, как можно исполнять код на Питоне в программе Jupyter Notebook.

Первые шаги¶

Давайте посмотрим, как создать традиционную программу «Hello World» на Python.
Это научит вас писать, сохранять и выполнять программы на Python.

Существует два способа запуска программ на Python: использование интерактивного
приглашения интерпретатора и использование файла с текстом программы. Сейчас мы
увидим, как пользоваться обоими методами.

Использование командной строки интерпретатора¶

Откройте окно терминала (как было описано в главе
Установка) и запустите интерпретатор Python, введя
команду python3 и нажав Enter.

Пользователи Windows могут запустить интерпретатор в командной строке, если
установили переменную PATH надлежащим образом. Чтобы открыть командную
строку в Windows, зайдите в меню «Пуск» и нажмите «Выполнить…». В появившемся
диалоговом окне введите «cmd» и нажмите Enter; теперь у вас будет всё
необходимое для начала работы с python в командной строке DOS.

Если вы используете IDLE, нажмите «Пуск» —> «Программы» —> «Python 3.0» —>
«IDLE (Python GUI)».

Как только вы запустили python3, вы должны увидеть >>> в начале строки,
где вы можете что-то набирать. Это и называется командной строкой
интерпретатора Python
.

Теперь введите print('Hello World') и нажмите клавишу Enter.
В результате должны появиться слова «Hello World».

Вот пример того, что вы можете увидеть на экране, если будете использовать
компьютер с Mac OS X. Информация о версии Python может отличаться в зависимости
от компьютера, но часть, начинающаяся с приглашения (т. е. от >>> и далее)
должна быть одинаковой на всех операционных системах.

$ python3
Python 3.3.0 (default, Oct 22 2012, 12:20:36)
[GCC 4.2.1 Compatible Apple Clang 4.0 ((tags/Apple/clang-421.0.60))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> print('hello world')
hello world
>>>

Обратите внимание, что Python выдаёт результат работы строки немедленно! Вы
только что ввели одиночный «оператор» Python. print используется для
того, чтобы (что неудивительно1) напечатать любое переданное в него
значение. В данном случае мы передали в него текст «Hello World», который и был
напечатан на экране.

Как выйти из командной строки интерпретатора

Если вы используете IDLE или оболочку GNU/Linux или BSD, вы можете выйти из
командной строки интерпретатора нажатием Ctrl-D или введя команду
exit() (примечание: не забудьте написать скобки, «()»), а затем
нажав клавишу Enter. Если вы используете командную строку Windows,
нажмите Ctrl-Z, а затем нажмите клавишу Enter.

Выбор редактора¶

Поскольку мы не можем набирать программу в командной строке интерпретатора
каждый раз, когда нам нужно что-то запустить, нам понадобится сохранять
программы в файлах, чтобы потом иметь возможность запускать их сколько угодно
раз.

Прежде чем приступить к написанию программ на Python в файлах, нам нужен
редактор для работы с файлами программ. Выбор редактора крайне важен.
Подходить к выбору редактора следует так же, как и к выбору личного
автомобиля. Хороший редактор поможет вам легко писать программы на Python,
делая ваше путешествие более комфортным, а также позволяя быстрее и безопаснее
достичь вашей цели.

Одно из самых основных требований — это подсветка синтаксиса, когда
разные элементы программы на Python раскрашены так, чтобы вы могли легко
видеть вашу программу и ход её выполнения.

Если вы не знаете, с чего начать, я бы порекомендовал воспользоваться программой
Komodo Edit, которая
доступна для Windows, Mac OS X и GNU/Linux.

Если вы пользуетесь Windows, Не используйте Блокнот — это плохой выбор,
поскольку он не обладает функцией подсветки синтаксиса, а также не позволяет
автоматически вставлять отступы, что очень важно в нашем случае, как мы увидим
позже. Хорошие редакторы, как Komodo Edit, позволяют делать это автоматически.

Опытные программисты, должно быть, уже используют Vim
или Emacs. Не стоит даже и говорить,
что это два наиболее мощных редактора, и вы только выиграете от их
использования для написания программ на Python. Лично я пользуюсь ими обоими
для большинства своих программ, и даже написал книгу о Vim.
Я настоятельно рекомендую вам решиться и потратить время на изучение Vim или
Emacs, поскольку это будет приносить вам пользу долгие годы. Однако, как я уже
писал выше, новички могут пока просто остановиться на Komodo Edit и
сосредоточиться на изучении Python, а не текстового редактора.

Я повторюсь ещё раз: обязательно выберите подходящий редактор — это сделает
написание программ на Python более простым и занимательным.

Для пользователей Vim

Существует хорошее введение в использование Vim как мощного IDE для Python,
автор — John M Anderson.
Также я рекомендую плагин jedi-vim
и мой собственный конфигурационный файл.

Для пользователей Emacs

Существует хорошее введение в использование Emacs как мощного IDE для Python, автор — Ryan McGuire.
Также я рекомендую Конфигурацию dotemacs от BG.

Использование программных файлов¶

А теперь давайте вернёмся к программированию. Существует такая традиция, что
какой бы язык программирования вы ни начинали учить, первой вашей программой
должна быть программа «Привет, Мир!». Это программа, которая просто выводит
надпись «Привет, Мир!». Как сказал Simon Cozens2, это «традиционное
заклинание богов программирования, которое поможет вам лучше изучить язык».

Запустите выбранный вами редактор, введите следующую программу и сохраните её
под именем helloworld.py .

Если вы пользуетесь Komodo Edit, нажмите «Файл» —> «Новый» —> «Новый файл»,
введите строку:

В Komodo Edit нажмите «Файл» —> «Сохранить» для сохранения файла.

Куда сохранить файл? В любую папку, расположение которой вы знаете. Если вы
не понимаете, что это значит, то создайте новую папку и используйте её для
всех ваших программ на Python:

  • C:py в Windows
  • /tmp/py в GNU/Linux
  • /tmp/py в Mac OS X

Чтобы создать папку, воспользуйтесь командой mkdir в терминале. Например,
mkdir /tmp/py.

Не забывайте указывать расширение файла .py. Например, «file.py«.

В Komodo Edit нажмите «Инструменты» —> «Запуск команды», наберите
python3 helloworld.py и нажмите «Выполнить». Вы должны увидеть вывод,
показанный на скриншоте ниже.

Screenshot of Komodo Edit with the Hello World program

Но всё-таки лучше редактировать программу в Komodo Edit, а запускать в
терминале:

  1. Откройте терминал, как описано в главе Установка.
  2. Перейдите в каталог, в котором вы сохранили файл. Например, cd /tmp/py.
  3. Запустите программу, введя команду python3 helloworld.py.

Вывод программы показан ниже.

$ python3 helloworld.py
Привет, Мир!

Если у вас получился такой же вывод, поздравляю! — вы успешно выполнили вашу
первую программу на Python. Вы только что совершили самый сложный шаг в
обучении программированию, заключающийся в написании своей первой программы!

Если вы получите сообщение об ошибке, введите вышеуказанную программу в
точности
так, как показано здесь, и запустите снова. Обратите внимание, что
Python различает регистр букв, то есть print — это не то же самое, что
Print (обратите внимание на букву p в нижнем регистре в первом случае и
на букву P в верхнем регистре во втором). Также убедитесь, что перед первым
символом в строке нет пробелов или символов табуляции — позже мы увидим,
почему это важно.

Как это работает

Программа на Python состоит из выражений. В нашей первой программе имеется
всего лишь одно выражение. В этом выражении мы вызываем функцию print,
которая просто выводит текст 'Привет, Мир!'. О функциях мы узнаем в
одной из последующих глав, а пока вам достаточно понять,
что всё, что вы укажете в скобках, будет выведено на экран. В данном примере
мы указали 'Привет, Мир!'.

Python никак не обрабатывает комментарии, кроме специального случая в первой
строке. Она называется »строка shebang»; когда первые два символа файла с
программой — #!, за которыми следует путь к некоторой программе, это
указывает вашей Unix-подобной системе, что вашу программу нужно запускать
именно в этом интерпретаторе, когда вы »исполняете» её. Это объясняется
подробно в следующем параграфе. Помните, что вы всегда можете запустить свою
программу на любой платформе, указав интерпретатор напрямую в командной
строке, как например, команда python helloworld.py .

Важно! Вставляйте разумные комментарии в ваши программы, чтобы объяснить некоторые
важные детали вашей программы — это будет полезно для тех, кто будет читать
вашу программу, так как им легче будет понять, что программа делает.
Помните, что таким человеком можете оказаться вы сами через полгода!

Исполнимые программы на Python¶

Это касается только пользователей GNU/Linux и Unix, но пользователям Windows
тоже будет полезно об этом знать.

Каждый раз, когда нам нужно запустить программу на Python, нам приходится в
явном виде запускать python3 foo.py. Но почему бы нам не запускать её точно
так же, как и все другие программы? Этого можно достичь при помощи так
называемого hashbang.

Добавьте строку, указанную ниже, в самое начало вашей программы:

Теперь ваша программа должна выглядеть так:

#!/usr/bin/env python3
print('Привет, Мир!')

Теперь необходимо установить программе атрибут исполнимости, используя команду
chmod, а затем выполнить программу.

Команда chmod здесь используется для изменения режима файла3
добавлением атрибута исполнимости для всех пользователей в системе4.

$ chmod a+x helloworld.py

После этого мы можем запускать программу напрямую, потому что наша операционная
система запустит /usr/bin/env, который, в свою очередь, найдёт Python 3, а
значит, сможет запустить наш файл.

$ ./helloworld.py
Привет, Мир!

Здесь «./» обозначает, что программа находится в текущем каталоге.

Ради интереса можете даже переименовать файл в просто «helloworld» и
запустить его как ./helloworld, и это также сработает, поскольку система
знает, что запускать программу нужно интерпретатором, положение которого
указано в первой строке файла программы.

Но до сих пор мы могли выполнять свою программу только если знали полный путь
к ней. А что, если нам нужно запускать эту программу из любого каталога? Это
можно организовать, расположив свою программу в одном из каталогов,
перечисленных в переменной окружения PATH.

При попытке запуска какой-либо программы система ищет её в каталогах,
перечисленных в переменной окружения PATH, и запускает. Таким образом, мы
можем сделать программу доступной из любого места, скопировав её в один из
каталогов, перечисленных в PATH.

$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/swaroop/bin
$ cp helloworld.py /home/swaroop/bin/helloworld
$ helloworld
Привет, Мир!

Мы можем вывести на экран значение переменной PATH при помощи команды
echo, добавив перед именем переменной символ $, чтобы указать оболочке,
что мы хотим получить значение этой переменной. Мы видим, что
/home/swaroop/bin — один из каталогов в переменной PATH, где swaroop
это имя пользователя, которое я использую в своей системе. В вашей системе,
скорее всего, будет аналогичный каталог для вашего пользователя.

Вы также можете добавить какой-либо каталог к переменной PATH — это можно
сделать, выполнив PATH=$PATH:/home/swaroop/mydir, где
'/home/swaroop/mydir' — это каталог, который я хочу добавить к переменной
PATH.

Этот метод полезен для написания сценариев, которые будут доступны для запуска
в любой момент из любого места. По сути, это равносильно созданию собственных
команд, как cd или любой другой, которые часто используются в терминале
GNU/Linux или приглашении DOS.

Когда речь идёт о Python, слова «программа» или «сценарий (скрипт)» обозначают одно и то же.

Получение помощи¶

Для быстрого получения информации о любой функции или операторе Python служит
встроенная функция help. Это особенно удобно при использовании командной
строки интерпретатора. К примеру, выполните help(print) — это покажет
справку по функции print, которая используется для вывода на экран.

Для выхода из справки нажмите q.

Аналогичным образом можно получить информацию почти о чём угодно в Python.
При помощи функции help() можно даже получить описание самой функции
help!

Если вас интересует информация об операторах, как например, return, их
необходимо указывать в кавычках (например, help('return')), чтобы
Python понял, чего мы хотим.

Резюме¶

Теперь вы умеете с лёгкостью писать, сохранять и запускать программы на Python.

И поскольку сейчас вы уже используете Python, давайте узнаем больше о его
основных принципах.

Понравилась статья? Поделить с друзьями:
  • Как создать ярлык телеграмм на рабочем столе windows 10
  • Как создать ярлык таймера выключения windows 10
  • Как создать ярлык стим на рабочем столе в windows 10
  • Как создать ярлык сон в windows 10 на рабочий стол
  • Как создать ярлык скайпа на рабочем столе windows 10