Acerca de:

Este blog contiene los códigos, ejemplos y bases de datos que he usado cuando aprendía acerca de algún tema específico. En lugar de borrarlos (una vez dominado ya el tema), he decidido publicarlos :)

sábado, 10 de diciembre de 2016

Reemplazando subcadenas dentro de archivos de texto con Python

Sucede que tenía varios archivos de Inno Setup Script en una carpeta, los cuales apuntaban a archivos en otra carpeta que correspondían a los instaladores de distintas versiones de una aplicación (e incluso distintas versiones del mismo instalador), por lo que las rutas a los archivos dentro de los scripts eran rutas absolutas. Un día, al actualizar los códigos fuente y los compilados tuve que ponerlos en una nueva carpeta, y esto significada actualizar todas las rutas absolutas en los scripts de Inno Setup.

El siguiente ejemplo muestra cómo se ven mis scripts de Inno Setup, en la realidad incluyen muchos muchos más archivos (tomado de los ejemplos que vienen con el Inno Setup):

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
UninstallDisplayIcon={app}\MyProg.exe
Compression=lzma2
SolidCompression=yes
OutputDir=D:\Generated Installers\

[Files]
Source: "D:\compiled_2014\MyProg.exe"; DestDir: "{app}"
Source: "D:\compiled_2014\MyProg.chm"; DestDir: "{app}"
Source: "D:\compiled_2014\Readme.txt"; DestDir: "{app}"; Flags: isreadme

[Icons]
Name: "{group}\My Program"; Filename: "{app}\MyProg.exe"



Para evitar tener que hacer el cambio de rutas a mano, me creé este script en Python:

import os
import sys

iss = [c for c in os.listdir(sys.path[0]) if ".iss" in c]

for i in iss:
    fopen = open(i,'r')
    fwrite = []

    flines = fopen.readlines()
    fopen.close()

    for line in flines:
        fwrite.append(line.replace("D:\compiled_2014", "F:\compiled_Octubre_2016"))
           
    fopen = open(i,'w')
    fopen.writelines(fwrite)
    fopen.close()

   

Lo que hace este script en Python es reemplazar la ruta antigua (en este ejemplo "D:\compiled_2014") por la nueva ruta "F:\compiled_Octubre_2016" de todos los archivos .iss que encuentre en la misma carpeta donde está ubicado.
Finalmente, el script en Inno Setup queda así:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
UninstallDisplayIcon={app}\MyProg.exe
Compression=lzma2
SolidCompression=yes
OutputDir=D:\Generated Installers\

[Files]
Source: "F:\compiled_Octubre_2016\MyProg.exe"; DestDir: "{app}"
Source: "F:\compiled_Octubre_2016\MyProg.chm"; DestDir: "{app}"
Source: "F:\compiled_Octubre_2016\Readme.txt"; DestDir: "{app}"; Flags: isreadme

[Icons]
Name: "{group}\My Program"; Filename: "{app}\MyProg.exe"