Найти текущий каталог и каталог файла

В Python, какие команды я могу использовать, чтобы найти:

  1. текущий каталог (где я был в терминале, когда я запускал скрипт Python), и
  2. где находится файл, который я выполняю?

15 ответов

Решение

Чтобы получить полный путь к каталогу, в котором содержится файл Python, запишите его в этом файле:

import os 
dir_path = os.path.dirname(os.path.realpath(__file__))

(Обратите внимание, что заклинание выше не будет работать, если вы уже использовали os.chdir() изменить текущий рабочий каталог, так как значение __file__ константа относительно текущего рабочего каталога и не изменяется os.chdir() вызов.)


Чтобы получить текущий рабочий каталог, используйте

import os
cwd = os.getcwd()

Ссылки на документацию для модулей, констант и функций, использованных выше:

  • os а также os.path модули.
  • __file__ постоянная
  • os.path.realpath(path) (возвращает "канонический путь указанного имени файла, исключая любые символические ссылки, встречающиеся в пути")
  • os.path.dirname(path) (возвращает "имя каталога пути path ")
  • os.getcwd() (возвращает "строку, представляющую текущий рабочий каталог")
  • os.chdir(path) ("изменить текущий рабочий каталог на path ")

Текущий рабочий каталог: os.getcwd ()

А атрибут __file__ может помочь вам узнать, где находится исполняемый файл. Этот пост SO объясняет все: Как мне получить путь к текущему исполняемому файлу в Python?

Вы можете найти это полезным для справки:

import os

print("Path at terminal when executing this file")
print(os.getcwd() + "\n")

print("This file path, relative to os.getcwd()")
print(__file__ + "\n")

print("This file full path (following symlinks)")
full_path = os.path.realpath(__file__)
print(full_path + "\n")

print("This file directory and name")
path, filename = os.path.split(full_path)
print(path + ' --> ' + filename + "\n")

print("This file directory only")
print(os.path.dirname(full_path))

pathlibмодуль, представленный в Python 3.4 ( PEP 428 - модуль pathlib - пути объектно-ориентированной файловой системы), значительно облегчает работу с путями.

$ pwd
/home/skovorodkin/stack
$ tree
.
└── scripts
    ├── 1.py
    └── 2.py

Для получения текущего рабочего каталога используйте Path.cwd():

from pathlib import Path

print(Path.cwd())  # /home/skovorodkin/stack

Чтобы получить абсолютный путь к файлу скрипта, используйте Path.resolve() метод:

print(Path(__file__).resolve())  # /home/skovorodkin/stack/scripts/1.py

И чтобы получить путь к каталогу, где находится ваш скрипт, доступ .parent (рекомендуется звонить .resolve() до .parent):

print(Path(__file__).resolve().parent)  # /home/skovorodkin/stack/scripts

Помни что __file__ не надежен в некоторых ситуациях: как мне получить путь к текущему исполняемому файлу в Python?,


Обратите внимание, что Path.cwd(), Path.resolve() и другие Path методы возвращают объекты пути (PosixPath в моем случае), а не строки. В Python 3.4 и 3.5 это вызвало некоторую боль, потому что open встроенная функция может работать только со строковыми или байтовыми объектами и не поддерживает Path объекты, поэтому вам пришлось конвертировать Path объекты в строки или использовать Path.open() метод, но последний вариант потребовал от вас изменить старый код:

$ cat scripts/2.py
from pathlib import Path

p = Path(__file__).resolve()

with p.open() as f: pass
with open(str(p)) as f: pass
with open(p) as f: pass

print('OK')

$ python3.5 scripts/2.py
Traceback (most recent call last):
  File "scripts/2.py", line 11, in <module>
    with open(p) as f:
TypeError: invalid file: PosixPath('/home/skovorodkin/stack/scripts/2.py')

Как вы видете open(p) не работает с Python 3.5.

PEP 519 - Добавление протокола пути к файловой системе, реализованного в Python 3.6, добавляет поддержку PathLike возражает против open функция, так что теперь вы можете передать Path возражает против open функционировать напрямую:

$ python3.6 scripts/2.py
OK

1. Чтобы получить полный путь к текущему каталогу

    >>import os
    >>print os.getcwd()

o / p:"C: \ Users \ admin \ myfolder"

1. Чтобы получить только имя текущей папки

    >>import os
    >>str1=os.getcwd()
    >>str2=str1.split('\\')
    >>n=len(str2)
    >>print str2[n-1]

о / р:"моя_папка"

Pathlib можно использовать таким образом, чтобы получить каталог, содержащий текущий скрипт:

import pathlib
filepath = pathlib.Path(__file__).resolve().parent

Если вы пытаетесь найти текущий каталог файла, в котором вы сейчас находитесь:

ОС агностическим способом:

dirname, filename = os.path.split(os.path.abspath(__file__))

Чтобы получить полный путь к текущему каталогу:

os.path.realpath ('')

Если вы используете Python 3.4, есть новый более высокий уровень pathlib модуль, который позволяет удобно звонить pathlib.Path.cwd() чтобы получить Path объект, представляющий ваш текущий рабочий каталог, наряду со многими другими новыми функциями.

Больше информации об этом новом API можно найти здесь.

Ответ № 1:

Если вы хотите текущий каталог, сделайте это:

import os
os.getcwd()

Если вам нужно просто указать любое имя папки и у вас есть путь к этой папке, сделайте следующее:

def get_folder_name(folder):
    '''
    Returns the folder name, given a full folder path
    '''
    return folder.split(os.sep)[-1]

Ответ № 2:

import os
print os.path.abspath(__file__)

Немного опоздал на вечеринку, но я думаю, что самый краткий способ найти только название вашего текущего контекста исполнения будет

current_folder_path, current_folder_name = os.path.split(os.getcwd())

Если вы ищете местоположение выполняемого в данный момент скрипта, вы можете использовать sys.argv[0] чтобы получить полный путь.

Для вопроса 1 используйте os.getcwd() # get working dir а также os.chdir(r'D:\Steam\steamapps\common') # set working dir


Я рекомендую использовать sys.argv[0] на вопрос 2, потому что sys.argv является неизменным и, следовательно, всегда возвращает текущий файл (путь к объекту модуля) и не зависит от os.chdir(), Также вы можете сделать так:

import os
this_py_file = os.path.realpath(__file__)

# vvv Below comes your code vvv #

но этот фрагмент и sys.argv[0] не будет работать или будет работать странно при компиляции PyInstaller, потому что магические свойства не установлены в __main__ уровень и sys.argv[0] так называется ваш exe (означает, что на него влияет рабочий каталог).

Для просмотра текущего рабочего каталога наберите следующий скрипт:

import os
current_working_directory = os.getcwd()

Получить ваш рабочий каталог в Python. Вы можете использовать следующий код:

import os
cwd = os.getcwd() #to get current working directory
print(cwd)
Другие вопросы по тегам