Ekstrak bagian filepath (direktori) dengan Python


163

Saya perlu mengekstrak nama direktori induk dari jalur tertentu. Seperti inilah tampilannya:

c:\stuff\directory_i_need\subdir\file

Saya memodifikasi konten "file" dengan sesuatu yang menggunakan directory_i_neednama di dalamnya (bukan path). Saya telah membuat fungsi yang akan memberi saya daftar semua file, dan kemudian ...

for path in file_list:
   #directory_name = os.path.dirname(path)   # this is not what I need, that's why it is commented
   directories, files = path.split('\\')

   line_replace_add_directory = line_replace + directories  
   # this is what I want to add in the text, with the directory name at the end 
   # of the line.

Bagaimana saya bisa melakukan itu?


1
Anda mungkin ingin memeriksa jawaban ini: stackoverflow.com/a/4580931/311220
Acorn

Tautan di atas membantu saya memahami cara memperbaiki kesalahan yang saya lakukan. Terima kasih.
Thalia

Jawaban:


238
import os
## first file in current dir (with full path)
file = os.path.join(os.getcwd(), os.listdir(os.getcwd())[0])
file
os.path.dirname(file) ## directory of file
os.path.dirname(os.path.dirname(file)) ## directory of directory of file
...

Dan Anda dapat terus melakukan ini sebanyak yang diperlukan ...

Sunting: dari os.path , Anda dapat menggunakan os.path.split atau os.path.basename:

dir = os.path.dirname(os.path.dirname(file)) ## dir of dir of file
## once you're at the directory level you want, with the desired directory as the final path node:
dirname1 = os.path.basename(dir) 
dirname2 = os.path.split(dir)[1] ## if you look at the documentation, this is exactly what os.path.basename does.

Itu mengekstrak bagian dari path - tapi saya tidak tahu bagaimana cara mengekstrak nama direktori sebenarnya dari path.
Thalia

43

Dalam Python 3.4 Anda dapat menggunakan modul pathlib :

>>> from pathlib import Path
>>> p = Path('C:\Program Files\Internet Explorer\iexplore.exe')
>>> p.name
'iexplore.exe'
>>> p.suffix
'.exe'
>>> p.root
'\\'
>>> p.parts
('C:\\', 'Program Files', 'Internet Explorer', 'iexplore.exe')
>>> p.relative_to('C:\Program Files')
WindowsPath('Internet Explorer/iexplore.exe')
>>> p.exists()
True

demonstrasi yang bagus dari API
Nadim Farhat

Ini juga telah di-backport ke versi lama Python: pathlib2
phoenix

11

Yang Anda butuhkan hanyalah parentbagian jika Anda menggunakannya pathlib.

from pathlib import Path
p = Path(r'C:\Program Files\Internet Explorer\iexplore.exe')
print(p.parent) 

Akan menghasilkan:

C:\Program Files\Internet Explorer    

Jika Anda membutuhkan semua bagian (sudah tercakup dalam jawaban lain) gunakan parts:

p = Path(r'C:\Program Files\Internet Explorer\iexplore.exe')
print(p.parts) 

Maka Anda akan mendapatkan daftar:

('C:\\', 'Program Files', 'Internet Explorer', 'iexplore.exe')

Menghemat nada waktu.


5

Pertama, lihat apakah Anda memiliki splitunc()fungsi yang tersedia di dalamnya os.path. Item pertama yang dikembalikan harus seperti yang Anda inginkan ... tapi saya di Linux dan saya tidak memiliki fungsi ini ketika saya mengimpor osdan mencoba menggunakannya.

Kalau tidak, salah satu cara semi-jelek yang menyelesaikan pekerjaan adalah dengan menggunakan:

>>> pathname = "\\C:\\mystuff\\project\\file.py"
>>> pathname
'\\C:\\mystuff\\project\\file.py'
>>> print pathname
\C:\mystuff\project\file.py
>>> "\\".join(pathname.split('\\')[:-2])
'\\C:\\mystuff'
>>> "\\".join(pathname.split('\\')[:-1])
'\\C:\\mystuff\\project'

yang menunjukkan pengambilan direktori tepat di atas file, dan direktori tepat di atas itu.


Saya mengedit entri saya untuk menunjukkan penggunaan rsplit yang melakukan apa yang Anda sarankan - tetapi masih memberi saya jalan tidak hanya nama direktori.
Thalia

1
Saya masih tidak jelas apa yang Anda minta. Mengapa Anda tidak menghapus semua yang tersisa dari instance selanjutnya yang lebih tinggi dari \\? Berpura-pura seperti Anda menginginkan jalannya, maka simpan saja entri terakhir saat Anda membaginya pada \\. Ini seharusnya berhasil, bukan?
ely

Saya akhirnya memisahkan jalan dan mengambil bagian yang saya inginkan, itu tidak berhasil sebelumnya tetapi setelah membaca semua jawaban ini, saya menemukan kesalahan saya.
Thalia

Jika membaca jawaban memang membantu Anda, pertimbangkan untuk memilihnya paling tidak, dan mungkin menerima salah satunya. Saya senang Anda melihat kesalahan itu.
ely

Saya suka cara ini cara semi-jelek bekerja. Saya mengubah "\\" dengan os.sep sederhana dan bekerja dengan baik untuk mengambil hanya sebagian kecil dari jalan.
TazgerO

1

Inilah yang saya lakukan untuk mengekstrak bagian dari direktori:

for path in file_list:
  directories = path.rsplit('\\')
  directories.reverse()
  line_replace_add_directory = line_replace+directories[2]

Terima kasih untuk bantuannya.


0
import os

directory = os.path.abspath('\\') # root directory
print(directory) # e.g. 'C:\'

directory = os.path.abspath('.') # current directory
print(directory) # e.g. 'C:\Users\User\Desktop'

parent_directory, directory_name = os.path.split(directory)
print(directory_name) # e.g. 'Desktop'
parent_parent_directory, parent_directory_name = os.path.split(parent_directory)
print(parent_directory_name) # e.g. 'User'

Ini juga harus melakukan trik.


-1

Anda harus meletakkan seluruh path sebagai parameter ke os.path.split. Lihat Dokumen . Itu tidak bekerja seperti string split.


Ini tidak akan berfungsi pada nama jalur jenis UNC di Windows, seperti dokumen Python untuk keadaan os.path.
ely
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.