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?

Thalia
sumber
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
atau yang ini: stackoverflow.com/a/31273488/1048186
Josiah Yoder

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.
Nisan.H
sumber
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
Noam Manos
sumber
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.

prosti
sumber
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.

Ely
sumber
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.

Thalia
sumber
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.

Basti Würzburg
sumber
-1

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

Keith
sumber
Ini tidak akan berfungsi pada nama jalur jenis UNC di Windows, seperti dokumen Python untuk keadaan os.path.
ely