Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Dudas con archivo de texto en python.
#1
Hola, ¿como están?.-
Cómo es de esperar(por lo menos para mi) este autodidacta de 65 años tiene que molestarlos nuevamente porque es el único canal de consulta
humano que dispongo.-
Les cuento lo que me pasa, tengo un .txt de donde obtengo la descripción de los productos que es el siguiente:

Cita:0001   Galletias Granix c/sesamo.........$
0002   Huevos(1/2 docena).................$
0003   Aceite Natura de 1.000 cc.........$
0004   Azúcar(la mas económica)........$
0005   Jabón tocador (rexona)............$
0006   Jabón polvo(ala x 800 común)..$
0007   Jabón polvo(Skip x 400)...........$
0008   Jugo sobre tang.......................$
0009   Duraznos el Kgr.......................$
0010   Manzana el Kgr........................$
0011   Bananas el Kgr........................$
0012   Naranjas el Kgr........................$
0013   Tomate el Kgr..........................$
0014   Amarga(cortada) el Kgr............$
0015   Repollo(cortado) el Kgr............$
0016   Batatas el Kgr.........................$
0017   Papas(lavada) el Kgr................$

Pero estoy trabado, en definitiva les muestro como debe quedar, tengo que agregarle al principio la fecha y al final el precio de cada producto, ¿debo utilizar una tupla o una lista?, cuando este completo lo vuelco en otro archivo, así tengo que hacer lo mismo todos los meses.-
Cita:Enero 2018   0001   Galletias Granix c/sesamo.........$ 18.90


Código:
# Evolución de costos en Argentina - 14/01/2018

import os

def limpiar():
   if os.name == "posix":
       os.system ("clear")
   elif os.name in ("ce", "nt", "dos"):
       os.system ("cls")

def menu():
   while True:
       limpiar()

       print("\n")
       print(" ============ Evolución de costos ============")
       print("\n 1 - Agregar \n 2 - Modificar \n 3 - Consultar \n 4 - Salir") 
       opc=input("\n Ingrese opción...: ")
       if opc == '1':
           limpiar()
           agregar()
       elif opc == '2':
           modificar()
       elif opc == '3':
           consultar()
       elif opc == '4':
           break
       else:
           print("\n Ingreso incorrecto, inténtelo nuevamente...")
           input("\n Pulse una tecla para continuar...")

def agregar():
   while True:
       mes  = ing_mes()
       anio = ing_anio()
       p = aceptar(mes, anio)
       if p:
           break

   limpiar()
   fecha= mes + ' ' + str(anio)
   print("\n ===== Agregar lista completa de precios =====")
   print("\n Fecha = {}".format(fecha))
   with open("detalle.txt", "r") as archivo:
       print("\n")
       print("-"*50)
       print(" Código   Producto                         Precio")
       print("-"*50)
       for producto in archivo:
           print(producto[:-1], end=" ")
           a=input("")


def ing_mes():
   tMes = ("", "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio",
           "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre", )
   while True:
       try:
           num_mes = int(input("\n Ingrese número del mes...: "))
       except:
           print("\n\t El ingreso es incorrecto...")
       else:
           if num_mes >= 1 and num_mes <= 12:
               mes = tMes[num_mes]
               break
           else:
               print("\n\t El ingreso es incorrecto...")

   return mes

def ing_anio():
   while True:
       try:
           anio = int(input("\n Ingrese año..............:"))
           break
       except:
           print("\n\t El ingreso es incorrecto...")

   return anio

def aceptar(mes, anio):
   print("\n La fecha ingresada es...: ", mes, anio)
   p = input('\n Para confirmar ingrese "Si" otra para modificar...:')
   if p == 'Si':
       return True
   else:
       return False

def modificar():
   print("modificar")

def consultar():
   print("consultar")


menu()

Código:
def agregar():
el inconveniente radica en la última línea de esta función.

No estoy seguro de ser lo bastante explicito, ustedes dirán.-
Un abrazo.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Responder
#2
Hola Daniel, ¿cómo estás?

Está muy bien tu código. Te faltaría incluir la apertura de un nuevo archivo que contenga los productos con sus respectivas fechas y precios. Sería algo más o menos así:

Código:
with open("detalle.txt", "r") as archivo:
    # Abrir el archivo en modo "append".
    with open("detalle-precios.txt", "a") as archivo_salida:
        print("
")
        print("-"*50)
        print(" Código   Producto                         Precio")
        print("-"*50)
        for producto in archivo:
            print(producto[:-1], end=" ")
            # (Aquí deberías definir las variables precio y fecha
            # para el producto actual).
            archivo_salida.write(
                " ".join((fecha, producto, precio)) + "
")

Luego tal vez quieras usar las funciones os.remove() y os.rename() para reemplazar el archivo original con el que contiene las fechas y los precios.

Código:
import os
# ...
os.remove("detalle.txt")
os.rename("detalle-precios.txt", "detalle.txt")

Saludos!
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#3
Hola, Muy buen día para todos.-
Francisco, entiendo lo que deseas que haga pero debo aclararte algunas cosas que evidentemente no logre explicar con claridad, el archivo detalle.txt no lo puedo borrar porque es el que utilizo como plantilla para cada nuevo ingreso(cada mes).-
Por lo que entiendo lo que propones es al finalizar de ingresar el precio de cada producto directamente grabarlo en un archivo en cambio lo que quiero hacer es ingresar los 17 productos(que estarán en pantalla) preguntar si desea grabar los datos en disco o si por algún error los desea ingresar nuevamente, por ello te consultaba donde debo ir guardando los datos temporalmente en tupla o lista.-

¿Me podrías decir cómo haces para que salgan numeradas las líneas de los códigos en este foro?

Saludos.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Responder
#4
Hola Daniel. Bien, ahora comprendo un poco mejor. En ese caso deberías crear una lista, pues las tuplas son inmutables (una vez asignados sus elementos no pueden cambiarse). El código podría ser similar a este:

Código:
# Crear la nueva lista.
productos = []
with open("detalle.txt", "r") as archivo:
    print("
")
    print("-"*50)
    print(" Código   Producto                         Precio")
    print("-"*50)
    for producto in archivo:
        print(producto[:-1], end=" ")
        # (Aquí deberías definir las variables precio y fecha
        # para el producto actual).
        productos.append(" ".join((fecha, producto, precio)))

Luego, en caso que el usuario quiera grabar los datos en disco, ahora sí:

Código:
with open("detalle-precios.txt", "w") as f:
    f.write("
".join(productos))

Puedes ver cómo resaltar código de Python en el foro en este enlace.

Un saludo!
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#5
Hola, ¿cómo están?.-
Tengo otro inconveniente que por más que busco en internet no logro resolver, cuando vuelco la lista productos en el archivo lo graba en este formato


Cita:Enero 2018   0001   Galletias Granix c/sesamo.......$
23.00
Evidentemente despúes del signo $ hay un salto de línea que no logro quitar, probe con:


Código:
rstrip('\n') #no me funciono


con:

Código:
for producto in archivo:
    if producto[-1] == '\n':
        producto = producto[:-1] #lo vuelca de la misma manera
 

Código:
def agregar():
    while True:
        mes  = ing_mes()
        anio = ing_anio()
        p = aceptar(mes, anio)
        if p:
            break

    limpiar()
    fecha = mes + ' ' + str(anio)
    print("\n ===== Agregar lista completa de precios =====")
    print("\n Fecha = {}".format(fecha))

    productos = []
    with open("detalle.txt", "r") as archivo:
        print("\n")
        print("-"*50)
        print(" Código   Producto                         Precio")
        print("-"*50)
        for producto in archivo:
            print(producto[:-1], end=" ")
            precio = ing_precio(producto)
            productos.append(" ".join((fecha, producto, str(precio))))

        ok = grabar_descartar()
        if ok:
            with open("detalle-precios.txt", "a") as f:
                f.write("\n".join(productos))

Bueno si consideran que alguna de las dos maneras tendría que funcionar me lo dicen y sigo practicando hasta lograrlo.-

Un abrazo.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Responder
#6
aqui te pongo una manera curiosa de quitar el salto de linea '\n'



Código:
>>> cadena = "prueba\n"
>>> print(cadena, "tiene salto de linea")
prueba
 tiene salto de linea
>>> cadena = "'''" + cadena + "'''"
>>> cadena1 = cadena.replace('\n', '')
>>> cadena = cadena1.strip("'''")
>>> print(cadena, "no tiene salto de linea")
prueba no tiene salto de linea
>>>
Responder
#7
Hola calvicius, gracias por responder.
Me parece muchas líneas por ser python, asi como esta funciona, desconozco que pasa
si la cadena es extraída desde un archivo digo porque el salto de línea está oculto.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Responder
#8
a ver como lo explico.

el '\n' es de esos caracteres no imprimibles /visibles (ver codigo ascii). Ahora por matener las cosas simples:

En python, si estamos en entornos linux el salto de linea es un simple '\n'. Si tomamos un texto hecho con el Notepad de windows, cada salto de linea será '\r\n' (en ascii CR+LF). Por eso se hace el código fuente en utf8 sin BOM (esta explicado en https://es.wikipedia.org/wiki/Marca_de_orden_de_bytes )

En el codigo que te he enviado le he añadido las tirples comillas al principio y al final, para convertirlo en un texto multilinea, de la misma manera que hacemos cuando queremos hacer un comentario extenso a nuestro programa.

una vez que hemos convertido una simple string a texto, podemos reemplazar (replace) todas las apariciones de '\n' dentro de ese texto. Ahora solo nos queda quitar las triples comillas para dejarlo como una string ordinaria.

Es simple de recordar la mecanica, porque si no, tendríamos que empezar a hablar de expresiones regulares, pero para eso debemos saber que tipo de datos vamos a leer / recibir. Esto es, que si estas empezando mejor no entrar todavia en esos temas.

saludos.
Responder
#9
El problema ocurre probablemente en la siguiente línea:

Código:
productos.append(" ".join((fecha, producto, str(precio))))

producto es una línea del archivo y que por ende termina con un salto de línea. Quitar el último carácter debería solucionar el problema:

Código:
productos.append(" ".join((fecha, producto[:-1], str(precio))))

No obstante coincido con calvicius en que distintos sistemas operativos manejan los saltos de líneas de formas diversas. En ese caso podrías quitar el salto de línea (
) y retorno de carro () vía:

Código:
productos.append(" ".join((fecha, producto.replace("
", "").replace("", ""), str(precio))))

Saludos!
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#10
francisco, a mi nunca me ha funcionado el replace simple del '\n' : cadena.replace('\n'. ' ').
Por eso utilizo el codigo que puse arriba. aunque tambien se puede hacer así:

cadena1 = cadena.split('\n')
cadena2 = ''
for subcadena in cadena1:
...... cadena2 += subcadena + ' '
cadena_final = cadena2.strip(' ')
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)