一行代码打开、写入并关闭文件

-4 投票
2 回答
69 浏览
提问于 2025-04-14 16:39

我在pathlib的参考文档里找到了一个示例代码,我想知道我该怎么关闭这个打开的文件。

p = Path('foo')
p.open('w').write('some text')

我尝试去关闭这个文件。

Path('foo').open('w').write('some text').close()

结果出现了一个错误:AttributeError: 'int' object has no attribute 'close',我明白了为什么会出现这个错误,原因在于下面这句话。

Python的文件方法write()会把一个字符串写入文件,但它没有返回值。

那么我该怎么关闭这个文件呢?

2 个回答

2

你错误地认为在文件句柄的上下文中会调用链式的 close()。其实并不是这样的。那一行代码:

Path('foo').open('w').write('some text').close()

可以拆分成

a = Path('foo')
b = a.open('w')
c = b.write('some text')
c.close()

这样做其实没什么意义,因为 write() 返回的是写入的字节数,而不是一个句柄,所以 c 是一个 integer(整数),这样错误就会更明显了。所以在不必要的时候不要过早地进行优化:

p = Path('foo')
handle = p.open('w')
handle.write('some text')
handle.close();

但是,这样做不符合 Python 的风格。你应该使用 with

with Path('foo').open('w') as handle:
   handle.write('some text')

这样就可以自动处理文件的关闭了。

3

可以使用 pathlib.Path.write_text 这个函数来写文件,并且可以在一行代码里完成打开文件和关闭文件的操作:

这个函数会以文本模式打开指定的文件,写入数据,然后自动关闭文件:

Path('foo').write_text('some text')

注意,不能在 .write() 函数之后使用 .close(),因为 .write() 会返回写入文件的字符数(整数)。

另外,还有一个 pathlib.Path.read_text 函数,可以用来读取文件内容,并且同样可以一次性完成打开和关闭文件的操作。

撰写回答