Python调用open()函数时出现TypeError错误的求助
Python调用open()函数时出现TypeError错误的求助
别急,这个问题其实是因为导入方式搞混了Python内置的open()函数和os模块里的同名函数,咱们来一步步解决它:
首先先看你写的代码:
from os import * cwd = getcwd() basename = input('Enter file name: ') file = str(cwd + '/' + basename) if path.isfile(file): with open(file, "r") as rf: content = f.readline() print(content)
以及你碰到的错误:
Enter file name: anything Traceback (most recent call last): File "C:\test.py", line 6, in <module> with open(file, "r") as rf: ~~~~^^^^^^^^^^^ TypeError: 'str' object cannot be interpreted as an integer
问题原因
你用了from os import *这种导入方式,会把os模块里的所有函数/变量都导入到当前代码的命名空间里,其中就包括os模块的open()函数。这个os.open是系统级的文件操作接口,和咱们平时用的Python内置open()完全不一样——它要求第一个参数是整数类型的文件描述符,而不是字符串路径,所以你传文件路径字符串进去就会报类型错误。
另外你的代码还有个小bug:content = f.readline()这里的变量名写错了,应该是rf.readline(),不然运行到这还会报NameError。
解决办法
这里给你几个可行的方案,选哪个都可以:
方案一:避免全局导入,用模块前缀调用
这是最推荐的做法,不容易出冲突:
import os cwd = os.getcwd() basename = input('Enter file name: ') file = os.path.join(cwd, basename) # 用os.path.join适配Windows/Linux不同的路径分隔符,比手动拼字符串更安全 if os.path.isfile(file): with open(file, "r") as rf: content = rf.readline() print(content)
方案二:只导入需要的函数
如果不想写os.前缀,可以只导入你需要的getcwd和path模块,这样就不会导入os.open:
from os import getcwd, path cwd = getcwd() basename = input('Enter file name: ') file = path.join(cwd, basename) if path.isfile(file): with open(file, "r") as rf: content = rf.readline() print(content)
方案三:显式调用内置open函数
如果一定要用from os import *,可以直接指定用Python内置的open:
from os import * import builtins cwd = getcwd() basename = input('Enter file name: ') file = str(cwd + '/' + basename) if path.isfile(file): with builtins.open(file, "r") as rf: content = rf.readline() print(content)
总的来说,尽量避免from module import *这种全局导入方式,尤其是os、sys这类包含很多常用名称的模块,很容易引发这种意想不到的冲突。
备注:内容来源于stack exchange,提问作者Elonmusk227
相关产品推荐
相关产品推荐

