Я использовал для открытия файлов, которые были в том же каталоге, что и текущий скрипт 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]
может вообще не указывать на ваш код, особенно если он импортирован через какой-то сторонний скрипт.