Работа с путями к файлам и папкам
Модуль os содержит подмодуль os.path , который позволяет работать с путями файлов и папок. Импортировать этот модуль отдельно не нужно, достаточно выполнить import os .
Присоединение одной части пути к другой
Работа с путями к файлам и папкам как с простыми строками чревата множеством ошибок и может создать проблемы при переносе программы между различными операционными системами. Правильный путь объединить две части пути — это использование os.path.join :
>>> import os >>> dirpath = '../books' >>> # Здесь filename - имя файла, а не путь от места запуска программы до него: >>> for filename in os.listdir(dirpath): . # filepath = dirname + filename - сработает неправильно, так как будет не хватать "/" . filepath = os.path.join(dirname, filename) # поставит "/" или "\" за нас . with open(filepath, encoding='utf-8') as fd: . if 'нагваль' in fd.read(): . print('Книга ' + filename + ' об индейцах')
Извлечение имени файла из пути
Функция os.path.split совершает обратное действие — отрезает имя файла или ниже лежащей папки от пути:
>>> import os >>> path = './work/project/version8/final.txt' >>> dirpath, filename = os.path.split(path) >>> print(dirpath) ./work/project/version8 >>> print(filename) final.txt >>> project_dir, version_dir = os.path.split(dirpath) >>> print(project_dir) ./work/project >>> print(version_dir) version8
Извлечение расширения
Кроме того, может пригодиться функция os.path.splitext , котоая отрезает расширение файла:
>>> import os >>> path = './work/project/version12/final.txt' >>> base, ext = os.path.splitext(path) >>> print(base, ext, sep='\n') ./work/project/version12/final .txt
Проверка типа файла
Кроме прочего, модуль os.path содержит функции для проверки существования файла и для определения его типа:
>>> import os >>> path = './kursach/text' >>> if os.path.exists(path): . print(path, 'существует') . if os.path.isfile(path): . print(path, '— это файл') . elif os.path.isdir(path): . print(path, '— это папка') . else: . print(path, '— это ни файл и ни папка') . else: . print(path, 'не существует')
Манипуляции с файлами и папками
Производите все манипуляции с файлами с осторожностью, придерживайтесь правила «семь раз отмерь — один раз отрежь». Не забывайте программно производить все возможные проверки перед выполнением операций.
Создание файла
Нет ничего проще, чем создать пустой файл, достаточно открыть несуществующий файл с флагом ‘x’ :
>>> with open('empty.txt', 'x'): . pass
Конечно, можно было бы использовать флаг ‘w’ , но тогда уже существующий файл был бы стёрт. С флагом ‘x’ open либо создаст новый файл, либо выбросит ошибку.
Создание папки
Для создания новой папки используйте os.mkdir(name) . Эта функция выбросит ошибку, если по указанному пути уже существует файл или папка. Если вам нужно создать сразу несколько вложенных папок, то смотрите функцию os.makedirs(name, exist_ok=False) .
Перемещение и переименование
Для удобной манипуляции с файлами и папками в стандартной библиотеки Python существует специальный модуль shutil . Функция shutil.move(source, destination) позволяет вам переместить любой файл или папку (даже непустую). Обратите внимание, что если destination — это уже существующая папка, то файл/папка будет перемещена внутрь неё, в остальных случаях файл/папка будут скопированы точно по нужному адресу. В случае успеха, функция вернёт новое местоположение файла. Если destination существует и не является папкой, то будет выброшена ошибка.
>>> import shutil >>> source = 'my_poem.txt' >>> destination = 'trash' >>> # Создаем папку назначения >>> os.mkdir(destination) >>> # Перенесем файл внутрь папки >>> path = shutil.move(source, destination) >>> print(path) trash/my_poem.txt >>> # Перенесем файл обратно >>> new_name = 'poem.txt' >>> final_path = shutil.move(path, new_name) >>> print(final_path) poem.txt
Как же переименовать файл? Несмотря на то, что os содержит специальную функцию для переименования, нужно понимать, что в рамках одной файловой системы перемещение и переименование — это одно и то же. Когда вы переименовываете файл, его содержимое не переписывается на носителе в другое место, просто файловая система теперь обозначает его положение другим путём.
Копирование
Скопировать файл можно с помощью функции shutil.copy(source, destination) . Правила расположения копии будут те же, что и при использовании shutil.move , за тем исключением, что если destination существует и не является файлом, то он будет заменён и ошибки это не вызовет.
Скопировать папку для операционной системы сложнее, ведь мы всегда хотим скопировать не только папку, но и её содержимое. Для копирования папок используйте shutil.copytree(source, destination) . Обратите внимание, что для этой функции destination всегда должно быть путём конечного расположения файлов и не может быть уже существующей папкой.
Удаление
Удалить файл можно с помощью функции os.remove , а пустую папку с помощью функции os.rmdir .
А вот для удаления папки с содержимым вновь понадобится shutil . Для удаления такой папки используйте shutil.rmtree .
Будьте осторожны, команды удаления стирают файл, а не перемещают его в корзину, вне зависимости от операционной системы! После такого удаления восстановить файл может быть сложно или вовсе невозможно.
Домашняя работа
- В текущей папке лежат файлы с расширениями .mp3 , .flac и .oga . Создайте папки mp3 , flac , oga и положите туда все файлы с соответствующими расширениями.
- В текущей папке лежит две других папки: vasya и mila , причём в этих папках могут лежать файлы с одинаковыми именами, например vasya/kursovaya.doc и mila/kursovaya.doc . Скопируйте все файлы из этих папок в текущую папку назвав их следующим образом: vasya_kursovaya.doc , mila_test.pdf и т.п.
- В текущей папке лежат файлы следующего вида: S01E01.mkv , S01E02.mkv , S02E01.mkv и т.п., то есть все файлы начинаются с S01 или S02 . Создайте папки S01 и S02 и переложите туда соответствующие файлы.
- В текущей папке лежат файлы вида 2019-03-08.jpg , 2019-04-01.jpg и т.п. Отсортируйте файлы по имени и переименуйте их в 1.jpg , 2.jpg , …, 10.jpg , и т.д.
- В текущей папке лежат две другие папки: video и sub . Создайте новую папку watch_me и переложите туда содержимое указанных папок (сами папки класть не надо).
- В текущей папке лежат файлы типа Nina_Stoletova.jpg , Misha_Perelman.jpg и т.п. Переименуйте их переставив имя и фамилию местами.
- В текущей папке лежит файл list.tsv , в котором с новой строки написаны имена некоторых других файлов этой папки. Создайте папку list и переложите в неё данные файлы.
Для тестирования вашей программы положите в репозиторий файлы и папки с соответствующими именами. Файлы должны быть пустыми, если не указано обратного.
Python как импортировать файл из другой папки
В случаях, когда в программу на Python необходимо импортировать пакет, находящийся в произвольной папке, можно воспользоваться добавлением пути к этой папке в список системных директорий c помощью sys.path.insert :
import sys sys.path.insert(1, 'path') import package_name
Для примера рассмотрим следующую структуру проекта:
project/ web/ app.py lib/ mylib.py
Для импорта mylib.py в app.py :
import sys sys.path.insert(1, '../lib') import mylib
Альтернативным способом является использование sys.path . Например, для добавления родительской папки:
import sys sys.path.append('..') import package_from_parent_dir
python import Импорт включение кода из другого файла — несколько файлов в проекте пример include
![]()
Предположим, что нам надо перенести некий класс (функционал) в другой файл (отдельный), а потом подключить его в главном файле проекта.
Предположим, что вы назвали файл, содержащий, например, этот класс, MainMatrix.py, тогда импортировать его можно так:
from MainMatrix import KtfMatrix
Включение из файловой иерархии — зная путь
Предположим в корне проекта у вас лежит главная папка библиотеки (mathone), а в ней уже подпапки и файлы разных классов в них, добавьте в каждую папку пустой файл (в том числе в корневую папку библиотеки) с именем:
__init__.py

Тогда это будет выглядеть как-то так:
Далее в точке входа в программу или вообще в любом использующем компоненты библиотеки коде (например main.py) мы можем сделать импорт конкретного класса из одного из файлов нашей библиотеки так:
from mathone.Matrix.MainMatrix import KtfMatrix
Или пример использования одним классом библиотеки (модуля/пакета) другого класса (с поднятием на уровень вверх по файловой иерархии [две точки ..] и назначением псевдонима) :
from ..Common.MathCommon import MathCommon as mc
(код из MainMatrix.py использует класс MathCommon из MathCommon .py)
Key Words for FKN + antitotal forum (CS VSU):
- python include file
- python импорт модуля из другой папки
- python автозагрузка классов
- python 3 __init__.py example
- python __init__.py пример использования — понятное объяснение
- python import by path
- python class autoload import from hierarhy
- python Как правильно организовать загрузку собтвенной библиотеки импорт класса файла из другой папки примеры
Импортирование файлов из разных папок в Python
Одной из распространенных проблем, с которой сталкиваются новички в Python, является импортирование функций или классов из файлов, расположенных в разных папках. Рассмотрим типичную ситуацию. Предположим, есть следующая структура папок и файлов:
проект ├── папка1 │ └── файл1.py └── папка2 └── файл2.py
В файле файл1.py определена функция func() , которую необходимо использовать в файл2.py . Первым, что приходит в голову, это попытаться импортировать функцию напрямую:
from проект.папка1.файл1 import func
Однако, это выдаст ошибку, потому что Python не сможет найти указанный модуль. Как же быть?
Правильное импортирование файлов из разных папок
Python использует переменную среды PYTHONPATH для определения, где искать модули для импорта. По умолчанию PYTHONPATH включает в себя текущую директорию (или директорию, откуда был запущен скрипт) и некоторые стандартные директории, где установлен Python.
Для решения проблемы необходимо добавить папку, содержащую нужный модуль, в PYTHONPATH . Если папка проекта является корневой директорией для всех модулей, ее следует добавить в PYTHONPATH .
Это можно сделать двумя способами:
1. Изменение PYTHONPATH
Добавьте путь к папке проекта в переменную среды PYTHONPATH . Это можно сделать в командной строке следующим образом:
export PYTHONPATH=$PYTHONPATH:/путь/к/папке/проекта
После этого Python сможет найти и импортировать модули из этой папки.
2. Добавление пути при помощи sys.path
Можно динамически добавить путь к папке проекта в список путей, где Python ищет модули. Это делается с помощью модуля sys :
import sys sys.path.append('/путь/к/папке/проекта')
Этот код необходимо добавить в начало файла файл2.py , прежде чем попытаться импортировать модуль из файл1.py .
Оба этих способа позволяют Python найти и импортировать модули из любой папки на компьютере. Однако, следует помнить, что изменение PYTHONPATH или sys.path влияет на все последующие операции импорта в текущем сеансе Python. Поэтому следует быть осторожным и избегать добавления путей, которые могут спровоцировать конфликты имен модулей.