Creando listas desde archivo de texto

Quiero crear listas, pero tengo el nombre de las listas en un archivo externo llamado “mydog.txt”.

mydog.txt

bingo bango smelly wongo 

Aquí está mi código que convierte el texto en elementos de lista. Creo que funciona, pero por alguna razón, los valores no se guardan una vez finalizado:

 def createlist(nameoflist): nameoflist = ["test"] print(nameoflist) file = open("mydog.txt") for i in file.readlines(): i= i.replace("\n", "") print(i) #making sure text is ready to be created into a list name createlist(i) file.close() print("FOR fuction complete") print(bingo) # I try to print this but it does not exist, yet it has been printed in the function 

Se supone que la subrutina toma un nombre (digamos “bingo”) y luego lo convierte en una lista y tiene "test" dentro de esa lista.

Las variables finales que debería tener son “bingo = [” test “], bango = [” test “], smelly = [” test “], wongo = [” test “]

    La última cosa que debe imprimirse es ['test'] pero la lista no existe.

    ¿Por qué se imprime como una lista cuando está dentro de la lista de createlist subrutinas pero no fuera de la subrutina?

    Puedes usar exec :

     with open('mydog.txt') as f: list_names = [line.strip() for line in f] for name in list_names: exec('{} = ["test"]'.format(name)) local = locals() for name in list_names: print ('list_name:', name, ', value:', local[name]) 

    o

     print (bingo, bango, smelly, wongo) 

    salida:

     list_name: bingo , value: ['test'] list_name: bango , value: ['test'] list_name: smelly , value: ['test'] list_name: wongo , value: ['test'] or ['test'] ['test'] ['test'] ['test'] 
    1. Usted está agregando variables al espacio de nombres local de la función. Nada de lo que agregues así será visible fuera de la función.
    2. La asignación que está realizando es a una variable nombrada por nameoflist , no a la cadena a la que se refiere.

    Para evitar eso, debes asignarlo al espacio de nombres del módulo. Esto no es realmente tan difícil:

     def createlist(nameoflist): globals()[nameoflist] = ["test"] 

    La pregunta que debes hacerte es por qué quieres hacer eso. Digamos que carga su archivo:

     with open("mydog.txt") as f: for line in f: createlist(line.strip()) 

    Ahora sí que puedes hacer

     >>> print(bingo) ['test'] 

    Sin embargo, el objective de usar un archivo es tener nombres dynamics. No sabe qué nombres recibirá por adelantado, y una vez que los coloque en el espacio de nombres global, no sabrá qué variables provienen del archivo y cuáles de otras partes.

    Tenga en cuenta que el espacio de nombres global es solo un diccionario elegante pero regular. Mi recomendación es mantener las variables en su propio diccionario, solo para el propósito:

     with open("mydog.txt") as f: mylists = {line.strip(): ['test'] for line in f} 

    Ahora puedes acceder a los artículos por nombre:

     >>> mylists['bingo'] ['test'] 

    Pero lo que es más importante, puedes verificar qué nombres tienes y manipularlos de una manera significativa:

     >>> list(mylists.keys()) ['bingo', 'bango', 'smelly', 'wongo'] 
     file = open("mydog.txt") my_list =file.read().splitlines() # will create the list from the file which should contain only names without '\n' file.close() 

    O with bloque para no preocuparse por el cierre de archivo.

     with open("mydog.txt") as file: my_list =file.read().splitlines() # will create the list from the file which should contain only names without '\n' 

    En caso de que desee crear las listas que llevan el nombre de los nombres presentes en los archivos de texto, realmente debería crear un dict con claves como los nombres y el valor como lista que contiene la test cadena test

     my_dict={i:['test'] for i in my_list} 

    Entonces intenta imprimir

     print(my_dict['bingo']) # will print list ['test'] 

    Imprimiendo todo el dict

     print(my_dict) 

    Salida:

     {'bango': ['test'], 'bingo': ['test'], 'smelly': ['test'], 'wongo': ['test']}