追加模式下的 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 Path
s .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_text
和 write_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)
是否有 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 Path
s .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_text
和 write_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)