¿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.txtse 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 .txtdentro 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).whilebucle 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,
splitextes 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
rsplitdice a Python que realice las divisiones de cadenas comenzando desde la derecha de la cadena, y1dice que realice como máximo una división (por ejemplo,'foo.bar.baz'->[ 'foo.bar', 'baz' ]). Dadorsplitque siempre devolverá una matriz no vacía, podemos indexarla con seguridad0para obtener el nombre del archivo menos la extensión.fuente
rsplitdará 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.splitextdevuelve una extensión vacía para estos, pero el usorsplittratará el nombre de archivo completo como una extensión./home/john.johnson/somefilePrefiero 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
pathlibystr.replacefunciona de maravilla:Quitar / quitar extensiones
Reemplazar extensiones
Si también desea una
pathlibsalida de objeto, obviamente puede ajustar la línea enPath()Envolviendo todo en una función
fuente
with_suffixlugar dereplacesolo eliminaría en.gzlugar de.tar.gzMi respuesta tenía la intención de ser "general", pero si solo espera una sola extensión,with_suffixsería una solución más limpia.Otra forma de hacerlo es utilizar el
str.rpartition(sep)método.Por ejemplo:
fuente