โอเค ... ฉันไม่รู้ว่าโมดูลอยู่ที่ไหนx
แต่ฉันรู้ว่าฉันต้องได้รับเส้นทางไปยังไดเร็กทอรีสองระดับขึ้นไป
มีวิธีที่สวยงามกว่านี้ไหมที่จะทำ:
import os
two_up = os.path.dirname(os.path.dirname(__file__))
ยินดีต้อนรับโซลูชั่นสำหรับทั้ง Python 2 และ 3!
โอเค ... ฉันไม่รู้ว่าโมดูลอยู่ที่ไหนx
แต่ฉันรู้ว่าฉันต้องได้รับเส้นทางไปยังไดเร็กทอรีสองระดับขึ้นไป
มีวิธีที่สวยงามกว่านี้ไหมที่จะทำ:
import os
two_up = os.path.dirname(os.path.dirname(__file__))
ยินดีต้อนรับโซลูชั่นสำหรับทั้ง Python 2 และ 3!
pip install pathlib2
ตัวเลือกในการรักษาสุขภาพใน 2.7
คำตอบ:
คุณสามารถใช้pathlib
. น่าเสียดายที่มีอยู่ใน stdlib สำหรับ Python 3.4 เท่านั้น ถ้าคุณมีรุ่นเก่าที่คุณจะต้องติดตั้งสำเนาจาก PyPI ที่นี่ pip
นี้ควรจะเป็นเรื่องง่ายที่จะทำโดยใช้
from pathlib import Path
p = Path(__file__).parents[1]
print(p)
# /absolute/path/to/two/levels/up
สิ่งนี้ใช้parents
ลำดับที่ให้การเข้าถึงไดเร็กทอรีพาเรนต์และเลือกไดเร็กทอรีที่ 2 ขึ้นไป
โปรดทราบว่าp
ในกรณีนี้จะเป็นรูปแบบของPath
วัตถุโดยมีวิธีการของตนเอง หากคุณต้องการเส้นทางเป็นสตริงคุณสามารถเรียกstr
ใช้งานได้
Path
คลาสparents
ขึ้นอยู่กับสถานที่ดำเนินการ หากคุณดำเนินการ__file__
จากไดเร็กทอรีปัจจุบันPath
คลาสจะไม่มีผู้ปกครอง ควรยอมรับคำตอบของ @ Sebi2020 หรือควรใช้วิธีการเดิมของคุณ ฉันเชื่อว่าวิธีการเดิมของคุณอ่านง่ายกว่า
p = Path(os.path.abspath(__file__)).parents[1]
os.path.abspath
ใช้Path(__file__).resolve().parents[1]
p = Path(__file__).resolve().parents[1]
. ฉันยังเพิ่มเป็นคำตอบ
ง่ายมาก:
นี่คือสิ่งที่คุณต้องการ:
import os.path as path
two_up = path.abspath(path.join(__file__ ,"../.."))
os.pardir
..
__file__
.
ฉันจะเพิ่มสิ่งนี้เพื่อเป็นเรื่องโง่ ๆ แต่ก็เป็นเพราะมันแสดงให้ผู้มาใหม่เห็นถึงประโยชน์ที่เป็นไปได้ของฟังก์ชันนามแฝงและ / หรือการนำเข้า
เมื่อเขียนแล้วฉันคิดว่ารหัสนี้อ่านได้ง่ายกว่า (เช่นใช้เวลาในการเข้าใจความตั้งใจน้อยกว่า) มากกว่าคำตอบอื่น ๆ ในปัจจุบันและความสามารถในการอ่านคือ (โดยปกติ)
from os.path import dirname as up
two_up = up(up(__file__))
หมายเหตุ: คุณต้องการทำสิ่งนี้ก็ต่อเมื่อโมดูลของคุณมีขนาดเล็กมากหรือสอดคล้องกันตามบริบท
ทางออกที่ดีที่สุด (สำหรับ python> = 3.4) เมื่อเรียกใช้งานจากไดเร็กทอรีใด ๆ คือ:
from pathlib import Path
two_up = Path(__file__).resolve().parents[1]
สำหรับการอัพไดเร็กทอรี 2 ระดับ:
import os.path as path
two_up = path.abspath(path.join(os.getcwd(),"../.."))
โดยส่วนตัวแล้วฉันพบว่าการใช้โมดูลระบบปฏิบัติการเป็นวิธีที่ง่ายที่สุดดังที่ระบุไว้ด้านล่าง หากคุณขึ้นไปเพียงหนึ่งระดับให้แทนที่ ('../ .. ') ด้วย ('.. ')
import os
os.chdir('../..')
--Check:
os.getcwd()
ฉันพบว่าสิ่งต่อไปนี้ใช้งานได้ดีใน 2.7.x
import os
two_up = os.path.normpath(os.path.join(__file__,'../'))
คุณสามารถใช้สิ่งนี้เป็นวิธีแก้ปัญหาทั่วไป:
import os
def getParentDir(path, level=1):
return os.path.normpath( os.path.join(path, *([".."] * level)) )
การใช้งานข้ามแพลตฟอร์มเพิ่มเติม ได้แก่ :
import pathlib
two_up = (pathlib.Path(__file__) / ".." / "..").resolve()
ใช้parent
ไม่ได้รับการสนับสนุนบน Windows ยังต้องเพิ่ม.resolve()
ไปที่:
ทำให้เส้นทางเป็นค่าสัมบูรณ์แก้ไขลิงก์สัญลักษณ์ทั้งหมดระหว่างทางและทำให้เป็นปกติ (เช่นเปลี่ยนเครื่องหมายทับเป็นแบ็กสแลชใน Windows)
parent
ไม่ทำงานบน Windows หรือไม่? ดูเหมือนว่าจะได้รับการแก้ไขในบางครั้งเนื่องจากคุณเขียนความคิดเห็นนี้ ใช้งานได้ดีสำหรับฉันโดยใช้ Python 3.7.2 บน Windows 10
parent
ทำงานบน windows 10 ด้วย python 3.6.5 คุณกำลังพูดถึง @Zhukovgeen เวอร์ชันไหน
สมมติว่าคุณต้องการเข้าถึงโฟลเดอร์ชื่อ xzy สองโฟลเดอร์ขึ้นไฟล์ python ของคุณ สิ่งนี้ใช้ได้กับฉันและเป็นอิสระจากแพลตฟอร์ม
".././xyz"
ฉันยังไม่เห็นคำตอบที่ใช้ได้สำหรับ 2.7 ซึ่งไม่จำเป็นต้องติดตั้งการอ้างอิงเพิ่มเติมและเริ่มจากไดเร็กทอรีของไฟล์ มันไม่ดีเท่าโซลูชันแบบบรรทัดเดียว แต่ไม่มีอะไรผิดปกติกับการใช้ยูทิลิตี้มาตรฐาน
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
และเพื่อพิสูจน์ว่ามันใช้งานได้ที่นี่ฉันเริ่มต้น~/Documents/notes
เพียงเพื่อที่ฉันจะแสดงไดเร็กทอรีปัจจุบันไม่ส่งผลต่อผลลัพธ์ ฉันวางไฟล์ที่grandpa.py
มีสคริปต์นั้นไว้ในโฟลเดอร์ชื่อ "scripts" มันจะรวบรวมข้อมูลไปยัง dir Documents จากนั้นไปยังผู้ใช้ dir บน Mac
(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
นี่คือการคาดการณ์ที่ชัดเจนของคำตอบสำหรับผบ . ผู้ปกครอง ดีกว่าที่จะใช้โซลูชันทั่วไปมากกว่าโซลูชันที่ดีน้อยในจำนวนบรรทัดน้อย
pathlib
วิธีการแก้ปัญหาเป็นดีกว่าเล็ก ๆ น้อย ๆ และสามารถอ่านได้มากขึ้น แต่จะไม่รวมกับงูหลาม 2.7 ฉันจะบอกว่ายึดติดกับสิ่งที่คุณมีอาจจะเพิ่มความคิดเห็น