2012-04-13 15 views
72

Necesito extraer el nombre del directorio principal de una ruta determinada. Esto es lo que parece: c:\ stuff \ directory_i_need \ subdir \ file. Estoy modificando el contenido del "archivo" con algo que usa el nombre directory_i_need (no la ruta). He creado una función que me dará una lista de todos los archivos, y luego ...Extraiga una parte de la ruta de archivo (un directorio) en Python

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. 

¿Cómo puedo hacer eso?

+1

Es posible que desee comprobar hacia fuera esta respuesta: http://stackoverflow.com/a/4580931/311220 – Acorn

+0

El enlace de arriba me ayudó a entender cómo arregla lo que hice mal. Gracias. – Thalia

Respuesta

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

Y se puede seguir haciendo esto tantas veces como sea necesario ...

Editar: de os.path, puede utilizar cualquiera os.path.split o 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. 
+0

Extrae partes de la ruta, pero no sé cómo extraer el nombre del directorio real de la ruta. – Thalia

+1

Edité la publicación para incluir la extracción del nombre del directorio. –

-1

Tienes que poner toda la ruta como un parámetro para os.path.split. Ver The docs. No funciona como una división de cuerdas.

+0

Esto no funcionará en los nombres de ruta de tipo UNC en Windows, ya que Python documenta el estado de la materia os.path. – ely

4

Primero, vea si tiene splitunc() como una función disponible dentro de os.path. El primer elemento devuelto debe ser el que desee ... pero estoy en Linux y no tengo esta función cuando importo os y trato de usarlo.

De lo contrario, una semi-fea forma en que hace el trabajo es utilizar:

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

que muestra la recuperación de la guía justo por encima del archivo y el directorio justo por encima de eso.

+0

He editado mi entrada para mostrar el uso de rsplit que hace lo que sugiere, pero aún así me da la ruta no solo el nombre del directorio. – Thalia

+1

Todavía no estoy seguro de lo que estás preguntando. ¿Por qué no quitas todo a la izquierda de la próxima instancia superior de \\ entonces? Haga como si quisiera el camino, simplemente mantenga la última entrada cuando lo divida \\. Esto debería funcionar, ¿no? – ely

+0

Terminé dividiendo el camino y tomando la pieza que quería, no funcionó antes, pero después de leer todas estas respuestas, descubrí lo que hice mal. – Thalia

1

Esto es lo que hice para extraer la pieza del directorio:

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

Gracias por su ayuda.

12

En Python 3.4 se puede utilizar el pathlib module:

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

buena demostración de la API –

+0

Esto también ha sido transferido a versiones anteriores de Python: [pathlib2] (https://pypi.python.org/pypi/pathlib2/) – phoenix

Cuestiones relacionadas