[Python3] Ayuda con manipulacion de ficheros

Iniciado por reconFito, 1 Febrero 2020, 01:51 AM

0 Miembros y 1 Visitante están viendo este tema.

reconFito

Hola a todos los que lean esto.
El siguiente script trata de automatizar el envió de correos, por medio del uso de dos ficheros.

1.carta.txt:
Estimado/a H #CLIENTE#
Tenemos noticias de que usted don/doña H #CLIENTE# no a abonado el importe
de la cuota mensual a que le obliga el draconiano contrato que firmó.

2.cliente.txt:
alguncorreo@gmail.com nombre apellido
alguncorreo@gmail.com nombre apellido

La idea es sustituir #CLIENTE# por el nombre y apellido del cliente, que es lo que ya he logrado hasta el momento y sustituir H(hombre) si esta presente o M(mujer) por su correspondiente identificativo Estimado/a y don/doña esta es la parte que aun no he podido hacer si me pudieran dar alguna idea de como optimizar y como finalizar este ejercicio se los agradeceria


Gracias por responder al final lo solucione usando expresiones regulares puede que no sea muy
eficiente pero lo logre hacer  ;D.
Este es el código

Código (python) [Seleccionar]

def envio_correo_personalizado():
    try:

        # variables y apertura de ficheros
        nombre = []
        mensaje = ""
        carta = open("carta.txt", "r")
        carta_copia = open("carta.txt.copia", "w")
        cliente = open("cliente.txt", "r")

        # lectura de clientes
        for _cliente in cliente:
            nombre += _cliente.rstrip().split("/")

        # Leyendo el fichero carta
        linea = carta.readline()
        while linea != "":
            mensaje += linea
            linea = carta.readline()

        # TODO Cambiando los valores del mensaje segun el genero usando expresiones regulares.
        # FIXME Buscar otra forma de hacerlo.
        mensaje = re.sub(
            r"/a|/doña|H", "", mensaje) if "H" in mensaje else re.sub(r"o/|don/|M", "", mensaje)
        mensaje = re.sub(r"#CLIENTE#", nombre[1], mensaje)
        print("Mensaje cambiado")
        print(mensaje)

        for i in mensaje:
            carta_copia.write(i)

        # cierre de ficheros
        carta.close()
        cliente.close()
        carta_copia.close()

    except IOError:
        print("Fichero no existe")


EdePC

Saludos,

- De momento me está funcionando lo siguiente:

carta.txt
#ESTIMAD@# #CLIENTE#
Tenemos noticias de que usted #DON@# #CLIENTE# no a abonado el importe
de la cuota mensual a que le obliga el draconiano contrato que firmó.


clientes.txt
carlos_aguero@gmail.com  ; Carlos Alberto ; Agüero López  ; H
camila_valerio@gmail.com ; Camila         ; Valerio Gómez ; M


Código (python) [Seleccionar]
clientes = open("clientes.txt", "r")

for cliente in clientes :
  datos = cliente.split(";")
  correo = datos[0].strip()
  nombres = datos[1].strip()
  apellidos = datos[2].strip()
  sexo = datos[3].strip()

  carta = open("carta.txt", "r")
  correo_cliente = open(correo + ".txt", "w")
  for linea in carta :
    tmp = linea
    if "#ESTIMAD@#" in linea :
      if sexo == "H" :
        tmp = tmp.replace("#ESTIMAD@#", "Estimado")
      elif sexo == "M" :
        tmp = tmp.replace("#ESTIMAD@#", "Estimada")
    if "#DON@#" in linea :
      if sexo == "H" :
        tmp = tmp.replace("#DON@#", "don")
      elif sexo == "M" :
        tmp = tmp.replace("#DON@#", "doña")
    if "#CLIENTE#" in linea :
      tmp = tmp.replace("#CLIENTE#", nombres + " " + apellidos)
    correo_cliente.write(tmp)
  carta.close()
  correo_cliente.close()
clientes.close()


- He tenido algunos problemas con la ñ XD, pero viendo como lee dicha ñ el propio python y poniéndola así he visto que no tiene problemas, este mismo método lo usa en Batch, debe haber otros métodos que más tarde revisaré...

Resultados:

carlos_aguero@gmail.com.txt
Estimado Carlos Alberto Agüero López
Tenemos noticias de que usted don Carlos Alberto Agüero López no a abonado el importe
de la cuota mensual a que le obliga el draconiano contrato que firmó.


camila_valerio@gmail.com.txt
Estimada Camila Valerio Gómez
Tenemos noticias de que usted doña Camila Valerio Gómez no a abonado el importe
de la cuota mensual a que le obliga el draconiano contrato que firmó.