คุณสามารถวนซ้ำos.path.splitสตริงได้
import os
def parts(path):
p,f = os.path.split(path)
return parts(p) + [f] if f else [p]
ทดสอบสิ่งนี้กับสตริงพา ธ บางส่วนและประกอบพา ธ อีกครั้งด้วย os.path.join
>>> for path in [
... r'd:\stuff\morestuff\furtherdown\THEFILE.txt',
... '/path/to/file.txt',
... 'relative/path/to/file.txt',
... r'C:\path\to\file.txt',
... r'\\host\share\path\to\file.txt',
... ]:
... print parts(path), os.path.join(*parts(path))
...
['d:\\', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt'] d:\stuff\morestuff\furtherdown\THEFILE.txt
['/', 'path', 'to', 'file.txt'] /path\to\file.txt
['', 'relative', 'path', 'to', 'file.txt'] relative\path\to\file.txt
['C:\\', 'path', 'to', 'file.txt'] C:\path\to\file.txt
['\\\\', 'host', 'share', 'path', 'to', 'file.txt'] \\host\share\path\to\file.txt
องค์ประกอบแรกของรายการอาจต้องได้รับการปฏิบัติแตกต่างกันไปขึ้นอยู่กับวิธีที่คุณต้องการจัดการกับอักษรระบุไดรฟ์เส้นทาง UNC และเส้นทางสัมบูรณ์และเส้นทางสัมพัทธ์ การเปลี่ยนครั้งสุดท้าย[p]เพื่อ[os.path.splitdrive(p)]บังคับให้เกิดปัญหาโดยการแยกอักษรระบุไดรฟ์และไดเรกทอรีออกเป็นทูเปิล
import os
def parts(path):
p,f = os.path.split(path)
return parts(p) + [f] if f else [os.path.splitdrive(p)]
[('d:', '\\'), 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']
[('', '/'), 'path', 'to', 'file.txt']
[('', ''), 'relative', 'path', 'to', 'file.txt']
[('C:', '\\'), 'path', 'to', 'file.txt']
[('', '\\\\'), 'host', 'share', 'path', 'to', 'file.txt']
แก้ไข: ฉันได้ตระหนักว่าคำตอบนี้จะคล้ายกับที่ดังกล่าวข้างต้นโดยuser1556435 ฉันทิ้งคำตอบไว้เนื่องจากการจัดการส่วนประกอบของไดรฟ์ของเส้นทางนั้นแตกต่างกัน
os.path.splitมันไม่ได้ผลสำหรับคุณเพราะคุณไม่ได้ใช้สตริงนั้นอย่างถูกต้อง