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


Tema destacado: El geolocalizador de IP's ya funciona con IPv6


+  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] 2 Ir Abajo Respuesta Imprimir
Autor Tema: No se genera el archivo.  (Leído 7,649 veces)
Tachikomaia


Desconectado Desconectado

Mensajes: 1.798


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.277



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: 466



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.979


🔵🔵🔵🔵🔵🔵🔵


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.040



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.798


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

Tachikomaia


Desconectado Desconectado

Mensajes: 1.798


Hackentifiko!


Ver Perfil
Re: No se genera el archivo.
« Respuesta #6 en: 28 Julio 2026, 16:25 pm »

A ver si alguien puede explicar esto (obvien las menciones a John, hablo de Python, y aquí estamos hablando de Python):
https://foro.elhacker.net/software/john_the_rippley_de_nuevo-t524879.0.html;msg2287597#msg2287597

EDIT:
Díganme si esto les parece cierto, lo dijo una IA:
Cuando abres un archivo .py con doble clic, Windows utiliza el intérprete general de Python (python.exe o py.exe) para ejecutarlo. Al hacerlo de esta manera, el "Directorio de Trabajo Actual" (Current Working Directory) no siempre coincide con la carpeta del script; a menudo se establece por defecto en la carpeta del propio sistema de Windows (como C:\Windows\System32) o en tu carpeta de usuario. [1]
Aquí te explico por qué cambió este comportamiento y cómo puedes solucionarlo.
------------------------------
## ¿Por qué antes sí funcionaba?
Si en versiones anteriores de Python o en otra computadora se guardaba en la misma carpeta, se debe a cómo estaba configurado el registro de Windows para la extensión .py.
En versiones antiguas, la acción por defecto del doble clic iniciaba el comando indicando que el directorio de trabajo debía ser el del archivo. En las versiones más recientes de Python para Windows (que instalan el "Python Launcher" o py.exe), el comportamiento estándar cambió para priorizar la seguridad y la consistencia del sistema, haciendo que el directorio inicial dependa del entorno del usuario y no de la ubicación del archivo.
------------------------------
## ¿Se puede configurar de forma global en Windows?
No de forma nativa a través de una configuración simple de Python, ya que esto es un comportamiento del sistema operativo (Windows), no del lenguaje.
Para cambiarlo de forma global, tendrías que modificar manualmente el Registro de Windows (regedit) en la clave que asocia los archivos .py para obligar a Windows a iniciar el proceso en la carpeta del script. No se recomienda hacer esto, ya que cualquier actualización de Python sobrescribirá el registro y romperá la configuración otra vez.
------------------------------
## Las 2 mejores alternativas sin tocar el código
Si no quieres modificar tu script de Python para incluir os.path.dirname(__file__), tienes dos opciones muy sencillas:
## 1. Crear un acceso directo (La solución más limpia)
Si vas a ejecutar este script seguido mediante doble clic, no le des doble clic al .py. Haz esto:

   1. Haz clic derecho sobre tu archivo .py y selecciona Crear acceso directo.
   2. Haz clic derecho sobre el acceso directo creado y selecciona Propiedades.
   3. En la pestaña Acceso directo, busca el campo que dice Iniciar en:.
   4. Borra lo que tenga y escribe la ruta de la carpeta donde está tu script (ejemplo: C:\MisScripts).
   5. Ahora, al dar doble clic al acceso directo, el archivo de texto se creará exactamente ahí.

## 2. Crear un archivo ejecutable .bat [2]
Puedes crear un archivo lanzador en la misma carpeta.

   1. Abre el Bloc de notas y escribe:
   
   @off
   cd /d "%~dp0"
   python tu_script.py
   
   (Nota: %~dp0 es un comando de Windows que significa "la carpeta donde está este archivo bat").
   2. Guarda el archivo con el nombre correr.bat en la misma carpeta que tu script.
   3. Al dar doble clic al archivo .bat, este forzará a la consola a situarse en esa carpeta y ejecutará el Python guardando el archivo de texto a su lado.

------------------------------
Si te interesa, puedo mostrarte cómo crear un instalador rápido con PyInstaller para convertir tu script en un archivo .exe independiente que siempre guarde los archivos a su lado, o podemos revisar el código si necesitas agregarle alguna otra función. ¿Cómo prefieres proceder?

[1] [https://cursosonline.cartagena99.com](http://cursosonline.cartagena99.com/file.php/10/Sitio_algoritmos_programacion/capitulo_8/cap8_4.html)
[2] [https://www.palentino.es](https://www.palentino.es/blog/%F0%9F%A7%B9-organiza-tu-carpeta-de-descargas-automaticamente-con-python-windows-linux-y-mac/)

[/quote]
Claro que no voy a hacer tanto lío, es sólo por curiosidad. Antes tenías W7, quizá eso también tenga que ver.
« Última modificación: 28 Julio 2026, 20:26 pm por Tachikomaia » En línea

EdePC
Moderador Global
***
Desconectado Desconectado

Mensajes: 2.277



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

El problema está en el código que pusiste primero, falta saltos de línea para que interprete el código, a no ser que lo hayan copiado mal, el código que pusiste en tu consulta de John si está bien, yo mismo he comprobado eso que te respondió la IA sobre las nuevas versiones de Python y el directorio actual (current directory), me parece que es falso, quería poner un video sin audio pero mejor le pongo audio aunque ando algo resfriado:

En línea

Tachikomaia


Desconectado Desconectado

Mensajes: 1.798


Hackentifiko!


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

A mí ese código no me genera el archivo.
Código
  1. charset = "ABCDEFGHIJKLMNÑOPQRSTUVWXYZ"
  2. def has_three_consecutive_same_chars(word):
  3.    """Función para verificar si hay tres caracteres consecutivos iguales."""
  4.    for i in range(len(word) - 2):
  5.        if word[i] == word[i + 1] == word[i + 2]:
  6.            return True
  7.    return False
  8.  
  9. with open("Mywords.txt", "w", encoding="utf-8") as txt:
  10.    for a in charset:
  11.        for b in charset:
  12.            for c in charset:
  13.                for d in charset:
  14.                    word = a + b + c + d
  15.                    if not has_three_consecutive_same_chars(word):
  16.                        txt.write(word + "\n")

Voy a buscar Mywords en el buscador a ver si se creó en otro lado. Tarda mucho, luego informo. Por ahora te digo que también probé ese py en el escritorio y no crea el archivo.

El buscador sólo halló 2 archivos con ese nombre:
- Uno que tengo en John, que tiene fecha de haber sido creado ayer, y no tendría sentido que ahora lo haya creado ahí, está ahí porque ayer lo copié ahí.
- Otro creado en Abril o algo así, que fue haciendo pruebas por todo esto.

Por hoy me cansé pero acá tienen una conversación con la IA.
https://share.google/aimode/fI7avpn4PFOoh8NDr

En resumen:
Pusimos una pausa al final, y el programa no llega a ella, se cierra antes.
Quité la Ñ y el problema siguió ocurriendo.
Su nueva teoría es que el archivo intenta guardarse en una carpeta de sistema y Windows lo evita.

Será que instalé mal Python, me habrá faltado poner algo, no sé.
« Última modificación: 29 Julio 2026, 08:01 am por Tachikomaia » En línea

EdePC
Moderador Global
***
Desconectado Desconectado

Mensajes: 2.277



Ver Perfil
Re: No se genera el archivo.
« Respuesta #9 en: 29 Julio 2026, 17:00 pm »

Citar
A mí ese código no me genera el archivo.

El código es correcto, el error está en otro lado

Citar
Voy a buscar Mywords en el buscador a ver si se creó en otro lado. Tarda mucho, luego informo.

Usa Everything, este realiza búsquedas en menos de un segundo

Citar
Pusimos una pausa al final, y el programa no llega a ella, se cierra antes.

Cierto, si hay un error grave antes de la pausa, el programa directamente se cierra y no continúa, requieres ejecutar el programa en una CMD para ver el problema

Citar
Quité la Ñ y el problema siguió ocurriendo.

Si estuvieras en Windows 7 que trabaja por defecto con codificación ANSI si tiene sentido, pero como ahora estás con Windows 10, este trabaja por defecto con utf-8 al igual que python, así que no deberías de tener problemas salvo que intencionalmente cambies la codificación del archivo al guardarlo

Citar
Su nueva teoría es que el archivo intenta guardarse en una carpeta de sistema y Windows lo evita.

Si lo ejecutas desde una CMD y dicha cmd tiene como carpeta actual System32 (típico cuando ejecutas la cmd como administrador), pues sí, te da error por intentar escribir algo en System32 que es una carpeta del sistema.

Citar
Será que instalé mal Python, me habrá faltado poner algo, no sé

Busca a python.exe y fíjate que sea el que instalaste, luego abre una CMD, llama a ese python.exe, dale tu archivo .py y ejecuta para ver que sucede

En línea

Páginas: [1] 2 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,669 Último mensaje 20 Diciembre 2009, 18:54 pm
por Dessa
por que no me genera el ejecutable ?¿
Programación C/C++
lupitapro 1 4,819 Último mensaje 14 Junio 2010, 23:07 pm
por Littlehorse
Borrar espacio que genera el TAB?
Programación Visual Basic
yalosabes 3 2,796 Último mensaje 21 Noviembre 2013, 00:56 am
por Danyfirex
Bot genera socks 5 en IRC
Dudas Generales
Krizn 2 2,450 Último mensaje 13 Octubre 2018, 21:55 pm
por Krizn
Array no se genera bien.
Programación General
Tachikomaia 2 10,915 Último mensaje 8 Mayo 2025, 05:18 am
por tellatmosphere
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines