¿Existe una función incorporada en Python que reemplace (o elimine, lo que sea) la extensión de un nombre de archivo (si tiene una)?
Ejemplo:
print replace_extension('/home/user/somefile.txt', '.jpg')
En mi ejemplo: /home/user/somefile.txt
se convertiría/home/user/somefile.jpg
No sé si importa, pero necesito esto para un módulo SCons que estoy escribiendo. (Entonces, ¿quizás haya alguna función específica de SCons que pueda usar?)
Quisiera algo limpio . Hacer un simple reemplazo de cadena de todas las ocurrencias .txt
dentro de la cadena obviamente no es limpio. (Esto fallaría si mi nombre de archivo es somefile.txt.txt.txt
)
Respuestas:
Prueba os.path.splitext , debería hacer lo que quieras.
fuente
print os.path.join(os.path.splitext('/home/user/somefile.txt')[0], '.jpg')
volverá/home/user/somefile/.jpg
, lo que no es deseable.Ampliando la respuesta de AnaPana, cómo eliminar una extensión usando pathlib (Python> = 3.4):
fuente
pth = Path('data/foo.tar.gz'); print(pth.with_suffix('.jpg'))
saldrá'data/foo.tar.jpg'
. Supongo que puede hacerlopth.with_suffix('').with_suffix('.jpg')
, pero es torpe, y necesitaría agregar una cadena de.with_suffix('')
llamadas arbitrariamente larga para lidiar con un número arbitrario de puntos.
en una extensión de archivo (es cierto que más de 2 es un caso extremo exótico).while
bucle para resolver eso:pth = Path('data/foo.tar.gz'); while pth != pth.with_suffix(''): pth = pth.with_suffix(''); pth = pth.with_suffix('.jpg')
Como dijo @jethro,
splitext
es la mejor manera de hacerlo. Pero en este caso, es bastante fácil dividirlo usted mismo, ya que la extensión debe ser la parte del nombre del archivo que viene después del período final:Le
rsplit
dice a Python que realice las divisiones de cadenas comenzando desde la derecha de la cadena, y1
dice que realice como máximo una división (por ejemplo,'foo.bar.baz'
->[ 'foo.bar', 'baz' ]
). Dadorsplit
que siempre devolverá una matriz no vacía, podemos indexarla con seguridad0
para obtener el nombre del archivo menos la extensión.fuente
rsplit
dará como resultado resultados diferentes para los archivos que comienzan con un punto y no tienen otra extensión (como archivos ocultos en Linux, por ejemplo.bashrc
).os.path.splitext
devuelve una extensión vacía para estos, pero el usorsplit
tratará el nombre de archivo completo como una extensión./home/john.johnson/somefile
Prefiero el siguiente enfoque de una sola línea usando str.rsplit () :
Ejemplo:
fuente
Para Python> = 3.4:
fuente
Manejo de múltiples extensiones
En el caso de que tenga varias extensiones, este de una sola línea usa
pathlib
ystr.replace
funciona de maravilla:Quitar / quitar extensiones
Reemplazar extensiones
Si también desea una
pathlib
salida de objeto, obviamente puede ajustar la línea enPath()
Envolviendo todo en una función
fuente
with_suffix
lugar dereplace
solo eliminaría en.gz
lugar de.tar.gz
Mi respuesta tenía la intención de ser "general", pero si solo espera una sola extensión,with_suffix
sería una solución más limpia.Otra forma de hacerlo es utilizar el
str.rpartition(sep)
método.Por ejemplo:
fuente