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

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

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

Ответы

Ответ 1

Чтобы получить полный путь к каталогу, в который содержится файл 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" )

Ответ 3

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

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))

Ответ 4

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]

о/р: "MyFolder"

Ответ 5

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

Агностический способ ОС:

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

Ответ 6

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

Ответ 7

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

Дополнительную информацию об этом новом API можно найти здесь.

Ответ 8

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

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

Ответ 9

Ответ на # 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__)

Ответ 10

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

Ответ 11

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

os.path.realpath( '')

Ответ 12

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

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

Ответ 13

Чтобы увидеть текущий тип рабочего каталога следующего сценария:

import os
current_working_directory = os.getcwd()

Ответ 14

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

import os
cwd = os.getcwd() #to get current working directory
print(cwd)

Ответ 15

В вопросе 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] не будут работать или будут работать wierd при компиляции PyInstaller, потому что магические свойства не установлены на уровне __main__, а sys.argv[0] - это способ, которым вызвал ваш exe (означает, что на него влияет рабочий каталог).