Hent placeringen (stien) af en kørende fil i Python: __file__.

Forretning

Hvis du vil have fat i placeringen (stien) af en scriptfil, der kører i Python, skal du bruge __file__. Dette er nyttigt til at indlæse andre filer baseret på placeringen af den kørende fil.

Indtil Python 3.8 returnerer __file__ den sti, der er angivet ved udførelse af python-kommandoen (eller python3-kommandoen i visse miljøer). Hvis der er angivet en relativ sti, returneres den relative sti, og hvis der er angivet en absolut sti, returneres den absolutte sti.

I Python 3.9 og nyere versioner returneres den absolutte sti uanset den sti, der er angivet ved kørselstid.

Følgende indhold er forklaret.

  • os.getcwd(),__file__
  • Hent filnavnet og mappenavnet for den fil, der udføres i øjeblikket.
  • Få den absolutte sti til den fil, der udføres.
  • Læser andre filer baseret på placeringen af den fil, der udføres i øjeblikket.
  • Flytter den aktuelle mappe til mappen for den fil, der er under udførelse.
  • Den samme behandling kan udføres uafhængigt af den aktuelle mappe ved kørselstid.

Se følgende artikel for oplysninger om at hente og ændre den aktuelle mappe (arbejdsmappe).

Bemærk, at __file__ ikke kan bruges i Jupyter Notebook (.ipynb).
Den mappe, hvor .ipynb er placeret, vil blive udført som den aktuelle mappe, uanset i hvilken mappe Jupyter Notebook er startet.
Det er muligt at bruge os.chdir() i koden til at ændre den aktuelle mappe.

os.getcwd() og __file__.

I Windows kan du bruge kommandoen dir i stedet for pwd til at kontrollere den aktuelle mappe.

pwd
# /Users/mbp/Documents/my-project/python-snippets/notebook

Opret en Python-scriptfil (file_path.py) med følgende indhold i det nederste niveau (data\src).

import os

print('getcwd:      ', os.getcwd())
print('__file__:    ', __file__)

Kør python-kommandoen (eller python3-kommandoen i nogle miljøer) med angivelse af stien til scriptfilen.

python3 data/src/file_path.py
# getcwd:       /Users/mbp/Documents/my-project/python-snippets/notebook
# __file__:     data/src/file_path.py

Den absolutte sti til den aktuelle mappe kan fås med os.getcwd(). Du kan også bruge __file__ til at få fat i den sti, der er angivet af python3-kommandoen.

Indtil Python 3.8 vil __file__ indeholde den sti, der er angivet i python-kommandoen (eller python3-kommandoen). I eksemplet ovenfor returneres den relative sti, fordi den er relativ, men den absolutte sti returneres, hvis den er absolut.

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 og nyere versioner returnerer den absolutte sti til __file__, uanset hvilken sti der er angivet i python-kommandoen (eller python3-kommandoen).

I det følgende eksempel tilføjer vi koden til den samme scriptfil (file_path.py) i Python 3.7 og kører den i forhold til den ovennævnte mappe.

I Python 3.7 anvendes den absolutte sti. Resultaterne er vist i slutningen af dette afsnit.

Hent filnavnet og mappenavnet for den fil, der udføres i øjeblikket.

Du kan få filnavnet og mappenavnet på den kørende fil ved at bruge følgende funktion i os.path-modulet i standardbiblioteket.

  • os.path.basename()
  • os.path.dirname()
print('basename:    ', os.path.basename(__file__))
print('dirname:     ', os.path.dirname(__file__))

Udførelsesresultat.

# basename:     file_path.py
# dirname:      data/src

Få den absolutte sti til den fil, der udføres.

Hvis en relativ sti er fundet med __file__, kan den konverteres til en absolut sti med os.path.abspath(). Kataloger kan også fås som absolutte stier.

print('abspath:     ', os.path.abspath(__file__))
print('abs dirname: ', os.path.dirname(os.path.abspath(__file__)))

Udførelsesresultat.

# 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

Hvis der er angivet en absolut sti i os.path.abspath(), returneres den som den er. Hvis __file__ er en absolut sti, vil følgende derfor ikke forårsage en fejl, hvis __file__ er en absolut sti.

  • os.path.abspath(__file__)

Læser andre filer baseret på placeringen af den fil, der udføres i øjeblikket.

Hvis du ønsker at læse andre filer baseret på placeringen (stien) af den fil, der udføres, skal du sammenføje følgende to filer ved hjælp af os.path.join().

  • Katalog for den fil, der udføres
  • Relativ sti til den fil, der skal læses fra den kørende fil.

Hvis du vil læse en fil i den samme mappe som den fil, du kører, skal du blot sammenkæde filnavnene.

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

Udførelsesresultat.

# [set target path 1]
# target_path_1:  data/src/target_1.txt
# read target file:
# !! This is "target_1.txt" !!

Det øverste niveau er repræsenteret ved “. \”. Du kan lade det være, som det er, men du kan bruge os.path.normpath() til at normalisere stien og fjerne ekstra “. \” og andre tegn.

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

Udførelsesresultat.

# [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" !!

Flytter den aktuelle mappe til mappen for den fil, der er under udførelse.

Brug os.chdir() til at flytte den aktuelle mappe til mappen for den fil, der udføres i scriptet.

Du kan se, at den er flyttet af os.getcwd().

print('[change directory]')
os.chdir(os.path.dirname(os.path.abspath(__file__)))
print('getcwd:      ', os.getcwd())

Udførelsesresultat.

# [change directory]
# getcwd:       /Users/mbp/Documents/my-project/python-snippets/notebook/data/src

Når den aktuelle mappe er blevet flyttet, er det ikke nødvendigt at sammenkæde den med mappen for den kørende fil, når filen læses. Du kan blot angive stien relativt til den kørende filens mappe.

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

Udførelsesresultat.

# [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" !!

Den samme behandling kan udføres uafhængigt af den aktuelle mappe ved kørselstid.

Som vi har vist, er det muligt at indlæse filer baseret på scriptfilens placering, uafhængigt af den aktuelle mappe på køretid, ved hjælp af en af følgende metoder.

  • Sammenkæd mappen for den kørende fil og den relative sti til den fil, der skal læses fra den kørende fil, ved hjælp af os.path.join().
  • Flytter den aktuelle mappe til mappen for den fil, der er under udførelse.

Det er nemmere at flytte den aktuelle mappe, men hvis du vil læse eller skrive flere filer derefter, skal du naturligvis tage hensyn til, at den aktuelle mappe er blevet flyttet.

Resultaterne af de foregående eksempler er opsummeret nedenfor.

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" !!

Resultatet af angivelsen af den absolutte sti er som følger.

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" !!

Resultatet af at flytte den aktuelle mappe i terminalen og udføre den samme scriptfil er vist nedenfor. Du kan se, at den samme fil kan læses, selv om den udføres fra et andet sted.

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" !!

Copied title and URL