Python'da dosya yolunun (dizin) bir bölümünü ayıklayın


163

Belirli bir yolun üst dizinin adını ayıklamak gerekiyor. Öyle görünüyor:

c:\stuff\directory_i_need\subdir\file

"Dosya" içeriğini içinde directory_i_needadı (yolu değil) kullanan bir şey ile değiştiriyorum . Bana tüm dosyaların listesini verecek bir işlev oluşturduk ve sonra ...

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.

Bunu nasıl yapabilirim?


1
Bu yanıtı kontrol etmek isteyebilirsiniz: stackoverflow.com/a/4580931/311220
Acorn

Yukarıdaki bağlantı yanlış yaptığım şeyi nasıl düzelteceğimi anlamama yardımcı oldu. Teşekkür ederim.
Thalia

Yanıtlar:


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

Ve bunu gerektiği kadar yapmaya devam edebilirsiniz ...

Düzenleme: dan os.path , ya os.path.split veya os.path.basename kullanabilirsiniz:

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.

Yolun bölümlerini ayıklamak - ama yoldan gerçek dizin adını ayıklamak nasıl bilmiyorum.
Thalia

43

Python 3.4'te pathlib modülünü kullanabilirsiniz :

>>> 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

API'nın güzel gösterimi
Nadim Farhat

Bu aynı zamanda Python'un eski sürümlerine de bildirildi: pathlib2
phoenix

11

Kullanmanız gereken tek şey bir parentparçasıdır pathlib.

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

Çıktı olacak:

C:\Program Files\Internet Explorer    

Tüm parçalara ihtiyacınız varsa (zaten diğer cevaplarda yer almaktadır) kullanın parts:

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

Sonra bir liste alacaksınız:

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

Zamandan tasarruf sağlar.


5

İlk olarak, splitunc()içinde kullanılabilir bir işlev olup olmadığına bakın os.path. Döndürülen ilk öğe istediğiniz gibi olmalı ... ama Linux'tayım ve içe aktarıp oskullanmaya çalıştığımda bu işleve sahip değilim .

Aksi takdirde, işi yapmanın yarı çirkin bir yolu kullanmaktır:

>>> 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'

bu da dosyanın hemen üstündeki dizini ve hemen üstündeki dizini almayı gösterir.


Ne önerdiğini yapar rsplit kullanımını göstermek için girişimi düzenledi - ama yine de bana sadece dizin adını değil yol verir.
Thalia

1
Ne istediğini hâlâ net değilim. Neden her şeyi bir sonraki \\ yüksek örneğinin soluna ayırmıyorsunuz? Yolu istediğiniz gibi yap, sonra \\ ayrılırken son girişini sakla. Bu işe yaramalı, değil mi?
ely

Yolu ayırıp istediğim parçayı aldım, daha önce işe yaramadı ama tüm bu cevapları okuduktan sonra neyi yanlış yaptığımı öğrendim.
Thalia

Cevapları okumak size yardımcı olduysa, en azından onları oylamayı ve muhtemelen bunlardan birini kabul etmeyi düşünün. Yine de hatayı fark ettiğine sevindim.
ely

Bu yarı çirkin yolun çalışmasını seviyorum. Basit bir os.sep ile "\\" değiştirmek ve yolun sadece bir kısmını almak için mükemmel çalışıyor.
TazgerO

1

Bu dizinin parçasını ayıklamak için yaptım:

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

Yardımın için teşekkürler.


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'

Bu da hile yapmalı.


-1

Tüm yolu os.path.split dosyasına bir parametre olarak koymanız gerekir. Bkz . Dokümanlar . Dize bölünmüş gibi çalışmaz.


Bu, Windows'daki UNC türü yol adlarında çalışmaz, os.path şeyler için Python belgeleri durumu.
ely
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.