2008-09-09 17 views
455

Biorąc pod uwagę ścieżkę taką jak "mydir/myfile.txt", jak znaleźć bezwzględną ścieżkę do pliku względem bieżącego katalogu roboczego w Pythonie? Na przykład. w systemie Windows, może skończyć z:Jak uzyskać bezwzględną ścieżkę do pliku w języku Python

"C:/example/cwd/mydir/myfile.txt" 
+0

Podobne pytanie: https://stackoverflow.com/questions/7165 749/open-file-in-a-relative-location-in-python – Raj

Odpowiedz

641
>>> import os 
>>> os.path.abspath("mydir/myfile.txt") 
'C:/example/cwd/mydir/myfile.txt' 

działa także jeśli jest to już absolutna ścieżka:

>>> import os 
>>> os.path.abspath("C:/example/cwd/mydir/myfile.txt") 
'C:/example/cwd/mydir/myfile.txt' 
+16

Uwaga: Na większości platform jest to równoważne wywołaniu funkcji 'normpath()' w następujący sposób: 'normpath (join (os.getcwd(), ścieżka)) '. Więc jeśli 'mydir/myfile.txt' nie jest pod' os.getcwd() ', bezwzględną ścieżką jest __niesta ścieżka__. – coanor

+23

@coanor? Bez jawnego katalogu głównego, 'mojir/mójplik.txt' niejawnie odwołuje się do ścieżki wewnątrz bieżącego katalogu roboczego, dlatego jest to odpowiednik'./Mydir/myfile.txt'. To może nie być ścieżka, którą zamierzałeś wprowadzić, ale wydaje się, że jest to właściwa interpretacja ścieżki, o ile mogę to stwierdzić. Czy mógłbyś rozwinąć? – jpmc26

47
>>> import os 
>>> os.path.abspath('mydir/myfile.txt') 
'C:\\example\\cwd\\mydir\\myfile.txt' 
>>> 
21

Jeszcze lepiej, należy zainstalować moduł path.py, owija wszystko Funkcje os.path i inne powiązane funkcje w metodach obiektu, które mogą być używane wszędzie tam, gdzie używane są ciągi:

>>> from path import path 
>>> path('mydir/myfile.txt').abspath() 
'C:\\example\\cwd\\mydir\\myfile.txt' 
>>> 
+2

Szkoda, że ​​nigdy nie dostali właściwego pliku abstrakcji do pliku stdlib. –

+1

@Torsten Marek: to bolesne i długotrwałe zaniedbanie. – flow

+4

Zrobili to teraz dla Pythona 3.4: 'pathlib'. Zobacz moją odpowiedź w tym wątku. – twasbrillig

42

Można użyć nowej biblioteki Python 3.4 pathlib. (Można go również uzyskać w języku Python w wersji 2.6 lub 2.7, używając pip install pathlib.) Autorzy wrote: "Celem tej biblioteki jest dostarczenie prostej hierarchii klas do obsługi ścieżek systemu plików i typowych operacji wykonywanych przez użytkowników."

Aby uzyskać bezwzględną ścieżkę w systemie Windows:

>>> from pathlib import Path 
>>> p = Path("pythonw.exe").resolve() 
>>> p 
WindowsPath('C:/Python27/pythonw.exe') 
>>> str(p) 
'C:\\Python27\\pythonw.exe' 

lub na UNIX:

>>> from pathlib import Path 
>>> p = Path("python3.4").resolve() 
>>> p 
PosixPath('/opt/python3/bin/python3.4') 
>>> str(p) 
'/opt/python3/bin/python3.4' 

Docs tutaj: https://docs.python.org/3/library/pathlib.html

+3

Bardzo pomocny. Użycie 'os.path.abspath()' spowodowało błąd: 'AttributeError: Obiekt 'NoneType' nie ma atrybutu" startswith'', używając 'Path(). Resolve()' nie ma tej samej względnej ścieżki pliku. (Linux i Python3.4) – NuclearPeon

3

wolę używać GLOB

tutaj jest jak wyświetlić listę wszystkich typów plików w bieżącym folderze:

import glob 
for x in glob.glob(): 
    print(x) 

oto jak notować wszystko (na przykład) pliki .txt w bieżącym folderze:

import glob 
for x in glob.glob('*.txt'): 
    print(x) 

tutaj jest jak lista wszystkich typów plików w katalogu: wybrał

import glob 
for x in glob.glob('C:/example/hi/hello/'): 
    print(x) 

Mam nadzieję, że to pomogło Ci

+0

Wygląda na to, że odpowiadasz na inne pytanie. Nie było "Jak uzyskać ścieżkę?", Ale "absolutną ścieżkę". Można zastosować poprawną odpowiedź ('os.path.abspath()') na dowolną ścieżkę względną "glob" dla twoich pierwszych dwóch przypadków ... – NichtJens

-2
filePath = os.path.abspath(directoryName) 
filePathWithSlash = filePath + "\\" 
filenameWithPath = os.path.join(filePathWithSlash, filename) 
+0

Pytanie nie brzmiało, jak zmienić nazwy obrazów lub coś podobnego. Zapytano go tylko o twoją piątą linię 'filePath = os.path ...' – derM

+0

derM tak, masz rację, patrzyłem na coś innego, kiedy to opublikowałem. Usunąłem to, co nie ma związku z pytaniem na tej stronie. –

Powiązane problemy