Относительный путь до файла на Python
Хочу добавить относительный путь в консольную программу на Python. (для возможности портирования на другие ПК). Пишет «No such file or directory». Абсолютный путь работает. Пытался каким-то образом изменить активную директорию, но не смог. »’
def download_fiels(): with open("../wordbooks/russian_nouns.txt", encoding='utf-8') as file: WORD_LIST = [row.strip() for row in file] with open("../wordbooks/russian_pril.txt", encoding='utf-8') as file: QUALITY_LIST = [row.strip() for row in file] with open("../wordbooks/russian_imena.txt", encoding='utf-8') as file: NAME_LIST = [row.strip() for row in file] return WORD_LIST, QUALITY_LIST, NAME_LIST
Отслеживать
задан 5 мар 2022 в 19:59
23 1 1 серебряный знак 5 5 бронзовых знаков
print(os.getcwd()) для отладки. os.chdir(path) чтобы поменять текущий каталог. Я, правда, chdir не люблю.
46. Работа с файлами в Python
В этом и последующих уроках мы подробно разберем работу с файлами при помощи встроенных средств Python. Научимся правильно открывать, закрывать файлы, а так же читать и записывать в них.
Открытие файла
Для начала создадим файл с любым именем, например, file.txt в папке с проектом и откроем его при помощи Python в режиме чтения. Для открытия файла в Python существует функция open() :
f = open('file.txt', 'r')
В нашем примере функция open() принимает два аргумента: путь до файла и режим, в котором открывается файл. Можно так же явно указать, что второй аргумент является именно режимом:
f = open('file.txt', mode='r')
Пока не будем вдаваться в подробности использования второго примера, вместо первого. Вернемся к этому вопросу в подразделе «Кодировка».
Аргумент r означает, что файл будет открыт только в режиме чтения. Далее представлены возможные режимы:
- r – открытие файла для чтение (используется по умолчанию);
- w – открытие файла для записи, при этом все содержимое файла удаляется, а в случае отсутствия файла по указанному пути, он создается;
- x – создание нового файла для записи (если файл уже существовал, то возникнет исключение);
- a – открытие файла для записи, при этом содержимое не удаляется, а новая информация добавляется в конец файла;
- b – открытие файла в бинарном режиме;
- t – открытие файла в текстовом режиме (используется по умолчанию);
- + — открытие файла для чтения и записи.
Перечисленные выше режимы открытия файла можно комбинировать. По умолчанию файл открывается в режиме чтения текста, то есть пример открытия файла в режиме чтения можно было написать проще:
f = open('file.txt')
Отлично, мы открыли файл. Теперь необходимо его прочитать и, например, вывести в консоль. Функция open() возвращает объект класса _io.TextIOWrapper :
f = open(‘file.txt’)
print(type(f)) # =>
Объект класса _io.TextIOWrapper имеет атрибуты name , mode и closed , возвращающие имя файла, режим, в котором он открыт и закрыт ли он, соответственно.
f = open('file.txt')
print(f.name) # => file.txt
print(f.mode) # => r
print(f.closed) # => False
f.close() # закрываем файл
print(f.closed) # => True
Пока мы не изучали ООП (но скоро дойдем до этой темы), поэтому определение атрибутов постараюсь объяснить на примере. Предположим, у нас есть автомобиль (это класс). Автомобилей может быть бесконечное множество: грузовые, легковые и так далее, это объекты. Все автомобили имеют атрибуты: марка, масса, цвет и так далее, это атрибуты класса. Так же все автомобили выполняют какие-то функции: ехать вперед, поворачивать и так далее, это методы класса.
Путь до файла в Python
Мы открыли файл, который расположен в той же директории, что и файл с программой. Такое случается далеко не всегда. В этом подразделе разберемся более подробно с путем до файла в Python.
Чтобы получить абсолютный путь до файла, необходимо подключить библиотеку os . В классе path есть метод abspath() , который возвращает абсолютный путь до файла указанного в аргументе:
import os
print(os.path.abspath('file.txt')) # => C:\Users\User\file.txt
Теперь мы можем открыть файл, используя абсолютный путь (только необходимо заменить слеши \ на / ):
f = open('C:/Users/User/file.txt')
Или использовать спецификатор r , который указывает на использование строки в «сыром» виде (нечто похожее мы встречали в уроке 2.4.):
f = open(r'C:\Users\User\file.txt')
С абсолютными путями разобрались, но как открыть файл, если он расположен в папке на уровень выше или ниже. Если на одном уровне с файлом программы расположена папка, например, folder и необходимый файл находится в ней, то, чтобы открыть файл, следует использовать такой относительный путь:
f = open('folder/file.txt')
Если файл находится выше на одну директорию, то необходимо использовать обозначение « ../ »:
f = open('../file.txt')
Если на два директории выше, то:
f = open('../../file.txt')
Чтение из файла
Теперь от атрибутов перейдем к методам, а именно, методу чтения файла read() , возвращающего объект строкового типа:
f = open('file.txt')
data = f.read()
print(data)
Метод read() без параметров возвращает содержимое всего файла. Если в параметре написать целочисленное число, то будет возвращено указанное количество символов:
f = open('file.txt')
data = f.read(2)
print(data)
На самом деле, прочитать информацию построчно можно и без метода read() , а только с использованием цикл for.
f = open('file.txt')
for line in f:
print(line)
Обратите внимание на то, что между строками есть пустая. Откуда она берется? В переменную line сохраняется строка целиком, вместе с символом переноса строки \n . Второй перенос добавляется функция print() . Можем это исправить:
f = open('file.txt')
for line in f:
print(line, end='')
В следующем уроке узнаем об еще более удобном и надежном способе чтения данных из файла.
Итак, вы открыли файл и прочитали необходимые данные. Теперь необходимо его корректно закрыть. Для этого существует метод close() .
f.close()
Может возникнуть вопрос, почему разработчики языка сделали close() методом, а не функцией, как open() . Предположим, что open() являлся бы методом:
'file.txt'.open()
В таком случае потребовалось бы, чтобы строковый тип содержал методы для открытия файла и других дополнений для строкового типа. Функция open() создает новый объект для работы с ним, такая реализация намного проще:
open('file.txt')
Тогда почему close() является методом, а не функцией, например:
close(f) # f – объект, который был создан функцией open()
Такой способ был бы то же неэффективным, так как в функцию пришлось бы передавать целый объект. Так как каждый созданный функцией open() объект имеет свои атрибуты и поля, намного проще и лучше, чтобы экземпляр имел метод close() .
f = open('file.txt') # открыли файл
f.close() # закрыли файл
Запись в файл
Читать из файла научились. Теперь попробуем записать в файл при помощи встроенных средств Python. Инициализируем переменную str строкой « Hello, World », откроем файл и запишем ее в него при помощи метода write() :
str = "Hello, World"
f = open('file.txt')
f.write(str)
Программа не запустилась. Все правильно, мы же открыли файл для чтения (так как не указали параметр mode ). Исправим это и откроем файл в режиме с записью в конец файла:
str = "Hello, World"
f = open('file.txt', 'a')
f.write(str)
Запустите пару раз программу и посмотрите содержимое файла file.txt . Кстати, метод write() возвращает количество записанных символов:
str = "Hello, World"
f = open('file.txt', 'a')
print(f.write(str)) # => 12
Теперь напишите текст на кириллице, запустите программу и посмотрите результат в файле file.txt :
str = "Привет"
f = open('file.txt', 'a')
f.write(str)
Какие-то кракозябры? Разберемся в следующем разделе.
Кодировка файла в Python
Вернемся к функции open() , которая открывает файл. Если заглянуть в модуль встроенных функций builtins.py и найти там функцию open() , можно увидеть какие параметры принимает эта функция (с первыми двумя мы уже разобрались):
def open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
Чтобы открыть файл в нужной кодировке есть параметр encoding . Теперь откроем наш файл в кодировке UTF-8:
str = "Привет"
f = open('file.txt', 'a', 'utf-8')
f.write(str)
Снова ошибка. Третьим параметром является buffering , в который мы передали аргумент utf-8 . Чтобы это исправить, следует явно указать параметр, в который мы передаем аргумент:
str = "Привет"
f = open('file.txt', 'a', encoding='utf-8')
f.write(str)
Если мы явно указываем параметр, то их порядок не важен:
str = "Привет"
f = open('file.txt', encoding='utf-8', mode='a')
f.write(str)
После окончания работы с файлом, необходимо его закрыть с помощью метода close() :
…
f.write(str)
f.close()
Об аргументах и параметрах мы еще будем говорить в теме «Функции».
В этом уроке разобрались, как открывать файлы в разных режимах в Python, познакомились с абсолютными и относительными путями, научились читать из файла и записывать в него.
В следующем уроке познакомимся с более современным и надежным способом открытия файла, при помощи конструкции with/as , которая гарантирует закрытие файла в любом случае.
Получение абсолютного пути к файлу в Python
Существует множество ситуаций, когда может потребоваться определить абсолютный путь к файлу в Python. Например, у вас есть относительный путь к файлу, такой как «mydir/myfile.txt» , и вы хотите получить полный путь к этому файлу в вашей файловой системе.
Python предоставляет модуль os , который содержит множество функций для работы с операционной системой, включая функции для работы с файловыми путями. В частности, функция os.path.abspath() позволяет получить абсолютный путь к файлу.
Вот пример использования этой функции:
import os relative_path = "mydir/myfile.txt" absolute_path = os.path.abspath(relative_path) print(absolute_path)
В этом примере os.path.abspath() принимает относительный путь к файлу и возвращает его абсолютный путь. В результате выполнения этого кода на экран будет выведен абсолютный путь к файлу myfile.txt в директории mydir .
Обратите внимание, результат выполнения этого кода будет зависеть от операционной системы и текущей рабочей директории. Например, на Windows результат может выглядеть так: «C:/example/cwd/mydir/myfile.txt» .
Таким образом, с помощью модуля os и функции os.path.abspath() можно легко получить абсолютный путь к файлу в Python.
Как задать путь к файлу в Python?
![]()
![]()
Для решения задач, связанных с редактированием или чтением файла, необходимо сообщить интерпретатору Python имя нужного нам файла, а также адрес, по которому этот файл располагается. Существуют разные способы указания пути к файлу в Python: от самого простого, до самого правильного. Давайте выясним, чем эти варианты отличаются и почему простой вариант не годится на роль лучшего!
Самый простой вариант — не самый верный!
Внимание! У этого способа обнаружен недостаток!
Самый простой вариант задания пути выглядит как последовательность директорий, в которых находится файл, с именем самого файла, разделенные знаками слеша:
Пример относительного пути:
path = "Files/info.txt" # в Линуксе, или: path = "Files\info.txt" # в Windows
Где вместо «Files» и «info.txt» Вы напишите названия ваших директорий и имя вашего файла соответственно.
Пример абсолютного пути:
path = "/home/my_comp/Files/info.txt" # для Линукс, или: path = "C:\Python\pythonw.exe\Files\info.txt" # для Windows
Где вместо «C:\Python\pythonw.exe\Files\info.txt», «home/my_comp/Files/» и «info.txt» Вы напишите названия ваших директорий и имя вашего файла соответственно.
Этот вариант рабочий, однако, один существенный недостаток лишил его внимания разработчиков. Проблема заключается в том, что заданные таким способом пути адаптированы только к одному виду операционной системы: к Линукс, либо к Windows, так как в Windows используются обратные слеши «\», а в Линукс — обычные «/». Из-за этого скрипт, показывавший отличные результаты в Windows, начнет жаловаться на отсутствие файлов по прописанному пути в Linux, и наоборот. А с абсолютным путем вообще все сложно: никакого диска «C:» в Линуксе нет. Скрипт опять будет ругаться! Что же делать? Правильно указать путь к файлу!
Указываем путь к файлу правильно!
Внимание! Годный вариант!
Python — умный змей, поэтому в его арсенале, начиная с 3.4 версии появился модуль pathlib, который позволяет вытворять самые приятные вещи с путями к файлу, стоит только импортировать его класс Path:
import pathlib from pathlib import Path
Кстати, если у вас не установлен модуль pathlib, это легко исправить с помощью команды:
pip install pathlib
Задаем относительный путь с помощью Path!
После того, как класс импортирован, мы получаем власть над слешами! Теперь вопрос о прямых и обратных слешах в разных операционных системах ложится на плечи Path. Используя Path, вы можете корректно задать относительный путь, который будет работать в разных системах.

Например, в случае расположения файлов, как на представленном изображении, относительный путь, определяемый в скрипте «main_script.py», сформируется автоматически из перечисленных в скобках составных частей. Pathlib инициализирует новый объект класса Path, содержимым которого станет сформированный для Вашей системы относительный путь (в Windows части пути будут разделены обратными слешами, в Linux — обычными):
import pathlib from pathlib import Path path = Path("files", "info", "docs.txt") ## выведем значение переменной path: print(str(path))
## выведем значение переменной path: files/info/docs.txt
![]()
У нас появился Telegram-канал для изучающих Python! Канал совсем свежий, подпишись одним из первых, ведь вместе «питонить» веселее! Ссылка на канал: «Кодим на Python!»
Задаем абсолютный путь с помощью Path
- cwd() — возвращает путь к рабочей директории
- home() — возвращает путь к домашней директории
Полученную строку, содержащую путь к рабочей или домашней директории, объединим с недостающими участками пути при инициализации объекта класса Path :
Пример 1: с использованием функции cwd():
import pathlib from pathlib import Path #Получаем строку, содержащую путь к рабочей директории: dir_path = pathlib.Path.cwd() # Объединяем полученную строку с недостающими частями пути path = Path(dir_path, 'files','info', 'docs.txt') # выведем значение переменной path: print(str(path))
# выведем значение переменной path: "/home/my_comp/python/files/info/docs.txt"
В данном случае путь к директории имеет вид: dir_path = «/home/my_comp/python», а полный путь к файлу «docs.txt» будет иметь вид: «/home/my_comp/python/files/info/docs.txt».
Представленный выше код можно оптимизировать и записать в одну строку:
import pathlib from pathlib import Path path = Path(pathlib.Path.cwd(), 'files', 'info', 'docs.txt') # значение переменной path: print(str(path))
# значение переменной path: "/home/my_comp/python/files/info/docs.txt"
Пример2: с использованием функции home():
import pathlib from pathlib import Path #Получаем строку, содержащую путь к домашней директории: dir_path = pathlib.Path.home() # Объединяем полученную строку с недостающими частями пути path = Path(dir_path, 'files','info', 'docs.txt') # Выведем значение переменной path: print(str(path))
# Выведем значение переменной path: "/home/my_comp/files/info/docs.txt"
В данном случае путь к директории имеет вид: dir_path = «/home/my_comp», а полный путь к файлу ‘docs.txt’ будет иметь вид: «/home/my_comp/files/info/docs.txt».
Сократим представленный выше код:
import pathlib from pathlib import Path path = Path(pathlib.Path.home(), 'files', 'info', 'docs.txt') # Значение переменной path: print(str(path))
# Значение переменной path: "/home/my_comp/files/info/docs.txt"
Подведем итог: начиная с версии Python 3.4, для задания пути к файлу рекомендуется использовать модуль pathlib с классом Path. Определить путь к рабочей директории можно с помощью функции cwd(), а путь к домашней директории подскажет функция home().
