Есть программа, которые берет данные из файла.
При запуске программы в консоле требуется ввести имя файла(файл лежит в одной папке с программой). Но при вводе имени выдает ошибку, что такого файла в папке нет. Это решается вводом полного пути до файла (C:\Users….file.dat). Как можно сделать чтобы требовался ввод только имени файла, без пути. (файл лежит в одной папке с программой)
import sys import os
вариант с указанием полного пути:
full_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), filename)
или
full_path = os.path.join(os.path.dirname(os.path.abspath(sys.argv[0])), filename)
вариант с указанием относительного пути:
full_path = os.path.join(os.path.dirname(__file__), filename)
или
full_path = os.path.join(os.path.dirname(sys.argv[0]), filename)
или для Python 3.4+:
from pathlib import Path full_path = Path(sys.argv[0]).parent.joinpath('my_file.txt')
или
full_path = Path(__file__).parent.joinpath('my_file.txt')
или (спасибо @insolor за подсказку):
full_path = Path(sys.argv[0]).parent / 'my_file.txt'
если нужен полный (абсолютный) путь:
full_path = Path(sys.argv[0]).parent.absolute() / 'my_file.txt'
UPDATE: отличия __file__
и sys.argv[0]
:
__file__
— атрибут, указывающий относительный путь к текущему загруженному модулю/скрипту.
sys.argv[0]
— относительный путь к главному скрипту, запущенному в OS.
Пример — создадим два файла:
my1.py (модуль который будет импортироваться из основного модуля):
import sys print('my1.py\t__file__:\t{}'.format(__file__)) print('my1.py\tsys.argv[0]:\t{}'.format(sys.argv[0]))
m2.py (основной скрипт, который мы запускаем):
import sys import my1 print('my2.py\t__file__:\t{}'.format(__file__)) print('my2.py\tsys.argv[0]:\t{}'.format(sys.argv[0]))
Вывод скрипта m2.py
:
my1.py __file__: D:\temp\aaa\my1.py my1.py sys.argv[0]: my2.py my2.py __file__: my2.py my2.py sys.argv[0]: my2.py
Вывод: если использовать __file__
в функциях из импортированных модулей, то мы получим имя данного модуля, а не главного скрипта …
UPDATE 2: бывают случаи когда укзанные выше методы будут работать не совсем правильно — посмотрите следующие связанные вопросы/ответы: