从文本文件创建列表

Creating lists from text file

我想创建列表,但在名为 "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

该子例程应该取一个名称(假设为 "bingo"),然后将其转换为一个列表,并在该列表中包含 "test"

我应该拥有的最终变量是 "bingo = ["test"], bango = ["test"], smelly = ["test"], wongo = ["test"]

最后应该打印的是['test']但是列表不存在。

为什么在子程序createlist内部打印出来的是一个列表,而在子程序之外却没有?

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']}
  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']

您可以使用 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']