历史上我一直使用以下方法来读取
python
中的文件:
with open("file", "r") as f:
for line in f:
# do thing to line
这仍然是推荐的方法吗?使用以下内容有什么缺点吗:
from pathlib import Path
path = Path("file")
for line in path.open():
# do thing to line
我发现的大多数参考文献都使用
with
关键字来打开文件,以便不必显式关闭文件。这适用于这里的迭代器方法吗?
with open()
文档
如果您只想读取或写入一小段文本(或字节),那么在使用 pathlib 时不再需要使用 with 语句:
>>> import pathlib
>>> path = pathlib.Path("/tmp/example.txt")
>>> path.write_text("hello world")
11
>>> path.read_text()
'hello world'
>>> path.read_bytes()
b'hello world'
这些方法仍然在内部使用上下文管理器(src)。
打开大文件来迭代行仍应使用 with 语句,如 文档所示:
>>> with path.open() as f:
... for line in f:
... print(line)
...
hello world
请记住,
Path
对象用于处理文件系统路径。就像Python的内置库一样,Path对象中有一个open方法,但没有close方法。
.close
位于由内置 open 或使用 Path 对象的 open 方法返回的文件句柄中:
>>> from pathlib import Path
>>> p=Path(some_file)
>>> p
PosixPath('/tmp/file')
您可以使用内置的 open 函数或 Path 对象中的 open 方法打开该 Path 对象:
>>> fh=open(p) # open built-in function
>>> fh
<_io.TextIOWrapper name='/tmp/file' mode='r' encoding='UTF-8'>
>>> fh.close()
>>> fh=p.open() # Path open method which aliases to os.open
>>> fh
<_io.TextIOWrapper name='/tmp/file' mode='r' encoding='UTF-8'>
>>> fh.close()
您可以查看 Github 上 pathlib 的源代码,以了解
pathlib
的作者如何在自己的代码中做到这一点。
我观察到的是三件事之一。
到目前为止最常见的是使用
with
:
from pathlib import Path
p=Path('/tmp/file')
#create a file
with p.open(mode='w') as fi:
fi.write(f'Insides of: {str(p)}')
# read it back and test open or closed
with p.open(mode='r') as fi:
print(f'{fi.read()} closed?:{fi.closed}')
# prints 'Insides of: /tmp/file closed?:False'
您可能知道,在
with
块的末尾,会调用 __exit__
方法。对于文件来说,这意味着该文件已关闭。这是pathlib
源代码中最常见的方法。
其次,您还可以在源代码中看到,pathlib 对象维护着进入和退出状态以及文件打开和关闭的标志。然而,
os.close
函数并未显式调用。您可以使用 .closed
访问器检查该状态。
fh=p.open()
print(f'{fh.read()} closed?:{fh.closed}')
# prints Insides of: /tmp/file closed?:False
# fi will only be closed when fi goes out of scope...
# or you could (and should) do fh.close()
with p.open() as fi:
pass
print(f'closed?:{fi.closed}')
# fi still in scope but implicitly closed at the end of the with bloc
# prints closed?:True
第三,在 cPython 上,当文件句柄超出范围时,文件将被关闭。这不是可移植的,也不是可依赖的“良好实践”,但通常是这样。 pathlib 源代码中有这样的实例。
Pathlib
是操作文件系统路径的面向对象方法。
使用 pathlib 模块打开文件的推荐方法是使用上下文管理器:
p = Path("my_file.txt")
with p.open() as f:
f.readline()
这可确保在使用文件后关闭文件。
在您提供的两个示例中,您没有关闭文件,因为您是“就地”打开它们。 由于
p.open()
返回文件对象,您可以通过分配它并检查属性
closed
来测试它,如下所示:from pathlib import Path
path = Path("file.txt")
# Open the file pointed by this path and return a file object, as
# the built-in open() function does.
f = path.open()
for line in f:
# do some stuff
print(f.closed) # Evaluates to False.