Относительный путь до файла на 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
'''
Ответы (3 шт):
Можно получить абсолютный путь до каталога, где расположен скрипт и уже с его помощью добиваться работы с относительными путями.
import os
basedir = os.path.abspath(os.getcwd())
Предлагаю в данном случае сохранить путь до каталога с ресурсами, у вас это "wordbooks", который лежит внутри каталога выше уровнем. Способ велосипедистый.
wordbooks_dir = basedir[:-(len(basedir.split('\\')[-1]) + 1)]
Здесь мы из базового пути убираем последний каталог через срез строки. Собственно последующая работа с файлами должна быть такой:
open(f"{wordbooks_dir}/russian_nouns.txt", encoding='utf-8')
Дополнение: Обнаружил некостыльный способ обратиться к родительскому каталогу.
workbooks_dir = os.path.abspath(os.path.join(basedir, '..'))
open(os.path.join(wordbooks_dir, '/russian_nouns.txt', encoding='utf-8')
В питоне есть зарезервированная переменная __file__, в которую записывается путь до загруженного модуля. В данном случае её можно использовать таким образом:
import os
with open(os.path.dirname(os.path.abspath(__file__))
+ "/wordbooks/russian_nouns.txt", "r", encoding='utf-8') as file:
# код
Так Вы сможете вызывать исполняемый файл вашей программы из любой директории.
У меня вышеописанные способы не сработали, нашел универсальней и адаптированней для создания dataframe сразу:
import pandas as pd
import os
directory_path = os.path.dirname(os.path.abspath(__file__))
file_name = pd.read_csv(os.path.join(directory_path, "file_name.csv"))