Zoek huidige directory en bestandsdirectory

Welke commando’s kan ik in Python gebruiken om te vinden:

  1. de huidige map (waar ik in de terminal was toen ik het Python-script uitvoerde), en
  2. waar is het bestand dat ik aan het uitvoeren ben?

Antwoord 1, autoriteit 100%

Om het volledige pad te krijgen naar de map waarin een Python-bestand zich bevindt, schrijft u dit in dat bestand:

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

(Merk op dat de bovenstaande bezwering niet werkt als u os.chdir() al hebt gebruikt om uw huidige werkmap te wijzigen, aangezien de waarde van de __file__ constante is relatief aan de huidige werkmap en wordt niet gewijzigd door een os.chdir() aanroep.)


Om de huidige werkmap te krijgen, gebruik

import os
cwd = os.getcwd()

Documentatieverwijzingen voor de hierboven gebruikte modules, constanten en functies:

  • De os en os.path modules.
  • De __file__ constante
  • os.path.realpath(path) (retourneert “het canonieke pad van de opgegeven bestandsnaam, waarbij alle symbolische koppelingen in het pad worden geëlimineerd”)
  • os.path.dirname(path) (retourneert “de mapnaam van padnaam Path)
  • os.getcwd() (retourneert “een string die de huidige werkdirectory vertegenwoordigt”)
  • os.chdir(path) ( “wijzig de huidige werkmap in Path)

Antwoord 2, autoriteit 9%

Huidige werkmap: os.getcwd()

En het __file__-kenmerk kan je helpen erachter te komen waar het bestand dat u uitvoert zich bevindt. Dit SO-bericht legt alles uit: Hoe krijg ik het pad van het huidige uitgevoerde bestand in Python?


Antwoord 3, autoriteit 8%

Misschien vindt u dit nuttig als referentie:

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

Antwoord 4, autoriteit 4%

pathlib-module, geïntroduceerd in Python 3.4 (PEP 428 De pathlib-module objectgeoriënteerde bestandssysteempaden), maakt padgerelateerde ervaring veel beter.

$ pwd
/home/skovorodkin/stack
$ tree
.
L-- scripts
    +-- 1.py
    L-- 2.py

Om de huidige werkmap te krijgen, gebruikt u Path.cwd():

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

Om een ​​absoluut pad naar uw scriptbestand te krijgen, gebruikt u Path.resolve() methode:

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

En om het pad van een map te krijgen waar uw script zich bevindt, gaat u naar .parent (het wordt aanbevolen om .resolve() aan te roepen vóór .parent):

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

Onthoud dat __file__ in sommige situaties niet betrouwbaar is: Hoe krijg ik het pad van het huidige uitgevoerde bestand in Python?.


Houd er rekening mee dat Path.cwd(), Path.resolve() en andere Path-methoden padobjecten retourneren (PosixPath in mijn geval), geen strings. In Python 3.4 en 3.5 veroorzaakte dat wat pijn, omdat open De ingebouwde functie kon alleen werken met string- of bytes-objecten en ondersteunde geen Path-objecten, dus je moest Path-objecten converteren naar strings of Path.open() methode, maar voor de laatste optie moest je de oude code wijzigen:

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

Zoals je kunt zien, werkt open(p) niet met Python 3.5.

PEP 519 Een bestandssysteempadprotocol toevoegen, geïmplementeerd in Python 3.6, voegt ondersteuning toe van PathLike maakt bezwaar tegen de functie open, dus nu kan Path objecten direct doorgeven aan de open functie:

$ python3.6 scripts/2.py
OK

Antwoord 5, autoriteit 2%

1.Om het volledige pad van de huidige map te krijgen

    >>import os
    >>print os.getcwd()

o/p:”C :\Gebruikers\admin\mijnmap”

1.Om alleen de huidige mapnaam te krijgen

    >>import os
    >>str1=os.getcwd()
    >>str2=str1.split('\\')
    >>n=len(str2)
    >>print str2[n-1]

o/p:”mijnmap”


Antwoord 6

Als u de huidige map probeert te vinden van het bestand waarin u zich momenteel bevindt:

OS-agnostische manier:

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

Antwoord 7

Pathlib kan op deze manier worden gebruikt om de map met het huidige script op te halen:

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

Antwoord 8

Als je Python 3.4 gebruikt, is er de gloednieuwe pathlib-module op een hoger niveau waarmee je gemakkelijk pathlib.Path.cwd() kunt aanroepen om een Path-object dat uw huidige werkdirectory vertegenwoordigt, samen met vele andere nieuwe functies.

Meer informatie over deze nieuwe API vindt u hier.


Antwoord 9

Om het volledige pad van de huidige map te krijgen:

os.path.realpath('.')

Antwoord 10

Antwoord op #1:

Als u de huidige directory wilt, doet u dit:

import os
os.getcwd()

Als je maar een willekeurige mapnaam wilt en je hebt het pad naar die map, doe dan dit:

def get_folder_name(folder):
    '''
    Returns the folder name, given a full folder path
    '''
    return folder.split(os.sep)[-1]

Antwoord op #2:

import os
print os.path.abspath(__file__)

Antwoord 11

Een beetje laat voor het feest, maar ik denk dat de meest beknopte manier om de naam van je huidige uitvoeringscontext te vinden, zou zijn

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

Antwoord 12

Als u zoekt naar de locatie van het momenteel uitgevoerde script, kunt u sys.argv[0] gebruiken om het volledige pad te krijgen.


Antwoord 13

Gebruik voor vraag 1 os.getcwd() # get working dir en os.chdir(r'D:\Steam\steamapps\common') # set working dir


Ik raad aan om sys.argv[0] te gebruiken voor vraag 2 omdat sys.argv onveranderlijk is en daarom altijd het huidige bestand retourneert (module objectpad) en niet wordt beïnvloed door os.chdir(). Je kunt ook als volgt doen:

import os
this_py_file = os.path.realpath(__file__)
# vvv Below comes your code vvv #

maar dat fragment en sys.argv[0] zullen niet werken of zullen raar werken wanneer het wordt gecompileerd door PyInstaller omdat magische eigenschappen niet zijn ingesteld op het niveau __main__ en sys.argv[0] is de manier waarop je exe werd aangeroepen (betekent dat het wordt beïnvloed door de werkmap).

LEAVE A REPLY

Please enter your comment!
Please enter your name here

7 + 16 =

Other episodes