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?

Dengan mudah
sumber

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'
fedorqui 'JADI berhenti merugikan'
sumber
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]
idjaw
sumber
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)
dfresh22
sumber
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'
Anand S Kumar
sumber
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
tjd sydney
sumber
1

Anda dapat menggunakan pathlib

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

Keluaran di atas adalah ini:

'folder2'
Allen Jing
sumber
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 '\\'

Renato Alves
sumber