TypeError。我不明白是什么错误
问题描述:
我做了一个程序,我设计了能够读取或写入文件给定的文件目录。我做了读功能,当我测试了它我得到这个错误TypeError。我不明白是什么错误
TypeError: coercing to Unicode: need string or buffer, builtin_function_or_method found
的代码是:
def file():
dir = raw_input("DIR : ")
def read():
f = open(dir, "r")
for line in f:
print line.strip("\n")
f.close
def main():
file()
op = raw_input("ACTION : ")
if op == "read":
read()
if __name__ == "__main__":
main()
它说的错误是在该行:
f = open(dir, "r")
另外,如果有人可以建议我可以添加什么,以便能够写入文件
答
您应该阅读约scopes。问题是功能read
不知道变量dir
。通常,这会导致NameError
,但在这种情况下,dir
也是内建函数的名称。这是传递给导致看到的错误的open
调用的这个函数。您应该将目录名称作为read
函数的参数。一般来说,你应该避免与buildin冲突的名字。
答
您的代码中存在一些问题,但TypeError
是因为dir
不是您认为的那样。 dir
是一个python内建函数。
大概你认为因为dir
在file
函数中被设置了,它将继续在read
函数中设置。这是不正确的。 Python变量有一个范围 - 他们(通常)只能在函数/ module/...中定义,它们被定义为。函数将数据传递给调用者的最佳方式是return
的值。然后,您可以使用参数将该值传递给其他函数。一些最小的改动,我将让你的代码应该是这样的:
def file():
return raw_input("DIR : ")
def read(dir):
f = open(dir, "r")
for line in f:
print line.strip("\n")
f.close()
def main():
dir = file()
op = raw_input("ACTION : ")
if op == "read":
read(dir)
if __name__ == "__main__":
main()
有迹象表明,可以在这里进行更多的更改(更改名称dir
和file
避免与内建命令的冲突,使用上下文经理为文件资源管理等),但这至少应该让你开始。
也有倒闭和global
和nonlocal
关键字,这使得事情变得更加困难,但他们不是这个答案超相关的,所以我要掩饰,详细说明...
答
由swstephe提出的全局通常是一个坏主意,应该尽可能地避免。 喜欢使用参数:
def file():
dir = raw_input("DIR : ")
return dir
def read(dir):
f = open(dir, "r")
for line in f:
print line.strip("\n")
f.close
def main():
dir = file()
op = raw_input("ACTION : ")
if op == "read":
read(dir)
file()函数设置一个局部变量“dir”,然后将其丢弃。你打开的“dir”是,而不是你的变量。如果您想以这种方式传递值,请将“全局目录”添加到每个函数的顶部。 – swstephe
因此,如果一个变量要用于比它写入的函数更多的地方,那么它之前需要具有“全局”? –
在函数中修改或创建的变量(这是'file()'中'dir'的情况)始终被认为是该函数的本地函数,除非您手动将它们指定为全局函数。 – Julien