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


Tema destacado: Tutorial básico de Quickjs


+  Foro de elhacker.net
|-+  Programación
| |-+  Python (Moderador: Danielㅤ)
| | |-+  No se genera el archivo.
0 Usuarios y 3 Visitantes están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: No se genera el archivo.  (Leído 4,021 veces)
Tachikomaia


Desconectado Desconectado

Mensajes: 1.782


Hackentifiko!


Ver Perfil
No se genera el archivo.
« en: 27 Junio 2026, 05:36 am »

En otra PC tenía un Python más antiguo y usaba un py parecido a este:
Código
  1. charset = "abcdefghijklmnñopqrstuvwxyz"
  2.  
  3. def has_three_consecutive_same_chars(word):
  4.    """Función para verificar si hay tres caracteres consecutivos iguales."""
  5.    for i in range(len(word) - 2):
  6.        if word[i] == word[i + 1] == word[i + 2]:
  7.            return True
  8.    return False
  9.  
  10. with open("Mywords.txt", "w", encoding="utf-8") as txt:
  11.    for a in charset:
  12.        for b in charset:
  13.            for c in charset:
  14.                for d in charset:
  15.                    word = "K" + a + b + c + d
  16.                    if not has_three_consecutive_same_chars(word):
  17.                        txt.write(word + "\n")
  18.  

En esta instalé uno más nuevo y la IA me recomendó que le haga un cambio, creo que fue borrar algo al inicio que indicaba el formato. Ahora el py no genera el archivo que necesito generar. En fin ¿es por esa línea que borré o qué? La IA no me da una respuesta simple, por ejjemplo dice que puede que el loop sea muy largo, pero si funcionaba...


En línea

EdePC
Moderador Global
***
Desconectado Desconectado

Mensajes: 2.268



Ver Perfil
Re: No se genera el archivo.
« Respuesta #1 en: 27 Junio 2026, 15:50 pm »

Revisa el error que da, abre una consola (CMD) y ejecuta en ella tu archivo .py para ver los detalles del error.

Lo más probable es que sea por codificación como ya te ha pasado antes, guarda tu archivo .py con codificación UTF-8 que es con la que Python trabaja por defecto, si usas otra codificación debes especificar dicha codificación en la primera línea de tu archivo, línea que como dices has borrado


En línea

Mr.Byte


Desconectado Desconectado

Mensajes: 462



Ver Perfil
Re: No se genera el archivo.
« Respuesta #2 en: 27 Junio 2026, 15:52 pm »

En mi caso si que se genera el archivo:

https://d.tmpfile.link/public/2026-06-27/81c89c86-cc04-46e6-b5a0-be23aedc6ca5/Mywords.txt
En línea

Danielㅤ
Moderador
***
Desconectado Desconectado

Mensajes: 1.978


🔵🔵🔵🔵🔵🔵🔵


Ver Perfil
Re: No se genera el archivo.
« Respuesta #3 en: 27 Junio 2026, 23:09 pm »

Hola, el error que te da es probablemente porque en el comienzo de tu código/script no específicas la codificación a utilizar y el error debe venir porque en el primer comentario del código está la palabra "Función", ese acento en la letra ó es el posible causante del problema, que para solucionarlo podes reemplazar la "ó" por "o" sin acento o mejor aún sería que especifiques la codificación en la primera línea del código:

Código
  1. # -*- coding: utf-8 -*-
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 10.038



Ver Perfil
Re: No se genera el archivo.
« Respuesta #4 en: 28 Junio 2026, 04:01 am »

Hola. Solo quiero añadir que no basta con especificar la codificación en el código fuente, sino que además la codificación del archivo debe coincidir con la que se haya especificado.

"coding: utf-8" no convierte la codificación del archivo fuente. Lo único que hace es indicarle al intérprete de Python con qué codificación debe interpretar los bytes del archivo fuente.



Ya te han indicado cual es la solución más coherente con la codificación por defecto que utiliza Python. Sin embargo, y como alternativa aislada para tu caso, puedes especificar: "# coding: windows-1252" - eso lo escribes siempre la primera línea arriba del todo ya que seguramente en tu entorno hispanohablante por algún motivo estés creando los archivos con esa codificación, y de ahí viene el conflicto. Hazlo solo en caso de que prefieras evitar guardar el archivo con codificación UTF-8 como te han dicho. Aunque esto no sería una buena práctica hacerlo.



Por cierto, en el código que has mostrado estás realizando cientos y cientos de operaciones de escritura (I/O) sobre el archivo de texto cada vez que el búfer interno por defecto de Python (de muy pocos kilobytes, 8 me parece) se acumula y se vacía (flush). 3,61 MB / 8 KB = aprox. 451 de escrituras en el archivo de texto.

Lo suyo es utilizar un búfer con tamaño arbitrario en memoria para reducir drásticamente la cantidad de syscalls de escritura sobre el archivo físico:

Asegúrate de utilizar el parámetro para especificar un tamaño de búfer arbitrario:
Código
  1. buffering = 104857600 # 100 MB
  2. ...
  3. with open("Mywords.txt", "w", encoding="utf-8", buffering=buffering) as txt:

En este ejemplo, usando 100 MB como búfer de memoria, directamente te aseguras una única escritura sobre el archivo, ya que el archivo resultante con todas las combinatorias de palabras no llega ni a los 4 MB de tamaño. ¿Es un overkill? No si piensas escalar tu código actual para generar longitudes más grandes.



Aparte, la anidación de bucles 'for' también es mejorable y es un punto crítico en tu código que merma mucho la velocidad de ejecución. Con el código actual no vas a notar diferencia, pero con longitudes más grandes si lo notarías y de forma muy exponencial con periodos de tiempo extremadamente largos para completar la ejecución del programa ya que esos 'for' suponen varios problemas que añaden overhead en Python.

Lo ideal es que utilices itertools.product (implementado en el lenguaje 'C'):

Código
  1. # coding: utf-8
  2.  
  3. import itertools
  4.  
  5. def generate_valid_words():
  6.    charset = "abcdefghijklmnñopqrstuvwxyz"
  7.    prefix = "K"
  8.    output_path = "Mywords.txt"
  9.  
  10.    all_combinations = itertools.product(charset, repeat=4)
  11.  
  12.    with open(output_path, "w", encoding="utf-8") as text_file:
  13.        for combo in all_combinations:
  14.            if not (combo[0] == combo[1] == combo[2] or combo[1] == combo[2] == combo[3]):
  15.                valid_word = f"{prefix}{''.join(combo)}\n"
  16.                text_file.write(valid_word)
  17.  
  18. generate_valid_words()
  19. input("Press Enter to exit...")

Pero como estoy muy oxidado en Python, le pedí a la IA Sonnet (en Claude) que lo optimizase todavía mucho más haciéndolo multi-core:

Código
  1. # coding: utf-8
  2.  
  3. import itertools
  4. import multiprocessing
  5. import time
  6.  
  7. FILENAME  = "Mywords.txt"
  8. ENCODING  = "utf-8"
  9. BUFFERING = 104857600 # 100 MB
  10.  
  11. CHARSET   = "abcdefghijklmnñopqrstuvwxyz"
  12. PREFIX    = "K"
  13. LENGTH    = 4
  14. BATCH     = 300_000
  15.  
  16. def format_elapsed(seconds_total):
  17.    hh   = int(seconds_total // 3600)
  18.    mm   = int((seconds_total % 3600) // 60)
  19.    ss   = int(seconds_total % 60)
  20.    ffff = int((seconds_total % 1) * 10000)
  21.    return f"{hh:02d}:{mm:02d}:{ss:02d}:{ffff:04d}"
  22.  
  23. def worker(first_char):
  24.    chars  = list(CHARSET)
  25.    n      = LENGTH - 1
  26.    lines  = []
  27.    batch  = []
  28.    join   = "".join
  29.  
  30.    for rest in itertools.product(CHARSET, repeat=n):
  31.        combo = (first_char,) + rest
  32.        valid = True
  33.        for i in range(LENGTH - 2):
  34.            if combo[i] == combo[i + 1] == combo[i + 2]:
  35.                valid = False
  36.                break
  37.        if valid:
  38.            lines.append(f"{PREFIX}{join(combo)}\n")
  39.            if len(lines) >= BATCH:
  40.                batch.append("".join(lines))
  41.                lines.clear()
  42.  
  43.    if lines:
  44.        batch.append("".join(lines))
  45.  
  46.    return batch
  47.  
  48. def main():
  49.    cores = multiprocessing.cpu_count()
  50.    print(f"Usando {cores} cores...")
  51.  
  52.    start = time.perf_counter()
  53.  
  54.    with open(FILENAME, "w", encoding=ENCODING, buffering=BUFFERING) as f:
  55.        with multiprocessing.Pool(processes=cores) as pool:
  56.            for chunks in pool.imap(worker, CHARSET):
  57.                for chunk in chunks:
  58.                    f.write(chunk)
  59.  
  60.    elapsed = time.perf_counter() - start
  61.    print(f"Tiempo total: {format_elapsed(elapsed)}")
  62.  
  63. if __name__ == "__main__":
  64.    main()
  65.    input("Press Enter to exit...")

Los resultados son claros:

Longitud = 4, tu enfoque actual: ~800 ms
Longitud = 4, optimización básica itertools.product: ~350 ms
Longitud = 4, optimización completa itertools.product multi-core: ~240 ms

(aquí es donde la cosa se pone seria)

Longitud = 5, tu enfoque actual (bucles anidados y adaptados para esta longitud): ~19 segundos.
Longitud = 5, optimización básica itertools.product: ~9 segundos.
Longitud = 5, optimización completa itertools.product multi-core: ~3 segundos.

Longitud = 6, tu enfoque actual (bucles anidados y adaptados para esta longitud): SIN MEDIR (estima de 30 minutos para arriba}.
Longitud = 6, optimización básica itertools.product: ~14 minutos.
Longitud = 6, optimización completa itertools.product multi-core: ~2 minutos.

 
« Última modificación: 28 Junio 2026, 04:37 am por Eleкtro » En línea



Tachikomaia


Desconectado Desconectado

Mensajes: 1.782


Hackentifiko!


Ver Perfil
Re: No se genera el archivo.
« Respuesta #5 en: 5 Julio 2026, 06:29 am »



Qué bueno que ya pudiste comprobar que tu código funciona perfectamente cuando se ejecuta desde la consola.
La razón por la que se cierra rápido y no genera el archivo al hacerle doble clic normal es que Windows y Python manejan de forma muy distinta la ruta donde se guardan las cosas en cada caso:
## El motivo del problema

* Al usar la consola (cmd): El sistema sabe exactamente en qué carpeta estás parado, por lo que crea Mywords.txt ahí mismo.
* Al hacer doble clic: Windows abre el intérprete de Python (el archivo python.exe general del sistema). Para Python, la "carpeta actual" pasa a ser la carpeta del sistema de Windows (como C:\Windows\System32 o tu carpeta de usuario principal C:\Users\TuUsuario), y no la carpeta donde está tu script.

Al intentar crear el archivo de texto en una carpeta del sistema, Windows bloquea la acción por falta de permisos de administrador, Python lanza un error de acceso denegado y la ventana se cierra de golpe instantáneamente sin escribir nada.
------------------------------
## La Solución Definitiva (Modifica tu código)
Para que el programa funcione con doble clic desde cualquier lugar, debes decirle a Python que busque la ruta exacta donde está guardado el script y cree el archivo de texto ahí mismo.
Reemplaza tu código actual por este (solo agregamos la librería os para detectar la ruta):

# -*- coding: utf-8 -*-import os
charset = "abcdefghijklmnñopqrstuvwxyz"
def has_three_consecutive_same_chars(word):
    """Función para verificar si hay tres caracteres consecutivos iguales."""
    for i in range(len(word) - 2):
        if word == word[i + 1] == word[i + 2]:
            return True
    return False
# Esto detecta automáticamente la carpeta real donde está este archivo .pydirectorio_actual = os.path.dirname(os.path.abspath(__file__))ruta_archivo = os.path.join(directorio_actual, "Mywords.txt")
# Guardamos el archivo usando la ruta absoluta correctawith open(ruta_archivo, "w", encoding="utf-8") as txt:
    for a in charset:
        for b in charset:
            for c in charset:
                for d in charset:
                    word = "K" + a + b + c + d
                    if not has_three_consecutive_same_chars(word):
                        txt.write(word + "\n")

print("¡Proceso terminado con éxito!")
print(f"Archivo guardado en: {ruta_archivo}")
input("\nPresiona Enter para salir...")


Funcionó pero creo que antes no era tan complicado... ¿no se puede simplificar?
« Última modificación: 5 Julio 2026, 06:51 am por Tachikomaia » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
VB no genera exe de un solo proyecto o.O
Programación Visual Basic
raul338 6 5,499 Último mensaje 20 Diciembre 2009, 18:54 pm
por Dessa
por que no me genera el ejecutable ?¿
Programación C/C++
lupitapro 1 4,699 Último mensaje 14 Junio 2010, 23:07 pm
por Littlehorse
explicacion del programa que genera pi
Programación C/C++
kiara_luna 0 3,110 Último mensaje 10 Septiembre 2011, 19:13 pm
por kiara_luna
Borrar espacio que genera el TAB?
Programación Visual Basic
yalosabes 3 2,661 Último mensaje 21 Noviembre 2013, 00:56 am
por Danyfirex
Bot genera socks 5 en IRC
Dudas Generales
Krizn 2 2,329 Último mensaje 13 Octubre 2018, 21:55 pm
por Krizn
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines