Создание списков из текстового файла - PullRequest
0 голосов
/ 03 октября 2018

Я хочу создать списки, но у них есть имя списков во внешнем файле с именем "mydog.txt".

mydog.txt :

bingo
bango
smelly
wongo

Вот мой код, который преобразует текст в элементы списка.Я думаю, что это работает, но по какой-то причине значения не сохраняются после ее завершения:

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

Подпрограмма должна взять имя (скажем, «бинго»), а затем превратить его в список иесть "test" внутри этого списка.

Последними переменными, которые я должен иметь, являются: "bingo = [" test "], bango = [" test "], smelly = [" test "], wongo = ["test"]

Последнее, что должно быть напечатано, это ['test'], но список не существует.

Почему он выводится в виде списка, когда внутри подпрограммы createlistа не вне подпрограммы?

Ответы [ 3 ]

0 голосов
/ 03 октября 2018
  1. Вы добавляете переменные в локальное пространство имен функции.Ничто из того, что вы добавляете, не будет видно за пределами функции.
  2. Назначение, которое вы делаете, относится к переменной с именем nameoflist, а не к строке, к которой она относится.

Чтобы обойти это, вы должны назначить пространство имен модуля.На самом деле это не так сложно:

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

Вопрос, который вы должны задать себе, - это почему вы хотите это сделать.Допустим, вы загружаете свой файл:

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

Теперь вы действительно можете сделать

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

Однако весь смысл использования файла заключается в том, чтобы иметь динамические имена.Вы не знаете, какие имена вы получите заранее, и как только вы вставите их в глобальное пространство имен, вы не будете знать, какие переменные пришли из файла, а какие из других.

Имейте в виду, чтоглобальное пространство имен - это просто необычный, но обычный словарь.Я рекомендую хранить переменные в вашем собственном словаре, просто для этой цели:

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

Теперь вы можете получить доступ к элементам по имени:

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

Но что более важно, выможете проверить, какие имена у вас есть, и реально манипулировать ими:

>>> list(mylists.keys())
['bingo', 'bango', 'smelly', 'wongo']
0 голосов
/ 03 октября 2018

Вы можете использовать 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])

или

print (bingo, bango, smelly, wongo)

выход:

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']
0 голосов
/ 03 октября 2018
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()

или with блок, чтобы не беспокоиться о закрытии файла

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'

В случае, если вы хотите создать списки, названные по именам, присутствующим в текстовых файлах, вам действительно следует создать dict с ключами в качестве имен и значением в виде списка, содержащего строку test

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

Затем попробуйте напечатать

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

Печать всего текста

print(my_dict) 

Выход:

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