getsize filename example __file__ python url path

python - filename - os.path.basename funciona con URL, ¿por qué?



path getsize python (5)

>>> os.path.basename(''http://example.com/file.txt'') ''file.txt''

.. y pensé que os.path.* solo funciona en rutas locales y no en URLs? Tenga en cuenta que el ejemplo anterior también se ejecutó en Windows ... con resultados similares.


¿Por qué? Porque es útil para analizar URL y rutas de archivos locales. Por qué no?


En Windows, mira el código fuente: C: / Python25 / Lib / ntpath.py

def basename(p): """Returns the final component of a pathname""" return split(p)[1]

os.path.split (en el mismo archivo) simplemente divide "/" (y sth. else)


Usa la fuente Luke:

def basename(p): """Returns the final component of a pathname""" i = p.rfind(''/'') + 1 return p[i:]

Editar (respuesta a la aclaración):

Funciona para URLs por accidente, eso es todo. Por eso, explotar su comportamiento podría ser considerado por algunos como un código malicioso.

Tratar de "arreglarlo" (verificar si la ruta pasada no es url) también es sorprendentemente difícil

www.google.com/test.php [email protected]/12 ./src/bin/doc/goto.c

son al mismo tiempo nombres de rutas y URL correctos (relativos), también lo es http:/hello.txt (uno /, y solo en Linux, y es un poco estúpido :)). Podrías "arreglarlo" para las URL absolutas, pero las relativas seguirán funcionando. Manejar un caso especial de manera diferente es un gran no no en el mundo de Python.

Para resumir: importe esto


La barra diagonal es también un delimitador de ruta aceptable en Windows.

Es simplemente que la línea de comando no acepta rutas que comiencen con a / porque ese carácter está reservado para los interruptores args.


En la práctica, muchas funciones de os.path son solo funciones de manipulación de cadenas (que resultan ser especialmente útiles para la manipulación de rutas), y como eso es inofensivo y ocasionalmente práctico, aunque formalmente sea "incorrecto", dudo que esto cambie pronto. - para obtener más detalles, utilice el siguiente simple delineador en el intérprete de comandos / shell:

$ python -c"import sys; import StringIO; x = StringIO.StringIO(); sys.stdout = x; import this; sys.stdout = sys.__stdout__; print x.getvalue().splitlines()[10][9:]"

O bien, para Python 3:

$ python -c"import sys; import io; x = io.StringIO(); sys.stdout = x; import this; sys.stdout = sys.__stdout__; print(x.getvalue().splitlines()[10][9:])"