1

我有一个用户输入,我想将它作为打开函数的文件名参数传递。这是我尝试过的:

filename = input("Enter the name of the file of grades: ")
file = open(filename, "r")

当用户输入openMe.py出现错误时,

NameError: name 'openMe' is not defined

但是当用户输入"openMe.py“它工作正常。我很困惑为什么会这样,因为我认为文件名变量是一个字符串。任何帮助将不胜感激,谢谢。

4

2 回答 2

7

raw_input在 Python 2 中使用:

filename = raw_input("Enter the name of the file of grades: ")

raw_input返回一个字符串 whileinput等价于eval(raw_input()).

工作原理eval("openMe.py")

因为 python 认为 inopenMe.pyopenMe一个对象,而 py它的属性是它的属性,所以它首先搜索openMe,如果没有找到,则会引发错误。如果openMe找到,则在此对象中搜索属性py

例子:

>>> eval("bar.x")  # stops at bar only
NameError: name 'bar' is not defined

>>> eval("dict.x")  # dict is found but not `x`
AttributeError: type object 'dict' has no attribute 'x'
于 2013-05-02T07:52:36.077 回答
1

正如 Ashwini 所说,您必须raw_input在 python 2.x 中使用,因为input本质上是eval(raw_input()).

之所以在最后input("openMe.py")去掉.py是因为 python 试图找到一些被调用的对象openMe并访问它的.py属性。

>>> openMe = type('X',(object,),{})() #since you can't attach extra attributes to object instances.
>>> openMe.py = 42
>>> filename = input("Enter the name of the file of grades: ")
Enter the name of the file of grades: openMe.py
>>> filename
42
>>> 
于 2013-05-02T08:01:56.347 回答