繁体   English   中英

pathlib 路径`write_text` 在追加模式

[英]pathlib Path `write_text` in append mode

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

标准的open()函数有mode="a"来打开一个文件,如果该文件存在,则用于写入和附加到文件中,并且Path s .open()函数似乎具有相同的功能( my_path.open("a") )。

但是方便的.write_text('..')快捷方式呢,有没有办法使用pathlib来打开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_text/read_bytes 和 write_text/write_bytes),您还会看到 mode 也不可用

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

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

这是设计使然,这样 pathlib 类就变得非常“干净”。 此外,上面的代码片段已经是规范的,因此无法进一步简化。 不过,您可以在上下文管理器之外使用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')

当在方法上使用其他模式时,如 append (a),该方法自动打开 TextIOWrapper,并 write_[text|bytes] 关闭 TextIOWrapper。

f = Path('file.txt')
f.open("a")
f.write_text('my text')

或者

f = Path('file1.txt')
f.open("a")
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方法的一个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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM