pathlib追加模式下的路径`write_text`

dan*_*van 5 python python-3.x pathlib

python pathlib.Path对象write_text()在添加模式下有快捷方式吗?

如果该文件存在,则标准open()函数必须mode="a"打开文件以进行写入和追加,并且Paths .open()函数似乎具有相同的功能(my_path.open("a"))。

但是,便捷的.write_text('..')快捷方式又如何呢?有没有一种方法可以用来pathlib完成打开和追加文件的操作open()呢?

为了清楚起见,我可以

with my_path.open('a') as fp:
    fp.write('my text')
Run Code Online (Sandbox Code Playgroud)

但是还有另一种方法吗?

my_path.write_text('my text', mode='a')

Kev*_*vin 9

没有“追加模式” write_text,也没有相应的append_text方法。如果你需要它,你可以很容易地自己编写一个函数:

\n
def append_text(path, text, encoding=None, errors=None):\n   with path.open("a", encoding=encoding, errors=errors) as f:\n       f.write(text)\n
Run Code Online (Sandbox Code Playgroud)\n

您可能想知道为什么这样的东西不直接构建pathlib为方法。一个原因正是因为它很容易自己实现,所以实际上不值得添加,但显然这不是故事的全部,因为read_textwrite_text同样很容易自己实现。

\n

pathlib.Path我认为对象没有(而且实际上不应该)有方法的一个主要原因append_text是它为没有经验的用户创造了一个漏洞,这在 API 设计中是一个巨大的罪过。

\n

具体来说,我所指的漏洞是append_text在循环中重复使用同一文件。因为您不断地打开和关闭文件,所以速度很。另外,进行如此多不必要的写入可能对硬盘的健康状况不利。

\n

更糟糕的是,因为程序实际上会正确运行(例如,文件将具有他们想要的内容),他们甚至可能没有注意到任何错误,因为他们不一定有一个关于写入文件“应该多长时间”的心理衡量标准。 “ 拿。

\n

这正是 na\xc3\xafve 程序员会编写的代码:

\n
from pathlib import Path\n\nN = 100\n\npath = Path("numbers.txt")\n\npath.write_text(f"{N}\\n")\nfor i in range(N):\n    path.append_text(f"{i}\\n")\n
Run Code Online (Sandbox Code Playgroud)\n


Dan*_*nny 6

  • 这是一个很好的解决方案吗?
  • 内存效率高吗?
  • 是单行吗?是的
from pathlib import Path

my_path = Path('/shopping_list.txt')

my_str = '\nFresh Spinach\nFrozen Strawberries'

my_path.write_text(my_path.read_text() + my_str)
Run Code Online (Sandbox Code Playgroud)


BPL*_*BPL 5

并非如此,正如您在pathlib模块中看到的那样,存在两种类型的路径类:

  • 纯路径类 {PurePath,PurePosixPath,PureWindowsPath}
  • 具体路径类 {Path,PosixPath,WindowsPath}。

这些类构造函数的参数将为just *pathsegments

而且,如果您查看可用的读/写方法(read_text / read_bytes和write_text / write_bytes),您还将看到mode都不可用

因此,正如您已经发现的那样,可以对这些pathlib类使用mode的唯一方法是使用openmethod,即:

with my_path.open("a") as f:
    f.write("...")
Run Code Online (Sandbox Code Playgroud)

这是设计使然,pathlib类变得真正“干净”。另外,上面的代码段已经是规范的,因此无法进一步简化。您可以open在上下文管理器之外使用方法:

f = my_path.open("a")
f.write("...")
Run Code Online (Sandbox Code Playgroud)

  • @pabouk 这是为了保护初学者......请参阅 https://bugs.python.org/issue46554 中的讨论 (4认同)
  • 我不明白这个说法:_这是设计使然,这样 pathlib 类就变得真正“干净”。_ --- 这如何使类_干净_?它们已经包含了 `write_*` 方法,但不够灵活。如果方法(或类)不是_dirty_,例如向它们添加可选参数`append=False`如何使它们_dirty_? (2认同)