Python'da mutlak bir dosya yolu nasıl edinilir


Yanıtlar:


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

Ayrıca zaten mutlak bir yolsa da çalışır:

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

29
Not: Çoğu platformlarda, bu işlevi çağırmak aynıdır normpath()şöyle: normpath(join(os.getcwd(), path)). Eğer mydir/myfile.txtaltında değilse os.getcwd(), mutlak yol gerçek yol değildir .
coanor

32
@coanor? Açık bir kök olmadan mydir/myfile.txt, geçerli çalışma dizini içindeki dolaylı olarak eşdeğer olduğu bir yolu dolaylı olarak ifade eder ./mydir/myfile.txt. Bu, girmeyi amaçladığınız yol olmayabilir, ancak anlayabildiğim kadarıyla yolun doğru yorumu gibi görünüyor. Açıklayabilir misiniz?
jpmc26

2
@ jpmc26 Coanor'u tam olarak takip etmiyorum, ama (varsaydığımın aksine), abspathişleve olan argüman ile gerçek bir dosya arasında hiçbir bağlantı olmadığını söyleyebilirim . Herhangi bir yol adı verebilir - varolmayan dosyalar ve dizin heirarchies iyi- ve abspath yolun bitlerini (üst dizin " .." öğesi dahil) çözecek ve bir dize döndürecektir. Bu sadece geçerli dizinden hesaplanan bir dizedir; gerçek bir dosya ile herhangi bir korelasyon tesadüfi, öyle görünüyor. Deneyin os.path.abspath("/wow/junk/../blha/hooey"). İşe yarıyor.
Mike S

2
@MikeS Dürüst olmak gerekirse bunun neden beklenmedik bir davranış olacağından emin değilim. Bu mutlak yol , mutlak dosya veya dizin değil. Bir varlık kontrolü istiyorsanız, arayın os.path.exists. Aksine, PowerShell gibi standart yol çözümleme fonksiyonu ile var olan yolda ısrar eden sistemler kullanmak için bir acıdır.
jpmc26

1
@ jpmc26 Bir yolun sadece bir yol adına benzeyen bir dize olduğunu varsaymak hiç de net değildir ve yıllardır yol adları hakkında nasıl düşündüğümü ve konuştuğuma ters düşmektedir. Abspath için Python 3 belgelerini alıntıladım: " Yol adı yolunun normalleştirilmiş mutlaklaştırılmış bir sürümünü döndür ." Dize yolunun " ... sürümü " değil. Posix tarafından tanımlandığı gibi bir yol adı "Dosyayı tanımlamak için kullanılan bir dize" dir. Python belgeleri açıktır relpath: "dosya sisteminin varlığını veya niteliğini doğrulamak için erişilemez path". Buradaki argüman açıksa, neden açık olmalıyım relpath?
Mike S

77

Yeni Python 3.4 kitaplığını kullanabilirsiniz pathlib. (Bunu Python 2.6 veya 2.7 kullanarak da edinebilirsiniz pip install pathlib.) Yazarlar şöyle yazdı : "Bu kütüphanenin amacı, dosya sistemi yollarını ve kullanıcıların üzerlerinde yaptıkları ortak işlemleri işlemek için basit bir sınıf hiyerarşisi sağlamaktır."

Windows'ta mutlak bir yol elde etmek için:

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

Veya UNIX'te:

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

Dokümanlar burada: https://docs.python.org/3/library/pathlib.html


4
Çok yararlı. Kullanma os.path.abspath()bana bir hata verdi:, AttributeError: 'NoneType' object has no attribute 'startswith'kullanma Path().resolve()aynı göreli dosya yoluna sahip değil. (Linux ve Python3.4)
NuclearPeon

23

Daha da iyisi, modülü kurun (üzerinde bulunur PyPI), tüm os.pathişlevleri ve diğer ilgili işlevleri, dizelerin kullanıldığı her yerde kullanılabilecek bir nesnenin yöntemlerine sarar :

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

2
Stdlib'e hiçbir zaman uygun bir dosya adı soyutlama modülü alamadıkları çok kötü.
Torsten Marek

1
@Torsten Marek: Acı çeken ve uzun süredir devam eden bir ihmal.
akış

4
Onlar Python 3.4 için şimdi yaptı: pathlib. Bu konudaki cevabımı gör.
twasbrillig

Bu cevapta yypos var. O olmalı from path import PathsonraPath('mydir/myfile.txt').abspath()
frakman1

Yazım hatası yok, farklı bir pathmodül kullanıyor olabilirsiniz . Bağlı modül adlı bir sınıf kullanır path.
Tom


10

Soruyu pathlibgerçekten cevaplayan Python 3.4+ için güncelleme :

from pathlib import Path

relative = Path("mydir/myfile.txt")
absolute = relative.absolute()  # absolute is a Path object

Yalnızca geçici bir dizeye ihtiyacınız varsa , elbette dahil Pathtüm ilgili işlevlere sahip nesneleri kullanabileceğinizi unutmayın :os.pathabspath

from os.path import abspath

absolute = abspath(relative)  # absolute is a str object

9
import os
os.path.abspath(os.path.expanduser(os.path.expandvars(PathNameString)))

expanduserDosya (veya dizin) adı ve konumu için verilen ifadenin bir ~/satır aralığı (tilde kullanıcının ana dizinine atıfta bulunur) içermesi ve expandvarsdiğer ortam değişkenleriyle (örneğin $HOME) ilgilenmesi durumunda (Unix'te) gerekli olduğuna dikkat edin .


6

Bu her zaman başka bir komut dosyası içinden denir bile mevcut senaryonun doğru dosya adını alır. Özellikle kullanışlıdır subprocess.

import sys,os

filename = sys.argv[0]

oradan, komut dosyasının tam yolunu aşağıdakilerle alabilirsiniz:

>>> os.path.abspath(filename)
'/foo/bar/script.py'

Ayrıca /.., dizinlerin hiyerarşisinde 'yukarı' gitmek istediğiniz kadar klasör ekleyerek klasörlerde gezinmeyi de kolaylaştırır .

Cwd'yi almak için:

>>> os.path.abspath(filename+"/..")
'/foo/bar'

Üst yol için:

>>> os.path.abspath(filename+"/../..")
'/foo'

"/.."Diğer dosya adlarıyla birleştirerek sistemdeki herhangi bir dosyaya erişebilirsiniz.


İstenen bu değildi. Geçerli çalışma diziniyle ilgili olarak, komut dizini ile aynı şey olmayan bir yol sordular, ancak bazen aynı değere sahip olabilirler.
Yaratılış Elementi

3

Modül osabs yolunu bulmak için bir yol sağlar.

AMA Linux'taki yolların çoğu ~(tilde) ile başlıyor , bu da tatmin edici bir sonuç vermiyor.

bunun srblibiçin kullanabilirsiniz .

>>> import os
>>> os.path.abspath('~/hello/world')
'/home/srb/Desktop/~/hello/world'
>>> from srblib import abs_path
>>> abs_path('~/hello/world')
'/home/srb/hello/world'

kullanarak yükle python3 -m pip install srblib

https://pypi.org/project/srblib/


1

Glob kullanmayı tercih ederim

geçerli klasörünüzdeki tüm dosya türlerini nasıl listeleyeceğiniz aşağıda açıklanmıştır:

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

geçerli klasörünüzdeki tüm (örneğin) .txt dosyalarını nasıl listeleyeceğiniz aşağıda açıklanmıştır:

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

seçilen bir dizindeki tüm dosya türlerini nasıl listeleyeceğiniz aşağıda açıklanmıştır:

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

umarım bu sana yardımcı olmuştur


2
Farklı bir soruya cevap veriyorsunuz. "Nasıl yol alabilirim?" Değil, "mutlak yol" idi. İlk iki durumunuz için os.path.abspath()hangi göreceli yolun sağlandığına doğru cevap ( ) uygulanabilir glob...
NichtJens

1

Mac kullanıyorsanız

import os
upload_folder = os.path.abspath("static/img/users")

bu size tam bir yol verecektir:

print(upload_folder)

aşağıdaki yolu gösterecektir:

>>>/Users/myUsername/PycharmProjects/OBS/static/img/user

1

Birisi python ve linux kullanıyorsa ve dosyanın tam yolunu arıyorsa:

>>> path=os.popen("readlink -f file").read()
>>> print path
abs/path/to/file
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.