2012-05-11 10 views
9

Busco una forma de extraer un nombre de archivo y la extensión de una URL en particular usando PythonPython divide url para encontrar el nombre de la imagen y la extensión

digamos una URL tiene el siguiente

picture_page = "http://distilleryimage2.instagram.com/da4ca3509a7b11e19e4a12313813ffc0_7.jpg" 

¿Cómo lo haría Voy por conseguir lo siguiente.

filename = "da4ca3509a7b11e19e4a12313813ffc0_7" 
file_ext = ".jpg" 

Respuesta

10
filename = picture_page.split('/')[-1].split('.')[0] 
file_ext = '.'+picture_page.split('.')[-1] 
+0

gracias! Puede ser útil si no hay motivos para importar bibliotecas adicionales –

11

intento con urlparse.urlsplit dividir url, y luego os.path.splitext para recuperar el nombre de archivo y la extensión (utilizar os.path.basename mantener sólo el último nombre del archivo):

import urlparse 
import os.path 

picture_page = "http://distilleryimage2.instagram.com/da4ca3509a7b11e19e4a12313813ffc0_7.jpg" 

print os.path.splitext(os.path.basename(urlparse.urlsplit(picture_page).path)) 

>>> ('da4ca3509a7b11e19e4a12313813ffc0_7', '.jpg') 
+0

urlparse ahora se mueve a urllib en python 3. Su solución aún funciona. Gracias. :) – kinshuk4

1

os.path.splitext le ayudará a extraer el nombre del archivo y extensión una vez que haya extraído la cadena correspondiente de la URL usando urlparse:

fName, ext = os.path.splitext('yourImage.jpg') 
29
from urlparse import urlparse 
from os.path import splitext, basename 

picture_page = "http://distilleryimage2.instagram.com/da4ca3509a7b11e19e4a12313813ffc0_7.jpg" 
disassembled = urlparse(picture_page) 
filename, file_ext = splitext(basename(disassembled.path)) 

El único inconveniente de esto es que su nombre de archivo contendrá un anterior/que siempre puede eliminar.

+0

+1 para usar incorporados. –

+1

el '/' anterior no es el único problema, si la url contiene otros subdirectorios, se mantendrán en el nombre del archivo, quizás OP quiera, tal vez no;) –

+0

@ Cédric Julien - Gracias por el recordatorio sobre .basename para obtener solo la última parte, editó la publicación para reflejarlo. :) –

-2
>>> import re 
>>> s = 'picture_page = "http://distilleryimage2.instagram.com/da4ca3509a7b11e19e4a12313813ffc0_7.jpg"' 
>>> re.findall(r'\/([a-zA-Z0-9_]*)\.[a-zA-Z]*\"$',s)[0] 
'da4ca3509a7b11e19e4a12313813ffc0_7' 
>>> re.findall(r'([a-zA-Z]*)\"$',s)[0] 
'jpg' 
+1

're' no es necesario aquí. –

4
# Here's your link: 
picture_page = "http://distilleryimage2.instagram.com/da4ca3509a7b11e19e4a12313813ffc0_7.jpg" 

#Here's your filename and ext: 
filename, ext = (picture_page.split('/')[-1].split('.')) 

Al hacer picture_page.split ('/'), devolverá una lista de cadenas de su división por un url /. Si conoce bien la indexación de la lista de python, sabrá que -1 le dará el último elemento o el primer elemento del final de la lista. En su caso, será el nombre del archivo: da4ca3509a7b11e19e4a12313813ffc0_7.jpg

División que al delimitador ., se obtienen dos valores: da4ca3509a7b11e19e4a12313813ffc0_7 y jpg, como se esperaba, ya que están separados por un período que utilizó como un delimitador en su llamada split()

Ahora, dado que la última división devuelve dos valores en la lista resultante, puede tuplificarlo. Por lo tanto, básicamente, el resultado sería:

filename,ext = ('da4ca3509a7b11e19e4a12313813ffc0_7', 'jpg')

+1

Si bien su código podría funcionar (o no) sería genial si agrega una breve explicación sobre el problema y cómo lo resuelve su código. Como no proporciona una respuesta completa de acuerdo con [Centro de ayuda] (http://stackoverflow.com/help/how-to-answer) – dic19

+0

Siempre funcionará, siempre que obtenga las URL de sus archivos de forma tal que el archivo siempre tiene una extensión Podría agregar una instrucción if simple en la mezcla para manejar archivos sin extensiones ('if len (url.split ('/') [- 1] .split ('.')) == 1: # Sin extensión; else: #Get filename, ext' –

+0

Tenga en cuenta que el punto de mi comentario no es si su código realmente funciona o no. Se trata de la calidad de la respuesta. Tenga en cuenta que su respuesta es mejor ahora ya que ha agregado una breve explicación según lo sugerido. +1 para su edición :) – dic19

Cuestiones relacionadas