我制作了一个程序,我的目的是能够读取或写入文件目录下的文件。我做了读取功能,当我测试它时,我得到了这个错误
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")
此外,如果有人可以建议我可以添加的内容以便能够写入文件
答案 0 :(得分:1)
您应该阅读scopes。问题是函数read
不知道变量dir
。通常,这会导致NameError
,但在这种情况下,dir
也是内置函数的名称。这个函数被传递给open
调用,导致看到错误。您应该将目录名作为read
函数的参数。一般来说,你应该避免与内置链接冲突的名字。
答案 1 :(得分:1)
swbsphe建议的全球性一般都是坏主意,应该尽可能避免。 更喜欢使用参数:
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)
答案 2 :(得分:0)
您的代码中存在一些问题,但TypeError
是因为dir
不是您认为的问题。 dir
是一个python内置函数。
据推测,您认为因为dir
已在file
函数中设置了它将继续在read
函数中设置。事实并非如此。 Python变量有一个范围 - 它们(通常)只存在于函数/ module / ...中,它们被定义为 1 。函数将数据传递给调用者的最佳方法是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
以避免与内置库冲突,使用上下文管理器进行文件资源管理等),但这应该至少让你开始。
1 还有闭包以及global
和nonlocal
关键字使事情变得更加困难,但它们与此答案并不相关,所以我要掩饰这些细节......