รับชื่อโฟลเดอร์ของไฟล์ใน Python


93

ใน Python ฉันควรใช้คำสั่งอะไรเพื่อตั้งชื่อโฟลเดอร์ที่มีไฟล์ที่ฉันกำลังทำงานอยู่

"C:\folder1\folder2\filename.xml"

นี่"folder2"คือสิ่งที่ฉันต้องการได้รับ

สิ่งเดียวที่ฉันคิดขึ้นมาคือใช้os.path.splitสองครั้ง:

folderName = os.path.split(os.path.split("C:\folder1\folder2\filename.xml")[0])[1]

มีวิธีไหนที่ดีกว่านี้ไหม


คำตอบ:


173

คุณสามารถใช้dirname:

os.path.dirname(path)

ส่งคืนชื่อไดเร็กทอรีของพา ธ ชื่อพา ธ นี่คือองค์ประกอบแรกของคู่ที่ส่งคืนโดยส่งเส้นทางไปยังฟังก์ชันแยก ()

เมื่อกำหนดเส้นทางแบบเต็มแล้วคุณสามารถแยกได้ตามปกติเพื่อรับส่วนสุดท้ายของเส้นทาง ตัวอย่างเช่นโดยใช้basename:

os.path.basename(path)

ส่งคืนชื่อฐานของพา ธ ชื่อพา ธ นี่คือองค์ประกอบที่สองของคู่ที่ส่งคืนโดยส่งเส้นทางไปยังฟังก์ชันแยก () โปรดทราบว่าผลลัพธ์ของฟังก์ชันนี้แตกต่างจากโปรแกรม Unix basename โดยที่ basename สำหรับ '/ foo / bar /' return 'bar' ฟังก์ชัน basename () จะส่งคืนสตริงว่าง ('')


ทั้งหมดเข้าด้วยกัน:

>>> import os
>>> path=os.path.dirname("C:/folder1/folder2/filename.xml")
>>> path
'C:/folder1/folder2'
>>> os.path.basename(path)
'folder2'

17

คุณกำลังมองหาที่จะใช้dirname ถ้าคุณต้องการที่ไดเรกทอรีหนึ่งคุณสามารถใช้os.path.basename ,

เมื่อรวมทั้งหมดเข้าด้วยกันจะมีลักษณะดังนี้:

os.path.basename(os.path.dirname('dir/sub_dir/other_sub_dir/file_name.txt'))

ที่จะทำให้คุณ "other_sub_dir"

ต่อไปนี้ไม่ใช่แนวทางที่ดีที่สุด แต่ตอนแรกฉันเสนอโดยใช้ os.path.split และรับรายการสุดท้าย ซึ่งจะมีลักษณะดังนี้:

os.path.split(os.path.dirname('dir/sub_dir/other_sub_dir/file_name.txt'))[-1]

9

นี้เก่าสวย แต่ถ้าคุณกำลังใช้งูหลาม 3.4 หรือการใช้งานดังกล่าวข้างต้นPathLib

# using OS
import os
path=os.path.dirname("C:/folder1/folder2/filename.xml")
print(path)
print(os.path.basename(path))

# using pathlib
import pathlib
path = pathlib.PurePath("C:/folder1/folder2/filename.xml")
print(path.parent)
print(path.parent.name)

8

os.path.dirname คือสิ่งที่คุณกำลังมองหา -

os.path.dirname(r"C:\folder1\folder2\filename.xml")

ตรวจสอบให้แน่ใจว่าคุณrนำหน้าสตริงเพื่อให้ถือว่าเป็นสตริงดิบ

การสาธิต -

In [46]: os.path.dirname(r"C:\folder1\folder2\filename.xml")
Out[46]: 'C:\\folder1\\folder2'

หากคุณต้องการfolder2คุณสามารถใช้os.path.basenameกับตัวอย่างข้างต้น -

os.path.basename(os.path.dirname(r"C:\folder1\folder2\filename.xml"))

การสาธิต -

In [48]: os.path.basename(os.path.dirname(r"C:\folder1\folder2\filename.xml"))
Out[48]: 'folder2'

1

คุณสามารถรับเส้นทางแบบเต็มเป็นสตริงจากนั้นแยกเป็นรายการโดยใช้อักขระตัวคั่นของระบบปฏิบัติการของคุณ จากนั้นคุณจะได้รับชื่อโปรแกรมชื่อโฟลเดอร์และอื่น ๆ โดยการเข้าถึงองค์ประกอบจากท้ายรายการโดยใช้ดัชนีเชิงลบ

แบบนี้:

import os
strPath = os.path.realpath(__file__)
print( f"Full Path    :{strPath}" )
nmFolders = strPath.split( os.path.sep )
print( "List of Folders:", nmFolders )
print( f"Program Name :{nmFolders[-1]}" )
print( f"Folder Name  :{nmFolders[-2]}" )
print( f"Folder Parent:{nmFolders[-3]}" )

ผลลัพธ์ของข้างต้นคือ:

Full Path    :C:\Users\terry\Documents\apps\environments\dev\app_02\app_02.py
List of Folders: ['C:', 'Users', 'terry', 'Documents', 'apps', 'environments', 'dev', 'app_02', 'app_02.py']
Program Name :app_02.py
Folder Name  :app_02
Folder Parent:dev


0

ฉันใช้ 2 วิธีในการตอบสนองแบบเดียวกัน: หนึ่งในนั้นใช้:

   os.path.basename(filename)

เนื่องจากข้อผิดพลาดที่พบในสคริปต์ของฉันฉันจึงเปลี่ยนเป็น:

Path = filename[:(len(filename)-len(os.path.basename(filename)))]

มันเป็นวิธีแก้ปัญหาเนื่องจาก python '\\'

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.