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") 

另外,如果有人可以建议我可以添加什么,以便能够写入文件

+1

file()函数设置一个局部变量“dir”,然后将其丢弃。你打开的“dir”是,而不是你的变量。如果您想以这种方式传递值,请将“全局目录”添加到每个函数的顶部。 – swstephe

+0

因此,如果一个变量要用于比它写入的函数更多的地方,那么它之前需要具有“全局”? –

+0

在函数中修改或创建的变量(这是'file()'中'dir'的情况)始终被认为是该函数的本地函数,除非您手动将它们指定为全局函数。 – Julien

您应该阅读约scopes。问题是功能read不知道变量dir。通常,这会导致NameError,但在这种情况下,dir也是内建函数的名称。这是传递给导致看到的错误的open调用的这个函数。您应该将目录名称作为read函数的参数。一般来说,你应该避免与buildin冲突的名字。

您的代码中存在一些问题,但TypeError是因为dir不是您认为的那样。 dir是一个python内建函数。

大概你认为因为dirfile函数中被设置了,它将继续在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() 

有迹象表明,可以在这里进行更多的更改(更改名称dirfile避免与内建命令的冲突,使用上下文经理为文件资源管理等),但这至少应该让你开始。

也有倒闭和globalnonlocal关键字,这使得事情变得更加困难,但他们不是这个答案超相关的,所以我要掩饰,详细说明...

由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)