1

Mi objetivo es verificar si un o varios archivos existen. Esto lo intento por medio de un ciclo for que vaya creciendo de uno en uno el numero i, y que forme parte de el string el nombre del archivo que quiero validar si existe o no. Intente pasar el número por str(). Pero aun así me da el error de que no se puede concatenar int con str. Si nuevo en esto, si noten otro error el código agradecería que me corrigieran. Gracias de antemano. :)

import os
import sys

linelengt_userconfig = 99
charlengt_userconfig = 99

search = "0"
alreadysetsearch = False

filelog = "0"
alreadysetfile = False

perm = "0"
alreadysetperm = False

alreadyfile = True

while alreadyfile == True:
    for i in range(charlengt_userconfig):
        if os.path.isfile("C:/Program Files/logsearcher100/log" + "(" + str(i) + ")"):
            alreadyfile = True
        else:
            namefinallog = "log" + "(" + i + ")"

searchend = False

print("Usage: ")
print("     COMMAND             INFO.                                ")
print("     set search          Set the string to search in the file.")
print("     set file            Set the file to use")
print("     set perm            Set the permissions that will have the file")
print("     set finallog        Set the file that will have the info collected")
print("     run                 Run the script once you have of the options set")
print("     quit                Stop the script")

while keepgoing == True:
    usage = str(input("$ "))
if usage == "set search":
    search = str(input("SEARCH: "))
    alreadysetsearch = True
if usage == "set file":
    filelog = str(input("PATH/FILE: "))
    alreadysetfile = True
if usage == "set perm":
    perm = str(input("PERMISSIONS: "))
    alreadysetperm = True
if usage == "set finallog":
    namefinallog = str(input("FINAL LOG PATH/NAME: "))
if usage == "run" and alreadysetfile == True and alreadysetperm == True:
    keepgoing = False
    run()
if usage == "run" and (alreadysetsearch == False or alreadysetfile == False or alreadysetperm == False):
    print("Cant run the script, not all values are set. Please set all the values required.")
if usage == "quit":
    sys.exit()

usefullfile = open(filelog,perm)


runintext(search,file,perm,finallog)


def runintext():
    global search,file,perm,finallog

    placechar = 0
    placeline = 0

    for placeline in usefullfile(filelog,perm):
        for x in range(linelengt_userconfig):
            if search in placeline:
                finallog = open(namefinallog,"rw")
                writelines = finallog.write("line: " + placeline)
                for i in range(charlengt_userconfig):
                    if search in (placeline[(placechar + i):(placechar + len(search) + i)]):
                        finallog.seek(len(writelines) + 1)
                        finallog.write("char(s): " + (placechar + i) + ":" + (placechar + len(search) + i))
                searchend = True
            else:
                finallog.write("no match found")
                searchend = True

    if searchend == True:
        scriptinfo.close()

Escribo esto por que me dice que mi pregunta es mayormente código, así besos por donde orinan y bendiciones xD :)

3 Answers3

3

A ver si esto te ayuda:

array = []
elemento = ""
for i in range(5):
  elemento = "prueba %d" % (i);
  array.append(elemento)

print("\n")

for i in range(len(array)):
  print(array.__getitem__(i))
1

Haces la conversión en:

if os.path.isfile("C:/Program Files/logsearcher100/log" + "(" + str(i) + ")"):
                                                                ^^^^^^

Pero no en:

namefinallog = "log" + "(" + i + ")"
                            ^^^

ni en:

finallog.write("char(s): " + (placechar + i) + ":" + (placechar + len(search) + i))
                             ^^^^^^^^^^^^^^^         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

No obstante, la concatenación de cadenas es muy ineficiente dada su inmutabilidad, además de generalmente muy poco legible, usa formateo de cadenas:

if os.path.isfile(f"C:/Program Files/logsearcher100/log({i})"):

namefinallog = f"log({i})"

finallog.write(f"{char(s)}: {placechar + i}:{placechar + len(search) + i}")

Unas cuantas observaciones más:

  • Tienes un ciclo infinito:

    while alreadyfile == True:     # <<<<<<<<<<<<<<<<<<<<
        for i in range(charlengt_userconfig):
            if os.path.isfile("C:/Program Files/logsearcher100/log" + "(" + str(i) + ")"):
                alreadyfile = True # <<<<<<<<<<<<<<<<<<<< Por siempre jamás....
            else:
                namefinallog = "log" + "(" + i + ")"
    
  • No uses el operador == o != para saber si algo se evalúa como verdadero o falso, en vez de eso, usa simplemente if algo: / while algo: o if not algo: / while not algo:

    while alreadyfile == True:
    

    debe ser simplemente:

    while alreadyfile:
    

    en vez de:

    if usage == "run" and (alreadysetsearch == False or alreadysetfile == False or alreadysetperm == False):
    

    simplemente:

    if usage == "run" and (not alreadysetsearch  or not alreadysetfile  or not alreadysetperm):
    

    Si se da el caso de quieres saber si un objeto es el objeto bool True, que no es lo mismo que querer saber si algo se evalúa como verdadero, usa el operador de identidad is (if a is b), dado que False, True (y None) son singlentons.

  • No uses if encadenados cuando sean excluyentes, es ineficiente, usa if-elif:

    if usage == "set search":
        search = input("SEARCH: ")
        alreadysetsearch = True
    elif usage == "set file":
    
    ...
    
    elif usage == "quit":
        sys.exit()
    
  • Llamas a una función antes de definirla:

     runintext(search,file,perm,finallog)
    
    
     def runintext():
         ...
    

    además la función que defines no acepta parámetros y tu al llamarla le pasas 4. Debe ser:

     def runintext():
         ...
    
     runintext()
    
  • No te dejes archivos abiertos por el camino sin cerrar (usefullfile), no es tarea para que el GC se encargue, o los cierras explícitamente con close o mejor usa el administrador de contexto y with, que lo cierra aunque existan excepciones de por medio:

    with open("archivo.txt", "r") as file:
        # hacer lo que sea con file
    # Aquí el archivo se ha cerrado automáticamente
    
  • input en Python 3 ya retorna una cadena, hacer:

    variable_str = str(input("..."))
    

    es redundante e ineficiente, simplemente

    variable_str = input("...")
    
FJSevilla
  • 55,603
  • 7
  • 35
  • 58
1

Olvidaste hacer la conversión a string en esta línea:

namefinallog = "log" + "(" + i + ")"

Solo tienes que agregar str(i)

namefinallog = "log" + "(" + str(i) + ")"