Geçerli dosya dizininin tam yolunu nasıl edinebilirim?


802

Geçerli dosyanın dizin yolunu almak istiyorum. Denedim:

>>> os.path.abspath(__file__)
'C:\\python27\\test.py'

Ama yönetmenin yolunu nasıl alabilirim?

Örneğin:

'C:\\python27\\'


5
__file__etkileşimli kabuk olarak python çalıştırdığınızda tanımlanmaz. Sorunuzdaki ilk kod parçası etkileşimli bir kabuktan gibi görünüyor, ama aslında NameErroren azından python 2.7.3'te bir, ama diğerleri de sanırım.
drevicko

Yanıtlar:


1633

Python 3

Çalıştırılan komut dosyasının dizini için:

import pathlib
pathlib.Path(__file__).parent.absolute()

Geçerli çalışma dizini için:

import pathlib
pathlib.Path().absolute()

Python 2 ve 3

Çalıştırılan komut dosyasının dizini için:

import os
os.path.dirname(os.path.abspath(__file__))

Geçerli çalışma dizinini kastediyorsanız:

import os
os.path.abspath(os.getcwd())

Önce ve sonra filesadece bir değil iki alt çizgi olduğunu unutmayın .

Ayrıca, etkileşimli olarak çalışıyorsanız veya bir dosyadan başka bir şeyden kod yüklediyseniz (ör. Bir veritabanı veya çevrimiçi kaynak), __file__"geçerli dosya" kavramı olmadığından ayarlanamayabileceğini unutmayın. Yukarıdaki yanıt, bir dosyada bulunan bir python betiği çalıştırma en yaygın senaryosunu varsayar.

Referanslar

  1. python belgelerinde pathlib .
  2. o. yol 2.7 , o. yol 3.8
  3. os.getcwd 2.7 , os.getcwd 3.8
  4. __file__ değişkeni ne anlama geliyor / ne yapıyor?

43
Eğer dirname ( dosya ) boş bir dize döndürebilir , garip davranışlar keşfetmek istemiyorsanız abspath () zorunludur !
sorin

4
os.path.dirname olmalı (os.path.abspath (os .__ file__))?
DrBailey

5
@DrBailey: hayır, ActivePython hakkında özel bir şey yok. __file__(kelimenin her iki tarafında iki alt çizgi olduğunu unutmayın) python standart bir parçasıdır. Örneğin, C tabanlı modüllerde mevcut değildir, ancak her zaman bir python betiğinde kullanılabilir olmalıdır.
Bryan Oakley

10
Olası bir sembolik bağı çözmek için abspath yerine realpath kullanmanızı tavsiye ederim.
TTimo

12
@ cph2117: bu yalnızca bir komut dosyasında çalıştırırsanız çalışır. __file__Etkileşimli bir istemden çalıştırılıyorsa hayır yoktur . \
Bryan Oakley

99

PathPython 3'ten bu yana kullanmak önerilen yöntemdir:

from pathlib import Path
print("File      Path:", Path(__file__).absolute())
print("Directory Path:", Path().absolute())  

Belgeler: pathlib

Not: Jupyter Notebook kullanılıyorsa __file__beklenen değeri döndürmez, bu nedenle Path().absolute()kullanılmalıdır.


17
Path(__file__).parentDosyayı içeren klasörü almak zorunda kaldım
YellowPillow

Doğru @YellowPillow, Path(__file__)dosyayı alır. .parentiçerdiği dizinin bir düzey üstünde olmanızı sağlar. İstediğiniz .parentsayıda dizin yukarı çıkmak için buna daha fazlasını ekleyebilirsiniz .
Ron Kalian

1
Üzgünüm, bu daha net yapmalıydım, ama eğer Path().absolute()bulunan bazı modülde varsa ve modülü bulunan bir path/to/modulekomut dosyasından path/to/scriptpath/to/scriptpath/to/module
çağırırsanız,

1
@YellowPillow Path(__file__).cwd()daha açık
Charles

1
Path(__file__)her zaman çalışmaz, örneğin, Jupyter Notebook'da çalışmaz. Path().absolute()bu problemi çözer.
Ron Kalian

43

Python 3.x'te şunu yaparım:

from pathlib import Path

path = Path(__file__).parent.absolute()

Açıklama:

  • Path(__file__) geçerli dosyanın yoludur.
  • .parentdosyanın bulunduğu dizini verir .
  • .absolute()size tam mutlak yolu verir .

Kullanmak pathlib, yollarla çalışmanın modern yoludur. Herhangi bir nedenle daha sonra bir dize olarak ihtiyacınız varsa, yapmanız yeterlidir str(path).


3
Bu, 2019 itibariyle kabul edilen cevap olmalıdır. Cevapta da bir şeyden bahsedilebilir: Birisi derhal .open()böyle bir Pathnesneyi çağırabilirwith Path(__file__).parent.joinpath('some_file.txt').open() as f:
stefanct

9
import os
print os.path.dirname(__file__)

21
Üzgünüz ama bu cevap yanlış, doğru cevap Bryan `dirname (abspath ( dosya )) tarafından yapılan cevaptır . Ayrıntılar için yorumlara bakın.
sorin

1
/ Çıktı olarak verilecek
Tripathi29

2
@sorin Aslında Python 3.6'da ikisi de aynı
DollarAkshay

5

Aşağıdaki gibi kolayca kullanabilir osve os.pathkitaplık kullanabilirsiniz

import os
os.chdir(os.path.dirname(os.getcwd()))

os.path.dirnamegeçerli dizinden üst dizini döndürür. Herhangi bir dosya argümanını geçmeden ve mutlak yolu bilmeden bir üst seviyeye geçmemizi sağlar.


7
Bu, geçerli dosyanın dizinini vermez . Tamamen farklı olabilecek geçerli çalışma dizininin dizinini döndürür. Önerdiğiniz şey yalnızca dosya geçerli çalışma dizinindeyse çalışır.
Bryan Oakley


2

Aşağıdaki komutların tüm Python 3.6 komut dosyasının üst dizininin tam yolunu döndüreceğini buldum.

Python 3.6 Komut Dosyası:

#!/usr/bin/env python3.6
# -*- coding: utf-8 -*-

from pathlib import Path

#Get the absolute path of a Python3.6 script
dir1 = Path().resolve()  #Make the path absolute, resolving any symlinks.
dir2 = Path().absolute() #See @RonKalian answer 
dir3 = Path(__file__).parent.absolute() #See @Arminius answer 

print(f'dir1={dir1}\ndir2={dir2}\ndir3={dir3}')

Açıklama bağlantıları: .resolve () , .absolute () , Yol ( dosya ) .parent (). Absolute ()


2

Sistem: MacOS

Sürüm: Anaconda ile Python 3.6

import os

rootpath = os.getcwd()

os.chdir(rootpath)

1

PİTONDA YARARLI YOL ÖZELLİKLERİ:

 from pathlib import Path

    #Returns the path of the directory, where your script file is placed
    mypath = Path().absolute()
    print('Absolute path : {}'.format(mypath))

    #if you want to go to any other file inside the subdirectories of the directory path got from above method
    filePath = mypath/'data'/'fuel_econ.csv'
    print('File path : {}'.format(filePath))

    #To check if file present in that directory or Not
    isfileExist = filePath.exists()
    print('isfileExist : {}'.format(isfileExist))

    #To check if the path is a directory or a File
    isadirectory = filePath.is_dir()
    print('isadirectory : {}'.format(isadirectory))

    #To get the extension of the file
    fileExtension = mypath/'data'/'fuel_econ.csv'
    print('File extension : {}'.format(filePath.suffix))

ÇIKTI: ABSOLUTE PATH PYTHON DOSYANIN YERLEŞTİRİLDİĞİ YOL

Mutlak yol: D: \ Study \ Machine Learning \ Jupitor Notebook \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib ve deniz dibi Part2

Dosya yolu: D: \ Study \ Machine Learning \ Jupitor Notebook \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib ve denizde doğmuş Part2 \ data \ fuel_econ.csv

isfileExist: Doğru

isadirectory: Yanlış

Dosya uzantısı: .csv


1

Sadece geçerli çalışma dizinini görmek istiyorsanız

import os
print(os.getcwd)

Geçerli çalışma dizinini değiştirmek istiyorsanız

os.chdir(path)

path, taşınması gereken yolu içeren bir dizedir. Örneğin

path = "C:\\Users\\xyz\\Desktop\\move here"

0

IPython%pwdmevcut çalışma dizinini almak için sihirli bir komutu vardır . Aşağıdaki şekilde kullanılabilir:

from IPython.terminal.embed import InteractiveShellEmbed

ip_shell = InteractiveShellEmbed()

present_working_directory = ip_shell.magic("%pwd")

IPython Jupyter Notebook %pwdüzerinde doğrudan aşağıdaki gibi kullanılabilir:

present_working_directory = %pwd

5
Soru IPython ile ilgili değil
Kiro

1
@Kiro, çözümüm IPython kullanarak soruyu cevaplıyor . Örneğin, bir kişi yeni bir kütüphane kullanarak bir soruyla bir soruyu cevaplarsa, o zaman bu soruya ilgili bir cevap olarak kalır.
Nafeez Quraishi

@NafeezQuraishi çözümünüz, bir üçüncü taraf kütüphanesi ve istenen sonucu elde etmek için örneklemeniz gereken bir sınıf sunar. Kendim ve ben birçok kişinin harici kütüphaneleri birkaç nedenden dolayı kullanmaktan kaçınmaya çalıştığını düşünüyorum ve çözümünüzü sadece başka hiçbir şey işe yaramazsa deneyeceğim. Neyse ki, istenen sonucu elde etmek için ve harici bir kütüphaneye ihtiyaç duymadan kullanabileceğiniz bir dizi yerleşik işlev var.
elliotwesoff

@ elli0t, kısmen katılıyorum. Jupyter dizüstü bilgisayar kullanan birisinin bu soruna sahip olduğunu düşünün, belki de% pwd magic komutunu kullanmak os ithalatına göre daha kolay ve tercih edilir.
Nafeez Quraishi

0

Platformlarda (macOS / Windows / Linux) geçiş tutarlılığını korumak için şunları deneyin:

path = r'%s' % os.getcwd().replace('\\','/')

0

Geçerli klasörü almak için CGI IIS altında python çalıştırırken kullanmak için bir işlev yaptık:

import os 
   def getLocalFolder():
        path=str(os.path.dirname(os.path.abspath(__file__))).split('\\')
        return path[len(path)-1]

0

Aşağıdaki dizin yapısına sahip olduğunuzu varsayalım: -

ana / kat1 kat2 kat3 ...

folders = glob.glob("main/fold*")

for fold in folders:
    abspath = os.path.dirname(os.path.abspath(fold))
    fullpath = os.path.join(abspath, sch)
    print(fullpath)

-1
## IMPORT MODULES
import os

## CALCULATE FILEPATH VARIABLE
filepath = os.path.abspath('') ## ~ os.getcwd()
## TEST TO MAKE SURE os.getcwd() is EQUIVALENT ALWAYS..
## ..OR DIFFERENT IN SOME CIRCUMSTANCES

2
Geçerli çalışma dizini, geçerli dosyanın diziniyle aynı olmayabilir. Çözümünüz yalnızca geçerli çalışma dizini dosyayı tutan dizinle aynıysa çalışır. Bu, geliştirme sırasında oldukça yaygın olabilir, ancak konuşlandırılmış bir komut dosyası için genellikle oldukça nadirdir.
Bryan Oakley

Bilgi için teşekkürler. Yanıtımı, bunların aynı dosya yolunu döndüren eşdeğer olmayabilir olasılığını yansıtacak şekilde güncelledim. "Artımlı programlama" adı verilen kodlama felsefesine bağlı kalmamın nedeni budur, test ve çıktıların ve / veya değerlerin her adımda geri döndüğünü test etmek için birçok print () fonksiyon çağrısı. Kodumu şimdi daha iyi os.path.abspath () vs os.getcwd () gerçeğini yansıtıyor umarım çünkü ben her şeyi bilmek iddia değil. Ancak yorumlarda ana çözüm olarak değil, hatırlamaya ve kontrol etmeye değer bir alt kod parçası olarak os.getcwd () koyduğumu görebilirsiniz.
Kudüs Programcısı

PS Sanırım birisi burada gönderdiğim cevabımın çoğunu düzenledi ve sildi ... :( Böyle cevaplar sansürlenecek ve kesilecekse insanların katılmasını caydırıyor.
Kudüs Programcısı

1
Bu yanıtı düzenleyen tek kişi sensin. Ayrıca, düzenlemeleriniz hala soruyu doğru bir şekilde yanıtlamıyor. Soru, özellikle dosyanın dizinine giden yolu soruyor ve yanıtınız yalnızca geçerli dizini aldığından bahsediyor. Bu doğru bir yanıt değildir, çünkü geçerli dizin komut dosyasının içinde bulunduğu dizinle aynı değildir. Bunun bir ilgisi yoktur abspath.
Bryan Oakley

Kesinlikle paylaştığım kod, mutlak dosya yolunu bilmek istediğiniz dizinden ve / veya dosyadan çalıştırılırsa dosyanın dizinine yol verir. Kesinlikle doğru bir cevaptır. Lütfen trol olma.
Kudüs Programcısı
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.