Python’da çalışan bir komut dosyasının konumunu (yolunu) almak için __file__ kullanın. Bu, çalışan dosyanın konumuna göre diğer dosyaları yüklemek için kullanışlıdır.
Python 3.8’e kadar, __file__, python komutunu (veya bazı ortamlarda python3 komutunu) yürütürken belirtilen yolu döndürür. Göreli bir yol belirtilirse, göreli yol döndürülür; mutlak bir yol belirtilirse, mutlak yol döndürülür.
Python 3.9 ve sonraki sürümlerinde, çalışma zamanında belirtilen yoldan bağımsız olarak mutlak yol döndürülür.
Aşağıdaki içerikler açıklanmıştır.
os.getcwd()
,__file__
- Yürütülen dosyanın dosya adını ve dizin adını alın.
- Yürütülmekte olan dosyanın mutlak yolunu alın.
- Yürütülen dosyanın konumuna göre diğer dosyaları okur.
- Geçerli dizini yürütülmekte olan dosyanın dizinine taşıyın.
- Aynı işlem, çalışma zamanında geçerli dizinden bağımsız olarak yapılabilir.
Geçerli dizini (çalışma dizini) alma ve değiştirme hakkında bilgi için aşağıdaki makaleye bakın.
- İlgili Makaleler:Python’da geçerli dizini alın ve değiştirin (taşıyın)
__file__ öğesinin Jupyter Notebook’ta (.ipynb) kullanılamayacağını unutmayın.
.ipynb’nin bulunduğu dizin, Jupyter Notebook’un başlatıldığı dizinden bağımsız olarak geçerli dizin olarak yürütülür.
Geçerli dizini değiştirmek için kodda os.chdir() kullanmak mümkündür.
- os.getcwd() ve __file__.
- Yürütülen dosyanın dosya adını ve dizin adını alın.
- Yürütülmekte olan dosyanın mutlak yolunu alın.
- Yürütülen dosyanın konumuna göre diğer dosyaları okur.
- Geçerli dizini yürütülmekte olan dosyanın dizinine taşıyın.
- Aynı işlem, çalışma zamanında geçerli dizinden bağımsız olarak yapılabilir.
os.getcwd() ve __file__.
Windows’ta, geçerli dizini kontrol etmek için pwd yerine dir komutunu kullanabilirsiniz.
pwd
# /Users/mbp/Documents/my-project/python-snippets/notebook
Alt düzeyde (data\src) aşağıdaki içeriklerle bir Python komut dosyası (file_path.py) oluşturun.
import os
print('getcwd: ', os.getcwd())
print('__file__: ', __file__)
Komut dosyasının yolunu belirterek python komutunu (veya bazı ortamlarda python3 komutunu) çalıştırın.
python3 data/src/file_path.py
# getcwd: /Users/mbp/Documents/my-project/python-snippets/notebook
# __file__: data/src/file_path.py
Geçerli dizinin mutlak yolu os.getcwd() ile elde edilebilir. python3 komutu tarafından belirtilen yolu almak için __file__’yi de kullanabilirsiniz.
Python 3.8’e kadar, __file__, python (veya python3) komutunda belirtilen yolu içerecektir. Yukarıdaki örnekte, göreli olduğu için göreli yol döndürülür, ancak mutlak ise mutlak yol döndürülür.
pwd
# /Users/mbp/Documents/my-project/python-snippets/notebook
python3 /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/file_path.py
# getcwd: /Users/mbp/Documents/my-project/python-snippets/notebook
# __file__: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/file_path.py
Python 3.9 ve sonraki sürümleri, python (veya python3) komutunda belirtilen yoldan bağımsız olarak __file__’nin mutlak yolunu döndürür.
Aşağıdaki örnekte, kodu Python 3.7’deki aynı komut dosyasına (file_path.py) ekleyeceğiz ve yukarıdaki dizine göre çalıştıracağız.
Python 3.7’de mutlak yol kullanılır. Sonuçlar bu bölümün sonunda gösterilmektedir.
Yürütülen dosyanın dosya adını ve dizin adını alın.
Çalışan dosyanın dosya adını ve dizin adını almak için standart kitaplığın os.path modülünde aşağıdaki işlevi kullanın.
os.path.basename()
os.path.dirname()
print('basename: ', os.path.basename(__file__))
print('dirname: ', os.path.dirname(__file__))
Yürütme sonucu.
# basename: file_path.py
# dirname: data/src
Yürütülmekte olan dosyanın mutlak yolunu alın.
__file__ ile göreli bir yol elde edilirse, os.path.abspath() ile mutlak bir yola dönüştürülebilir. Dizinler ayrıca mutlak yollar olarak da elde edilebilir.
print('abspath: ', os.path.abspath(__file__))
print('abs dirname: ', os.path.dirname(os.path.abspath(__file__)))
Yürütme sonucu.
# abspath: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/file_path.py
# abs dirname: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
os.path.abspath() içinde mutlak bir yol belirtilirse, olduğu gibi döndürülür. Bu nedenle, __file__ mutlak bir yol ise, aşağıdakiler bir hataya neden olmaz.
os.path.abspath(__file__)
Yürütülen dosyanın konumuna göre diğer dosyaları okur.
Yürütülmekte olan dosyanın konumuna (yoluna) göre diğer dosyaları okumak istiyorsanız, aşağıdaki iki dosyayı os.path.join() kullanarak birleştirin.
- Yürütülmekte olan dosyanın dizini
- Çalışan dosyadan okunacak dosyanın göreli yolu.
Çalıştırdığınız dosyayla aynı dizindeki bir dosyayı okumak istiyorsanız, dosya adını birleştirmeniz yeterlidir.
print('[set target path 1]')
target_path_1 = os.path.join(os.path.dirname(__file__), 'target_1.txt')
print('target_path_1: ', target_path_1)
print('read target file:')
with open(target_path_1) as f:
print(f.read())
Yürütme sonucu.
# [set target path 1]
# target_path_1: data/src/target_1.txt
# read target file:
# !! This is "target_1.txt" !!
Üst düzey “. \” ile temsil edilir. Olduğu gibi bırakabilirsiniz, ancak yolu normalleştirmek ve fazladan “. \” ve diğer karakterleri kaldırmak için os.path.normpath() öğesini kullanabilirsiniz.
print('[set target path 2]')
target_path_2 = os.path.join(os.path.dirname(__file__), '../dst/target_2.txt')
print('target_path_2: ', target_path_2)
print('normalize : ', os.path.normpath(target_path_2))
print('read target file:')
with open(target_path_2) as f:
print(f.read())
Yürütme sonucu.
# [set target path 2]
# target_path_2: data/src/../dst/target_2.txt
# normalize : data/dst/target_2.txt
# read target file:
# !! This is "target_2.txt" !!
Geçerli dizini yürütülmekte olan dosyanın dizinine taşıyın.
Geçerli dizini komut dosyasında yürütülmekte olan dosyanın dizinine taşımak için os.chdir() öğesini kullanın.
- İlgili Makaleler:Python’da geçerli dizini alın ve değiştirin (taşıyın)
os.getcwd() tarafından taşındığını görebilirsiniz.
print('[change directory]')
os.chdir(os.path.dirname(os.path.abspath(__file__)))
print('getcwd: ', os.getcwd())
Yürütme sonucu.
# [change directory]
# getcwd: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
Geçerli dizin taşındıktan sonra, dosyayı okurken onu çalışan dosyanın dizini ile birleştirmeye gerek yoktur. Çalışan dosyanın dizinine göre yolu belirtebilirsiniz.
print('[set target path 1 (after chdir)]')
target_path_1 = 'target_1.txt'
print('target_path_1: ', target_path_1)
print('read target file:')
with open(target_path_1) as f:
print(f.read())
print()
print('[set target path 2 (after chdir)]')
target_path_2 = '../dst/target_2.txt'
print('target_path_2: ', target_path_2)
print('read target file:')
with open(target_path_2) as f:
print(f.read())
Yürütme sonucu.
# [set target path 1 (after chdir)]
# target_path_1: target_1.txt
# read target file:
# !! This is "target_1.txt" !!
#
# [set target path 2 (after chdir)]
# target_path_2: ../dst/target_2.txt
# read target file:
# !! This is "target_2.txt" !!
Aynı işlem, çalışma zamanında geçerli dizinden bağımsız olarak yapılabilir.
Gösterdiğimiz gibi, aşağıdaki yöntemlerden birini kullanarak, çalışma zamanında geçerli dizinden bağımsız olarak, komut dosyasının konumuna göre dosyaları yüklemek mümkündür.
- os.path.join() kullanarak çalışan dosyanın dizinini ve çalışan dosyadan okunacak dosyanın ilgili yolunu birleştirin.
- Geçerli dizini yürütülmekte olan dosyanın dizinine taşıyın.
Mevcut dizini taşımak daha kolaydır, ancak elbette bundan sonra daha fazla dosya okumak veya yazmak istiyorsanız, mevcut dizinin taşındığını hesaba katmanız gerekir.
Önceki örneklerin sonuçları aşağıda özetlenmiştir.
pwd
# /Users/mbp/Documents/my-project/python-snippets/notebook
python3 data/src/file_path.py
# getcwd: /Users/mbp/Documents/my-project/python-snippets/notebook
# __file__: data/src/file_path.py
# basename: file_path.py
# dirname: data/src
# abspath: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/file_path.py
# abs dirname: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
#
# [set target path 1]
# target_path_1: data/src/target_1.txt
# read target file:
# !! This is "target_1.txt" !!
#
# [set target path 2]
# target_path_2: data/src/../dst/target_2.txt
# normalize : data/dst/target_2.txt
# read target file:
# !! This is "target_2.txt" !!
#
# [change directory]
# getcwd: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
#
# [set target path 1 (after chdir)]
# target_path_1: target_1.txt
# read target file:
# !! This is "target_1.txt" !!
#
# [set target path 2 (after chdir)]
# target_path_2: ../dst/target_2.txt
# read target file:
# !! This is "target_2.txt" !!
Mutlak yol belirtmenin sonucu aşağıdaki gibidir.
pwd
# /Users/mbp/Documents/my-project/python-snippets/notebook
python3 /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/file_path.py
# getcwd: /Users/mbp/Documents/my-project/python-snippets/notebook
# __file__: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/file_path.py
# basename: file_path.py
# dirname: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
# abspath: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/file_path.py
# abs dirname: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
#
# [set target path 1]
# target_path_1: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/target_1.txt
# read target file:
# !! This is "target_1.txt" !!
#
# [set target path 2]
# target_path_2: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/../dst/target_2.txt
# normalize : /Users/mbp/Documents/my-project/python-snippets/notebook/data/dst/target_2.txt
# read target file:
# !! This is "target_2.txt" !!
#
# [change directory]
# getcwd: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
#
# [set target path 1 (after chdir)]
# target_path_1: target_1.txt
# read target file:
# !! This is "target_1.txt" !!
#
# [set target path 2 (after chdir)]
# target_path_2: ../dst/target_2.txt
# read target file:
# !! This is "target_2.txt" !!
Geçerli dizini terminalde taşımanın ve aynı komut dosyasını çalıştırmanın sonucu aşağıda gösterilmiştir. Aynı dosyanın farklı bir konumdan çalıştırılsa bile okunabildiğini görebilirsiniz.
cd data/src
pwd
# /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
python3 file_path.py
# getcwd: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
# __file__: file_path.py
# basename: file_path.py
# dirname:
# abspath: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src/file_path.py
# abs dirname: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
#
# [set target path 1]
# target_path_1: target_1.txt
# read target file:
# !! This is "target_1.txt" !!
#
# [set target path 2]
# target_path_2: ../dst/target_2.txt
# normalize : ../dst/target_2.txt
# read target file:
# !! This is "target_2.txt" !!
#
# [change directory]
# getcwd: /Users/mbp/Documents/my-project/python-snippets/notebook/data/src
#
# [set target path 1 (after chdir)]
# target_path_1: target_1.txt
# read target file:
# !! This is "target_1.txt" !!
#
# [set target path 2 (after chdir)]
# target_path_2: ../dst/target_2.txt
# read target file:
# !! This is "target_2.txt" !!