Python определить текущую директорию

Find the current directory and file’s directory [duplicate]

This question is blatantly two questions in one and should have been closed as needing more focus. Both questions are simple reference questions, and thus ought to each have separate canonicals that this can be dupe-hammered with. However, I have been absolutely tearing my hair out trying to find a proper canonical for only the first question. I am turning up countless duplicates for the second question, most of which involve OP not realizing there is a difference.

I have added the best I could find for «Q. How do I determine the current directory? A. Use os.getcwd() » after literally hours of searching. Ugh.

13 Answers 13

To get the full path to the directory a Python file is contained in, write this in that file:

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

(Note that the incantation above won’t work if you’ve already used os.chdir() to change your current working directory, since the value of the __file__ constant is relative to the current working directory and is not changed by an os.chdir() call.)

To get the current working directory use

Documentation references for the modules, constants and functions used above:

  • The os and os.path modules.
  • The __file__ constant
  • os.path.realpath(path) (returns «the canonical path of the specified filename, eliminating any symbolic links encountered in the path»)
  • os.path.dirname(path) (returns «the directory name of pathname path «)
  • os.getcwd() (returns «a string representing the current working directory»)
  • os.chdir(path) («change the current working directory to path «)

file will not work if invoked from an IDE (say IDLE). Suggest os.path.realpath(‘./’) or os.getcwd(). Best anser in here: stackoverflow.com/questions/2632199/…

Читайте также:  Disable link with javascript

@Neon22 might suit some needs, but I feel it should be noted that those things aren’t the same at all — files can be outside the working directory.

@Moberg Often the paths will be the same when reversing realpath with dirname , but it will differ when the file (or its directory) is actually a symbolic link.

And the __file__ attribute can help you find out where the file you are executing is located. This Stack Overflow post explains everything: How do I get the path of the current executed file in Python?

You may find this useful as a reference:

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

The __file__ is an attribute of the module object. You need run the code inside a Python file, not on the REPL.

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

In order to get the current working directory, use Path.cwd() :

from pathlib import Path print(Path.cwd()) # /home/skovorodkin/stack 

To get an absolute path to your script file, use the Path.resolve() method:

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

And to get the path of a directory where your script is located, access .parent (it is recommended to call .resolve() before .parent ):

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

Please note, that Path.cwd() , Path.resolve() and other Path methods return path objects ( PosixPath in my case), not strings. In Python 3.4 and 3.5 that caused some pain, because open built-in function could only work with string or bytes objects, and did not support Path objects, so you had to convert Path objects to strings or use the Path.open() method, but the latter option required you to change old code:

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

Output

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

As you can see, open(p) does not work with Python 3.5.

PEP 519 — Adding a file system path protocol, implemented in Python 3.6, adds support of PathLike objects to the open function, so now you can pass Path objects to the open function directly:

Источник

Работа с файлами в Python с помощью модуля OS

Обработка файлов в Python с помощью модуля os включает создание, переименование, перемещение, удаление файлов и папок, а также получение списка всех файлов и каталогов и многое другое.

В индустрии программного обеспечения большинство программ тем или иным образом обрабатывают файлы: создают их, переименовывают, перемещают и так далее. Любой программист должен обладать таким навыком. С этим руководством вы научитесь использовать модуль os в Python для проведения операций над файлами и каталогами вне зависимости от используемой операционной системы.

Важно знать, что модуль os используется не только для работы с файлами. Он включает массу методов и инструментов для других операций: обработки переменных среды, управления системными процессами, а также аргументы командной строки и даже расширенные атрибуты файлов, которые есть только в Linux.

Модуль встроенный, поэтому для работы с ним не нужно ничего устанавливать.

Вывод текущей директории

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

import os # вывести текущую директорию print("Текущая деректория:", os.getcwd()) 

os.getcwd() возвращает строку в Юникоде, представляющую текущий рабочий каталог. Вот пример вывода:

Текущая деректория: C:\python3\bin 

Создание папки

Для создания папки/каталога в любой операционной системе нужна следующая команда:

# создать пустой каталог (папку) os.mkdir("folder") 

После ее выполнения в текущем рабочем каталоге тут же появится новая папка с названием «folder».

Если запустить ее еще раз, будет вызвана ошибка FileExistsError , потому что такая папка уже есть. Для решения проблемы нужно запускать команду только в том случае, если каталога с таким же именем нет. Этого можно добиться следующим образом:

# повторный запуск mkdir с тем же именем вызывает FileExistsError, # вместо этого запустите: if not os.path.isdir("folder"): os.mkdir("folder") 

Функция os.path.isdir() вернет True , если переданное имя ссылается на существующий каталог.

Изменение директории

Менять директории довольно просто. Проделаем это с только что созданным:

# изменение текущего каталога на 'folder' os.chdir("folder") 

Еще раз выведем рабочий каталог:

# вывод текущей папки print("Текущая директория изменилась на folder:", os.getcwd()) 
Текущая директория изменилась на folder: C:\python3\bin\folder 

Создание вложенных папок

Предположим, вы хотите создать не только одну папку, но и несколько вложенных:

# вернуться в предыдущую директорию os.chdir("..") # сделать несколько вложенных папок os.makedirs("nested1/nested2/nested3") 

Это создаст три папки рекурсивно, как показано на следующем изображении:

Создание вложенных папок

Создание файлов

Для создания файлов в Python модули не нужны. Можно использовать встроенную функцию open() . Она принимает название файла, который необходимо создать в качестве первого параметра и желаемый режим открытия — как второй:

# создать новый текстовый файл text_file = open("text.txt", "w") # запить текста в этот файл text_file.write("Это текстовый файл") 

w значит write (запись), a — это appending (добавление данных к уже существующему файлу), а r — reading (чтение). Больше о режимах открытия можно почитать здесь.

Переименование файлов

С помощью модуля os достаточно просто переименовать файл. Поменяем название созданного в прошлом шаге.

# переименовать text.txt на renamed-text.txt os.rename("text.txt", "renamed-text.txt") 

Функция os.rename() принимает 2 аргумента: имя файла или папки, которые нужно переименовать и новое имя.

Перемещение файлов

Функцию os.replace() можно использовать для перемещения файлов или каталогов:

# заменить (переместить) этот файл в другой каталог os.replace("renamed-text.txt", "folder/renamed-text.txt") 

Стоит обратить внимание, что это перезапишет путь, поэтому если в папке folder уже есть файл с таким же именем ( renamed-text.txt ), он будет перезаписан.

Список файлов и директорий

# распечатать все файлы и папки в текущем каталоге print("Все папки и файлы:", os.listdir()) 

Функция os.listdir() возвращает список, который содержит имена файлов в папке. Если в качестве аргумента не указывать ничего, вернется список файлов и папок текущего рабочего каталога:

Все папки и файлы: ['folder', 'handling-files', 'nested1', 'text.txt'] 

А что если нужно узнать состав и этих папок тоже? Для этого нужно использовать функцию os.walk() :

# распечатать все файлы и папки рекурсивно for dirpath, dirnames, filenames in os.walk("."): # перебрать каталоги for dirname in dirnames: print("Каталог:", os.path.join(dirpath, dirname)) # перебрать файлы for filename in filenames: print("Файл:", os.path.join(dirpath, filename)) 

os.walk() — это генератор дерева каталогов. Он будет перебирать все переданные составляющие. Здесь в качестве аргумента передано значение «.», которое обозначает верхушку дерева:

Каталог: .\folder Каталог: .\handling-files Каталог: .\nested1 Файл: .\text.txt Файл: .\handling-files\listing_files.py Файл: .\handling-files\README.md Каталог: .\nested1\nested2 Каталог: .\nested1\nested2\nested3 

Метод os.path.join() был использован для объединения текущего пути с именем файла/папки.

Удаление файлов

# удалить этот файл os.remove("folder/renamed-text.txt") 

os.remove() удалит файл с указанным именем (не каталог).

Удаление директорий

С помощью функции os.rmdir() можно удалить указанную папку:

# удалить папку os.rmdir("folder") 

Для удаления каталогов рекурсивно необходимо использовать os.removedirs() :

# удалить вложенные папки os.removedirs("nested1/nested2/nested3") 

Это удалит только пустые каталоги.

Получение информации о файлах

Для получения информации о файле в ОС используется функция os.stat() , которая выполняет системный вызов stat() по выбранному пути:

open("text.txt", "w").write("Это текстовый файл") # вывести некоторые данные о файле print(os.stat("text.txt")) 
os.stat_result(st_mode=33206, st_ino=14355223812608232, st_dev=1558443184, st_nlink=1, st_uid=0, st_gid=0, st_size=19, st_atime=1575967618, st_mtime=1575967618, st_ctime=1575966941) 

Это вернет кортеж с отдельными метриками. В их числе есть следующие:

    • st_size — размер файла в байтах
    • st_atime — время последнего доступа в секундах (временная метка)
    • st_mtime — время последнего изменения
    • st_ctime — в Windows это время создания файла, а в Linux — последнего изменения метаданных

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

    # например, получить размер файла print("Размер файла:", os.stat("text.txt").st_size) 

    Выводы

    Работать с файлами и каталогами в Python очень просто. Не имеет значения даже используемая операционная система, хотя отдельные уникальные для системы функции можно использовать: например, os.chown() или os.chmod() в Linux. Более подробно эта тема освещена в официальной документации Python.

    Источник

Оцените статью