python: dizini iki seviye yukarı getir


89

Tamam ... Modülün nerede xolduğunu bilmiyorum ama iki seviye yukarı dizine giden yolu bulmam gerektiğini biliyorum.

Öyleyse, yapmanın daha zarif bir yolu var mı:

import os
two_up = os.path.dirname(os.path.dirname(__file__))

Hem Python 2 hem de 3 için çözümlere açığız!


1
Bence çözümün gayet iyi. Bir pathlibçözüm biraz daha güzel ve daha okunabilir, ancak Python 2.7 ile dahil değildir. Elinizdekilere sadık kalın derim, belki bir yorum ekleyin.
jme

Belki de pip install pathlib22.7'de akıl sağlığını koruma seçeneğini eklemeye değer .
jonathan

Yanıtlar:


107

Kullanabilirsiniz pathlib. Ne yazık ki bu yalnızca Python 3.4 için stdlib'de mevcuttur. Daha eski bir sürüme sahipseniz, PyPI'den bir kopyasını buraya yüklemeniz gerekir . Bunu kullanmak kolay olmalı pip.

from pathlib import Path

p = Path(__file__).parents[1]

print(p)
# /absolute/path/to/two/levels/up

Bu parents, ana dizinlere erişim sağlayan ve 2. dizini yukarı seçen diziyi kullanır .

pBu durumda, Pathkendi yöntemleriyle bir tür nesne olacağını unutmayın . Yollara dizge olarak ihtiyacınız varsa str, onları çağırabilirsiniz .


Bu güzel bir cevap, teşekkürler ve py3 için harika. Yarattığı ve ekstra bağımlılık olarak py2 için bunu daha iyi benim ilk denemede daha mümkün değildir
jramm

16
PathSınıfın parentsyürütme konumuna bağlı olduğu için bu kabul edilen cevap olmamalıdır . Eğer __file__kendi geçerli dizininden kendi başlığınızı çalıştırırsanız , Pathsınıfın ebeveynleri olmayacaktır. @ Sebi2020'nin yanıtı kabul edilmeli veya orijinal yönteminiz kullanılmalıdır. Orijinal yönteminizin daha okunaklı olduğuna inanıyorum.
Red-Tune-84

1
Yapmanız gerekebilirp = Path(os.path.abspath(__file__)).parents[1]
Adam Raudonis

4
@AdamRaudonis Bunun yerine os.path.abspathkullanabilirsinizPath(__file__).resolve().parents[1]
Tulio Casagrande

7
@ Kazanz'ın da bahsettiği gibi, bu çözüm başka yollardan çalıştırılırken işe yaramıyor. En iyi çözümdür: p = Path(__file__).resolve().parents[1]. Ben de cevap olarak ekledim.
pythinker

48

Çok kolay:

İşte istediğiniz şey:

import os.path as path

two_up =  path.abspath(path.join(__file__ ,"../.."))

10
Ve belki os.pardiryerine kullanın ...
jme

sys.argv [0] python.exe tarafından çalıştırılan modülü döndürmüyor mu? Dolayısıyla, ilgilendiğim modül başka bir paketten ithal edilmiş olsaydı, bu işe yaramazdı .. tam burada mıyım?
jramm

Bir modülde kullanmak istiyorsanız bunun yerine kullanın __file__.
Sebi2020

1
@jme, ana dizini ".." dışında başka bir dizeyle aldığınız bir işletim sistemi biliyor musunuz ???
Sebi2020

1
@ Sebi2020 Evet, özellikle eski Mac OS. İşte bir liste: en.wikipedia.org/wiki/Path_(computing)
jme

22

Bunu sadece aptalca ekleyecektim, ama aynı zamanda yeni gelenlere takma ad işlevlerinin ve / veya içe aktarmaların potansiyel faydasını gösterdiği için.

Yazdıktan sonra, bence bu kod, bugüne kadarki diğer cevaplardan daha okunabilir (yani niyeti kavramak için daha kısa) ve okunabilirlik (genellikle) kraldır.

from os.path import dirname as up

two_up = up(up(__file__))

Not: Bu tür şeyleri yalnızca modülünüz çok küçükse veya bağlamsal olarak uyumluysa yapmak istersiniz.


14

Herhangi bir dizinden çalıştırırken en iyi çözüm (python> = 3.4 için):

from pathlib import Path
two_up = Path(__file__).resolve().parents[1]

10

Dizini 2 seviye yukarı çıkarmak için:

 import os.path as path
 two_up = path.abspath(path.join(os.getcwd(),"../.."))

4

Şahsen, os modülünü kullanmanın aşağıda belirtildiği gibi en kolay yöntem olduğunu görüyorum. Yalnızca bir seviye yukarı çıkıyorsanız, ('../ ..') yerine ('..') yazın.

    import os
    os.chdir('../..')

--Check:
    os.getcwd()

1
Os.chdir (os.join ('..', '..'))
GreenAsJade

2

2.7.x'te aşağıdakilerin iyi çalıştığını buldum

import os
two_up = os.path.normpath(os.path.join(__file__,'../'))

2

Bunu genel bir çözüm olarak kullanabilirsiniz:

import os

def getParentDir(path, level=1):
  return os.path.normpath( os.path.join(path, *([".."] * level)) )

@ JanSila: daha spesifik olabilir, neden pitonik değil? Okunabilirlik için, bunun ne yaptığını daha fazla yorum alabilir, evet - ama sonunda standart python dili özelliklerini kullanıyor, örneğin stackoverflow.com/questions/36901
Axel Heider

Biraz yoğun, ama bunun çok soyut ve okunaklı olmadığını düşünüyorum. Burada yayınlanan diğer cevapların genelleştirilmiş bir versiyonudur. Yine de, bir işlevi uygulamaya ihtiyaç duymadan işleri yapmanın standart bir kütüphane yolunu istiyorum.
ryanjdillon

1

Daha fazla platformlar arası uygulama şu şekilde olacaktır:

import pathlib
two_up = (pathlib.Path(__file__) / ".." / "..").resolve()

Kullanılması parentWindows üzerinde desteklenmez. Ayrıca eklemeniz gerekiyor.resolve() şunları :

Yoldaki tüm sembolik bağları çözerek ve aynı zamanda normalleştirerek yolu mutlak yapın (örneğin, Windows altında eğik çizgileri ters eğik çizgilere dönüştürmek)


2
parentWindows üzerinde çalışmamak için bir kaynağınız var mı? Bu yorumu yazdığınızdan beri bir süre düzelmiş gibi görünüyor. Windows 10'da Python 3.7.2 kullanıyorum benim için iyi çalışıyor
Nathan

parentpython 3.6.5 ile Windows 10 üzerinde çalışabilirim . @ Zhukovgeen hangi python sürümünden bahsediyorsunuz?
ggulgulia

@ggulgulia 3.7 olduğuna inanıyorum
zhukovgreen

1

Python dosyanızdaki iki klasör xzy adlı klasöre erişmek istediğinizi varsayarsak. Bu benim için çalışıyor ve platformdan bağımsız.

".././xyz"


0

(yollib.Yol ('../../')) .resolve ()


Modüle göre değil çalışma dizinine göre yolu verir
jramm

-1

Ek bağımlılıklar yüklemeyi gerektirmeyen ve ayrıca dosyanın dizininden başlayan 2.7 için henüz geçerli bir cevap göremiyorum. Tek satırlık bir çözüm olarak hoş değil, ancak standart yardımcı programları kullanmanın yanlış bir yanı yok.

import os

grandparent_dir = os.path.abspath(  # Convert into absolute path string
    os.path.join(  # Current file's grandparent directory
        os.path.join(  # Current file's parent directory
            os.path.dirname(  # Current file's directory
                os.path.abspath(__file__)  # Current file path
            ),
            os.pardir
        ),
        os.pardir
    )
)

print grandparent_dir

Ve işe yaradığını kanıtlamak için, burada başlıyorum, ~/Documents/notesböylece mevcut dizinin sonucu etkilemeyeceğini gösteriyorum. grandpa.pyBu komut dosyasını içeren dosyayı "komut dosyaları" adlı bir klasöre koydum . Bir Mac'te Belgeler dizinine ve ardından kullanıcı dizinine kadar tarar.

(testing)AlanSE-OSX:notes AlanSE$ echo ~/Documents/scripts/grandpa.py 
/Users/alancoding/Documents/scripts/grandpa.py
(testing)AlanSE-OSX:notes AlanSE$ python2.7 ~/Documents/scripts/grandpa.py 
/Users/alancoding

Bu, ana dizin için yanıtın açık bir ekstrapolasyonudur . Daha az satırda daha az iyi bir çözüm yerine genel bir çözüm kullanmak daha iyidir.

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.