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