elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  De txt a diccionario
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: De txt a diccionario  (Leído 4,331 veces)
SlayerBur

Desconectado Desconectado

Mensajes: 92



Ver Perfil
De txt a diccionario
« en: 30 Mayo 2021, 20:12 pm »

Buen día.

Quería saber si alguien sabría como hacer para que el contenido de un txt (guardado previamente con la informacion de un diccionario), luego pueda cargarlo, volver a modificarlo y guardarlo nuevamente.
El guardado funciona correctamente, el problema sucede cuando cargo el texto, una vez cargado, todo lo que utilizaba el diccionario comienza a fallar.

Guardado:
Código:
    file = open("./filename.txt", "w")
    for key, value in datos.items():
        file.write(str(key)+ ": " + str(value))
    file.close()


Código:
    file = open("./filename.txt", "r")
    for linea in file.readlines():
        #l = linea.replace("'"," ").replace("[","").replace("]","").replace(",","")
        datos = str({linea})

Gracias de antemano


« Última modificación: 1 Junio 2021, 00:45 am por SlayerBur » En línea

DtxdF

Desconectado Desconectado

Mensajes: 53



Ver Perfil
Re: De txt a diccionario
« Respuesta #1 en: 30 Mayo 2021, 23:56 pm »

Hola @SlayerBur

La cuestión es que estás abriendo el archivo en modo escritura (w), pero este modo borrará todo el contenido que tenga el archivo de destino, por lo que si haces una lectura mucho después, verás que estará vacío.

Puedes hacer dos cosas. La primera es abrir y leer todo el archivo primero, pero ésto consume mucha memoria, por lo que sería útil sólo si no te importa desperciarla y también si es menos de la que está en uso. La segunda es leer línea por línea, modificarla y escribir o en la salida o en un archivo de salida diferente al que está abierto.

Recomiendo la segunda para la mayoría de casos. Incluso con la segunda opción, en caso de enviar el resultado en la salida, puedes combinar ese contenido con otros programas al estilo unix usando tuberías.

~ DtxdF


En línea

SlayerBur

Desconectado Desconectado

Mensajes: 92



Ver Perfil
Re: De txt a diccionario
« Respuesta #2 en: 31 Mayo 2021, 00:06 am »

Hola @SlayerBur

La cuestión es que estás abriendo el archivo en modo escritura (w), pero este modo borrará todo el contenido que tenga el archivo de destino, por lo que si haces una lectura mucho después, verás que estará vacío.

Puedes hacer dos cosas. La primera es abrir y leer todo el archivo primero, pero ésto consume mucha memoria, por lo que sería útil sólo si no te importa desperciarla y también si es menos de la que está en uso. La segunda es leer línea por línea, modificarla y escribir o en la salida o en un archivo de salida diferente al que está abierto.

Recomiendo la segunda para la mayoría de casos. Incluso con la segunda opción, en caso de enviar el resultado en la salida, puedes combinar ese contenido con otros programas al estilo unix usando tuberías.

~ DtxdF

El problema no es el guardado, la idea es que remplace todo el contenido.
el problema es al cargar, que no se crea el diccionario.
la informacion se guarda asi:

Imagen: ['.png', '.NEF', '.jpg', '.JPG', '.ao']Texto: ['.doc', '.pdf', '.cfg']Videos: ['.mp4', '.avi', '.flv']Otros: []

lo que quiero es que esa informacion del .txt pase a ser un diccionario asi:

datos = {"Imagen":[".png",".NEF",".jpg", ".JPG"], "Texto":[".doc",".pdf",".cfg"], "Videos":[".mp4",".avi",".flv"], "Otros":[]}
En línea

DtxdF

Desconectado Desconectado

Mensajes: 53



Ver Perfil
Re: De txt a diccionario
« Respuesta #3 en: 31 Mayo 2021, 00:34 am »

Código
  1. #!/usr/local/bin/python3.7
  2.  
  3. import re
  4. import pprint
  5.  
  6. filename = "filename.txt"
  7. files = {}
  8.  
  9. with open(filename, "r") as fd:
  10.    for line in fd:
  11.        line = line.strip()
  12.        if not (line):
  13.            continue
  14.  
  15.        tokens = re.split("(\w+: )+", line)
  16.        i = 0
  17.        while (i < len(tokens)-1):
  18.            name = tokens[i].strip()
  19.            if not name:
  20.                i += 1
  21.                continue
  22.  
  23.            extensions = tokens[i+1].strip()
  24.  
  25.            files[name] = re.sub("(\[|\])", "", extensions)
  26.            files[name] = [x.strip() for x in files[name].split(",")]
  27.  
  28.            i += 2
  29.  
  30. pprint.pprint(files)

Resultado:
Código:
{'Imagen:': ["'.png'", "'.NEF'", "'.jpg'", "'.JPG'", "'.ao'"],
 'Otros:': [''],
 'Texto:': ["'.doc'", "'.pdf'", "'.cfg'"],
 'Videos:': ["'.mp4'", "'.avi'", "'.flv'"]}

Faltaría eliminar las comillas simples, pero ya eso es más fácil, o simplemente no puedes incluirlo en filename.txt.

Espero te sirva.

~ DtxdF
En línea

tincopasan


Desconectado Desconectado

Mensajes: 1.286

No es lo mismo conocer el camino que recorrerlo.


Ver Perfil
Re: De txt a diccionario
« Respuesta #4 en: 31 Mayo 2021, 01:43 am »

partamos de la base que la sintaxis visible del guardado es un asco,no hay comas para separa los items o salto de línea en el .txt

hay muchas formas de hacerlo:

Código
  1. #-*- coding: utf -8 -*-
  2. with open("filename.txt", ) as archivo:
  3.    cadena = archivo.read()
  4.  
  5. cadena=cadena.replace(']',']*').split('*')
  6. datos = {}
  7. for x in range(len(cadena)-1):
  8.    temp = cadena[x].split(':')
  9.    datos[temp[0]]= eval(temp[1])

y todo eso se podría evitar si guardas los datos como diccionario correctamente.
En línea

SlayerBur

Desconectado Desconectado

Mensajes: 92



Ver Perfil
Re: De txt a diccionario
« Respuesta #5 en: 1 Junio 2021, 00:45 am »

Código
  1. #!/usr/local/bin/python3.7
  2.  
  3. import re
  4. import pprint
  5.  
  6. filename = "filename.txt"
  7. files = {}
  8.  
  9. with open(filename, "r") as fd:
  10.    for line in fd:
  11.        line = line.strip()
  12.        if not (line):
  13.            continue
  14.  
  15.        tokens = re.split("(\w+: )+", line)
  16.        i = 0
  17.        while (i < len(tokens)-1):
  18.            name = tokens[i].strip()
  19.            if not name:
  20.                i += 1
  21.                continue
  22.  
  23.            extensions = tokens[i+1].strip()
  24.  
  25.            files[name] = re.sub("(\[|\])", "", extensions)
  26.            files[name] = [x.strip() for x in files[name].split(",")]
  27.  
  28.            i += 2
  29.  
  30. pprint.pprint(files)

Resultado:
Código:
{'Imagen:': ["'.png'", "'.NEF'", "'.jpg'", "'.JPG'", "'.ao'"],
 'Otros:': [''],
 'Texto:': ["'.doc'", "'.pdf'", "'.cfg'"],
 'Videos:': ["'.mp4'", "'.avi'", "'.flv'"]}

Faltaría eliminar las comillas simples, pero ya eso es más fácil, o simplemente no puedes incluirlo en filename.txt.

Espero te sirva.

~ DtxdF

Tuve que hacer una pequeña modificacion pero ya quedo, gracias :D 
En línea

DtxdF

Desconectado Desconectado

Mensajes: 53



Ver Perfil
Re: De txt a diccionario
« Respuesta #6 en: 1 Junio 2021, 02:10 am »

partamos de la base que la sintaxis visible del guardado es un asco,no hay comas para separa los items o salto de línea en el .txt

hay muchas formas de hacerlo:

Código
  1. #-*- coding: utf -8 -*-
  2. with open("filename.txt", ) as archivo:
  3.    cadena = archivo.read()
  4.  
  5. cadena=cadena.replace(']',']*').split('*')
  6. datos = {}
  7. for x in range(len(cadena)-1):
  8.    temp = cadena[x].split(':')
  9.    datos[temp[0]]= eval(temp[1])

y todo eso se podría evitar si guardas los datos como diccionario correctamente.

El problema con eval(...) es que ejecuta código arbitrario. Por ejemplo:

Citar
Imagen: ['.png', '.NEF', '.jpg', '.JPG', '.ao']Texto: ['.doc', '.pdf', '.cfg']Videos: ['.mp4', '.avi', '.flv']Otros: [__import__("os").system("whoami")]

La saldría sería:

Código
  1. dtxdf

@SlayerBur

Sí, me había faltado agregar un pequeño trozo. Línea 26:

Código
  1. files[name] = [x.strip().replace("'", "") for x in files[name].split(",")]

El replace(...).

Editado:

Por cierto, y siguiendo la recomendación de @tincopasan, es recomendable colocar nuevas líneas para que sea más fácil editarlo. Por suerte el script puede leer e interpretar de la misma manera lo siguiente:

Con nuevas líneas:
Código:
Imagen: ['.png', '.NEF', '.jpg', '.JPG', '.ao']
Texto: ['.doc', '.pdf', '.cfg']
Videos: ['.mp4', '.avi', '.flv']
Otros: []

Sin nuevas líneas:
Código:
Imagen: ['.png', '.NEF', '.jpg', '.JPG', '.ao']Texto: ['.doc', '.pdf', '.cfg']Videos: ['.mp4', '.avi', '.flv']Otros: []

La saldría sería la misma, y es más recomendable la primera opción para el que tiene que editar las extensiones.

~ DtxdF
« Última modificación: 1 Junio 2021, 02:14 am por DtxdF » En línea

tincopasan


Desconectado Desconectado

Mensajes: 1.286

No es lo mismo conocer el camino que recorrerlo.


Ver Perfil
Re: De txt a diccionario
« Respuesta #7 en: 1 Junio 2021, 08:59 am »

DtxdF bueno supongamos que los archivos no son creados por él, sino sería muy tonto poner "código malicioso" se usal literal_eval de la biblioteca ast y listo, siguen siendo muchas menos líneas de código y bibliotecas para analizar el texto, etc.
En línea

SlayerBur

Desconectado Desconectado

Mensajes: 92



Ver Perfil
Re: De txt a diccionario
« Respuesta #8 en: 1 Junio 2021, 23:18 pm »

El problema con eval(...) es que ejecuta código arbitrario. Por ejemplo:

La saldría sería:

Código
  1. dtxdf

@SlayerBur

Sí, me había faltado agregar un pequeño trozo. Línea 26:

Código
  1. files[name] = [x.strip().replace("'", "") for x in files[name].split(",")]

El replace(...).

Editado:

Por cierto, y siguiendo la recomendación de @tincopasan, es recomendable colocar nuevas líneas para que sea más fácil editarlo. Por suerte el script puede leer e interpretar de la misma manera lo siguiente:

Con nuevas líneas:
Código:
Imagen: ['.png', '.NEF', '.jpg', '.JPG', '.ao']
Texto: ['.doc', '.pdf', '.cfg']
Videos: ['.mp4', '.avi', '.flv']
Otros: []

Sin nuevas líneas:
Código:
Imagen: ['.png', '.NEF', '.jpg', '.JPG', '.ao']Texto: ['.doc', '.pdf', '.cfg']Videos: ['.mp4', '.avi', '.flv']Otros: []

La saldría sería la misma, y es más recomendable la primera opción para el que tiene que editar las extensiones.

~ DtxdF

El codigo es creado mediante una inteface grafica, no seria necesario usar el txt.
Inclusive estoy pensando en publicar el codigo, para el que quiera usarle o modificarle :D
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Diccionario WPA
Hacking Wireless
david020573 6 14,075 Último mensaje 17 Agosto 2010, 16:10 pm
por m.santos.m
uso de diccionario
Wireless en Linux
dany28 1 1,538 Último mensaje 5 Octubre 2010, 08:44 am
por lilo.
Claves "al vuelo". Ataque de diccionario "sin diccionario".
Hacking Wireless
n0more 4 8,967 Último mensaje 27 Julio 2011, 17:27 pm
por flacc
diccionario
Hacking
manusevi 3 5,074 Último mensaje 3 Enero 2012, 21:08 pm
por ph4ntom4s
wpa sin diccionario
Hacking Wireless
daaanisss 3 2,677 Último mensaje 16 Diciembre 2013, 10:48 am
por sanson
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines