Python 属性错误:NoneType对象没有'close'属性

5 投票
2 回答
27431 浏览
提问于 2025-04-18 14:53

我正在学习Python,写了一个脚本,用来把一个文本文件的内容复制到另一个文件里。

这是我的代码。

from sys import argv
out_file = open(argv[2], 'w').write(open(argv[1]).read())
out_file.close()

我遇到了标题中提到的AttributeError错误。为什么当我在open(argv[2], 'w')上调用write方法时,out_file没有被分配为文件类型呢?

提前谢谢你们!

2 个回答

2

out_file 是和 函数 write() 的返回值 绑定在一起的;它返回的是 None

表达式 open(...).write(...) 是在打开的文件对象上调用 write 方法,但在这个表达式执行完后,打开的文件对象就被丢弃了。在这个表达式执行期间,只有栈在引用它。

你应该把文件对象当作上下文管理器来使用,这样它会 自动 关闭:

with open(argv[2], 'w') as writefile, open(argv[1]) as readfile:
    writefile.write(readfile.read())

with .. as .. 语句也只是把打开的文件对象绑定到一些名字上,这样你就可以直接使用这些对象了。

5

out_file 被赋值为 write 方法的返回值,而这个返回值是 None。把这条语句分成两部分来写:

out_file = open(argv[2], 'w')
out_file.write(open(argv[1]).read())
out_file.close()

其实,最好是这样做:

with open(argv[1]) as in_file, open(argv[2], 'w') as out_file:
    out_file.write(in_file.read())

使用 with 语句意味着当程序执行离开 with 块时,Python 会自动关闭 in_fileout_file

撰写回答