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

pathlib Path `write_text` in append mode

是否有 python pathlib.Path 对象在附加模式下到 write_text() 的快捷方式?

标准 open() function has mode="a" to open a file for writing and appending to the file if that file exists, and a Paths .open() 函数似乎具有相同的功能 (my_path.open("a"))。

但是方便的 .write_text('..') 快捷方式怎么样,有没有一种方法可以使用 pathlib 打开并附加到文件,只需执行与 open() 相同的操作?

为清楚起见,我可以做到

with my_path.open('a') as fp:
    fp.write('my text')

但是还有别的办法吗?

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

不是真的,正如您在 pathlib 模块中看到的那样,存在两种类型的路径 类:

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

论文 类 构造函数的参数将只是 *pathsegments

如果您查看可用的 read/write 方法(read_text/read_bytes 和 write_text/write_bytes),您还会看到模式也不可用

因此,正如您已经发现的那样,您可以对这些路径库 类 使用模式的唯一方法是使用 open 方法,即:

with my_path.open("a") as f:
    f.write("...")

这是设计使然,这样路径库 类 就变成了真正的 "clean"。此外,上面的代码片段已经是规范的,因此无法进一步简化。不过,您可以在上下文管理器之外使用 open 方法:

f = my_path.open("a")
f.write("...")

pathlib 方法 Path().write_text()Path().write_bytes() 在退出时关闭文件连接。

from pathlib import Path

Path('file.txt').write_text('my text')
Path('file1.txt').write_bytes(b'my text')

使用附加模式,即 open('a', ...) 将实例化一个 TextIOWrapper,它在退出时也会被 write_text / write_bytes 关闭。

f = Path('file.txt')
f.open("a")
f.write_text('my text')
# or
f.write_bytes(b'my text')

否则必须手动关闭

f = Path('file1.txt').open('a')
f.write('my text')
f.close()

但也可以这样:

fp = Path('test.txt').open('a')
<_io.TextIOWrapper name='test.txt' mode='a' encoding='UTF-8'>
fp.write('my text')

fq = Path('test1.txt').open('ab', encoding='iso8859-1')
<_io.TextIOWrapper name='test1.txt' mode='a' encoding='iso8859-1'>
fq.write(b'my text')

如果使用 WITH 结构太麻烦,这可能会提供一种解决方法:

from pathlib import Path as p
t1 = "The quick brown fox" 
t2 = "just jumped over the fence"
t3 = "to greet the lazy poodle."
mypath = p("D:\Try_this")
myfile = p("fox.txt")
if not(mypath.is_dir()):
    mypath.mkdir()
wholepath = p(mypath / myfile)
wholepath.write_text("\n".join([t1,t2,t3]))

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

def append_text(path, text, encoding=None, errors=None):
   with path.open("a", encoding=encoding, errors=errors) as f:
       f.write(text)

您可能想知道为什么不将这样的东西作为一种方法直接内置到 pathlib 中。一个原因恰恰是因为它很容易自己实现,所以不值得添加,但显然这不是全部,因为 read_textwrite_text 自己实现起来同样容易。

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

具体来说,我指的漏洞是在循环中对同一个文件重复使用 append_text。因为您不断地打开和关闭文件,所以它 。另外,做这么多不必要的写入可能对硬盘驱动器的健康不利。

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

这正是天真的程序员会写的那种代码:

from pathlib import Path

N = 100

path = Path("numbers.txt")

path.write_text(f"{N}\n")
for i in range(N):
    path.append_text(f"{i}\n")
  • 这是一个很好的解决方案吗? 没有
  • 内存效率高吗? 没有
  • 是单线的吗?
from pathlib import Path

my_path = Path('/shopping_list.txt')

my_str = '\nFresh Spinach\nFrozen Strawberries'

my_str.write_text(my_path.read_text() + my_str)