Dapatkan nama folder dari file tersebut dengan Python


93

Dengan Python, perintah apa yang harus saya gunakan untuk mendapatkan nama folder yang berisi file yang saya kerjakan?

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

Inilah "folder2"yang ingin saya dapatkan.

Satu-satunya hal yang saya temukan adalah menggunakan os.path.splitdua kali:

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

Apakah ada cara yang lebih baik untuk melakukannya?


Jawaban:


173

Anda dapat menggunakan dirname:

os.path.dirname(path)

Kembalikan nama direktori jalur nama jalur. Ini adalah elemen pertama dari pasangan yang dikembalikan dengan meneruskan jalur ke fungsi split ().

Dan diberi jalur lengkap, maka Anda dapat membagi secara normal untuk mendapatkan bagian terakhir dari jalur tersebut. Misalnya dengan menggunakan basename:

os.path.basename(path)

Kembalikan nama dasar jalur nama jalur. Ini adalah elemen kedua dari pasangan yang dikembalikan dengan meneruskan jalur ke fungsi split (). Perhatikan bahwa hasil dari fungsi ini berbeda dari program basename Unix; di mana nama dasar untuk '/ foo / bar /' mengembalikan 'bar', fungsi basename () mengembalikan string kosong ('').


Bersama:

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

17

Anda ingin menggunakan dirname . Jika Anda hanya menginginkan satu direktori itu, Anda dapat menggunakan os.path.basename ,

Jika disatukan, tampilannya akan seperti ini:

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

Itu akan membuat Anda "other_sub_dir"

Berikut ini bukan pendekatan yang ideal, tetapi saya awalnya mengusulkan, menggunakan os.path.split, dan hanya mendapatkan item terakhir. yang akan terlihat seperti ini:

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

9

ini cukup tua, tetapi jika Anda menggunakan Python 3.4 atau lebih tinggi gunakan 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 adalah apa yang kamu cari -

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

Pastikan Anda menambahkan rstring sehingga dianggap sebagai string mentah.

Demo -

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

Jika Anda hanya ingin folder2, Anda dapat menggunakan os.path.basenamedengan di atas, Contoh -

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

Demo -

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

1

Anda bisa mendapatkan jalur lengkap sebagai string lalu membaginya menjadi daftar menggunakan karakter pemisah sistem operasi Anda. Kemudian Anda mendapatkan nama program, nama folder, dll. Dengan mengakses elemen dari akhir daftar menggunakan indeks negatif.

Seperti ini:

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]}" )

Keluaran di atas adalah ini:

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

1

Anda dapat menggunakan pathlib

from pathlib import Path
Path(r"C:\folder1\folder2\filename.xml").parts[-2]

Keluaran di atas adalah ini:

'folder2'

0

Saya menggunakan 2 cara untuk mendapatkan respons yang sama: salah satunya menggunakan:

   os.path.basename(filename)

karena kesalahan yang saya temukan di skrip saya, saya berubah menjadi:

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

itu solusi karena python '\\'

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.