将readline()保存为元素而不是字符串

时间:2013-05-28 22:25:46

标签: python

确定, 假设我有一个文件中的变量名列表,我想将它们存储在列表中。 我可以创建一个while循环并逐个附加到列表中,但它们会作为字符串保存在列表中。如何将其更改为一组变量名称。

list = []
f = open("text.txt",r)
f.readline()
while line != "":
    list.append(line)   
    f.readline()

我希望list是变量名列表而不是字符串列表。 感谢

1 个答案:

答案 0 :(得分:5)

首先,只是的变量名是一个字符串。所以,你已经把变量名放在一个列表中了。

如果您正在尝试查找每个字符串命名的全局变量,并将这些变量放入列表中...那么,您不能这样做,因为您无法将变量放入列表中。变量在Python中不是真实的东西,它们只是(内置的,全局的,本地的或合格的)值的名称; 是真实的东西。

但是如果你试图查找每个字符串命名的全局变量,并将每个变量的值放入列表中......这很容易。改变这一行:

list.append(line)

......对此:

list.append(globals()[line])

但是,您的代码存在许多其他问题,这意味着它实际上无法正常工作。您已使用变量r而不是字符串'r'作为文件模式,(除非r碰巧巧合地保存有效模式字符串)将失败。你也永远不会向line分配任何东西,只丢掉每个readline的结果,这意味着你将获得一个异常(或一个无限循环或一个立即退出的循环)试图访问它。

与此同时,大多数逐行读取文件的方法,包括f.readline(),都会将换行符保留在字符串的末尾,并且你不太可能有一个名字以换行符结尾的变量。

虽然我们在这,但这不是非常pythonic代码。你永远不应该命名变量list,你应该总是关闭你的文件,空字符串是假的,所以你不需要比较,你应该使用for循环迭代集合。

所以:

values = []
with open("text.txt") as f:
    for line in f:
        values.append(globals()[line.rstrip('\n')])

或者,更简单地说,使用列表理解:

with open("text.txt") as f:
    values = [globals()[line.rstrip('\n')] for line in f]

最后,整个设计目标闻起来很奇怪,我愿意打赌,这不是你想要完成任何事情的正确方法。