Python 打字错误。我不知道';我不明白错误是什么

Python 打字错误。我不知道';我不明白错误是什么,python,typeerror,Python,Typeerror,我设计了一个程序,可以在给定的文件目录下读写文件。我做了read函数,当我测试它时,我得到了这个错误 TypeError:强制使用Unicode:需要字符串或缓冲区,找到内置函数或方法 代码是: def file(): dir = raw_input("DIR : ") def read(): f = open(dir, "r") for line in f: print line.strip("\n") f.close def main():

我设计了一个程序,可以在给定的文件目录下读写文件。我做了read函数,当我测试它时,我得到了这个错误

TypeError:强制使用Unicode:需要字符串或缓冲区,找到内置函数或方法
代码是:

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

另外,如果有人能建议我可以添加什么,以便能够写入文件,您应该阅读。问题是函数
read
不知道变量
dir
。通常,这会导致
名称错误
,但在这种情况下,
dir
也是内置函数的名称。正是这个函数传递给
open
调用,从而导致所看到的错误。您应该将目录名作为
read
函数的参数。一般来说,您应该避免与内置名冲突的名称。

您的代码中有一些问题,但是
类型错误是因为
dir
不是您想象的那样。是一个python内置函数

您可能认为,由于在
文件
函数中设置了
dir
,因此它将继续在
读取
函数中设置。这不是真的。Python变量有一个作用域——它们(通常)只存在于函数/模块/。。。定义它们的地方1。函数向调用者传递数据的最佳方法是
返回值。然后可以使用参数将该值传递给其他函数。我将对您的代码进行的一些最小修改如下所示:

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这里还有闭包和
全局
非局部
关键字,它们让事情变得更加困难,但它们与这个答案没有太大关系,所以我将对这些细节进行润色

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)

函数的作用是:设置一个局部变量“dir”,然后将其丢弃。open中的“dir”是变量,而不是变量。如果要以这种方式传递值,请在每个函数的顶部添加“global dir”。因此,如果一个变量要在多个函数中使用,而不是在其写入的函数中使用,则需要在其前面加上“global”(在函数中修改或创建的变量)(这是
文件()
中的
dir
的情况)除非您手动将它们指定为全局变量,否则它们始终被视为该函数的局部变量。您应该从函数中返回一个值,而不是使用一个全局变量(您几乎不应该这样做)。