Я использовал для открытия файлов, которые были в том же каталоге, что и текущий скрипт Python, просто используя команду
open("Some file.txt", "r")
Однако я обнаружил, что когда скрипт запускается в Windows, дважды щелкнув по нему, он попытается открыть файл из неправильного каталога.
С тех пор я использовал команду вида
open(os.path.join(sys.path[0], "Some file.txt"), "r")
всякий раз, когда я хотел открыть файл. Это работает для моего конкретного использования, но я не уверен, что sys.path[0]может произойти сбой в другом случае использования.
Итак, мой вопрос: каков наилучший и самый надежный способ открыть файл, который находится в той же директории, что и текущий запущенный скрипт Python?
Вот что мне удалось выяснить до сих пор:
os.getcwd()иos.path.abspath('')вернуть «текущий рабочий каталог», а не каталог скрипта.os.path.dirname(sys.argv[0])иos.path.dirname(__file__)вернуть путь, используемый для вызова скрипта, который может быть относительным или даже пустым (если скрипт находится в cwd). Кроме того,__file__не существует, когда скрипт выполняется в IDLE или PythonWin.sys.path[0]и,os.path.abspath(os.path.dirname(sys.argv[0]))кажется, вернуть каталог скриптов. Я не уверен, есть ли разница между этими двумя.
Редактировать:
Я просто понял, что то, что я хочу сделать, лучше описать как «открыть файл в том же каталоге, что и содержащий модуль». Другими словами, если я импортирую написанный мной модуль, который находится в другом каталоге, и этот модуль открывает файл, я хочу, чтобы он искал файл в каталоге модуля. Я не думаю, что что-то, что я нашел, может это сделать ...
__file__нельзя использовать, используйтеsys.argv[0]вместоdirname(__file__). Остальное должно работать как положено. Мне нравится использовать,__file__потому что в коде библиотеки,sys.argv[0]может вообще не указывать на ваш код, особенно если он импортирован через какой-то сторонний скрипт.