类型错误。我不明白错误是什么

时间:2016-06-10 02:24:43

标签: python 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")

此外,如果有人可以建议我可以添加的内容以便能够写入文件

3 个答案:

答案 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()

此处可以进行更多更改(更改名称dirfile以避免与内置库冲突,使用上下文管理器进行文件资源管理等),但这应该至少让你开始。

1 还有闭包以及globalnonlocal关键字使事情变得更加困难,但它们与此答案并不相关,所以我要掩饰这些细节......