python pathlib附加模式下的路径'write_text'

vlurs2pr  于 2023-03-16  发布在  Python
关注(0)|答案(6)|浏览(157)

python pathlib.Path对象在append模式下是否有write_text()的快捷方式?
标准的open()函数有mode="a"打开一个文件,如果该文件存在,则写入并附加到该文件,Path.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')

cyej8jka

cyej8jka1#

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

*纯路径类{纯路径、纯PosixPath、纯Windows路径}
*具体路径类{路径、PosixPath、Windows路径}。

这些类构造函数的参数将仅为*pathsegments
如果查看可用的读/写方法(read_text/read_bytes和write_text/write_bytes),您还会看到mode也不可用
因此,正如您已经发现的,将mode与这些pathlib类一起使用的唯一方法是使用open方法,即:

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

这是设计好的,这样pathlib类就变得非常“干净”了。另外,上面的代码片段已经是规范的了,所以不能再简化了。不过,你可以在上下文管理器之外使用open方法:

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

sg3maiej2#

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,该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')
insrf1ej

insrf1ej3#

write_text没有“append mode”,也没有相应的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")
6yt4nkrj

6yt4nkrj4#

  • 这是个好办法吗不是
  • 内存效率高吗?
  • 是一行程序吗是的
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)
fdx2calv

fdx2calv5#

如果使用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]))
9njqaruj

9njqaruj6#

创建一个函数并绑定到pathlib.Path

from pathlib import PosixPath
from pathlib import Path as p

def _append_text(self:PosixPath, target:str) -> None:
    with self.open('a') as f:
        f.write(target)

p.append_text = _append_text
Path = p

创建新路径对象

sample_text = Path('/tmp/sample.txt')

写入模式

sample_text.write_text('hello world')

追加模式

sample_text.append_text('hello world, appended!')

相关问题