将另一个后缀添加到已具有pathlib后缀的路径中

Mor*_*enn 27 python python-3.x pathlib

我正在转换一些旧的Python代码pathlib而不是os.path用于大多数与路径相关的操作,但我最终遇到了以下问题:我需要向已经有扩展的路径添加另一个扩展(而不是替换它).有了os.path,因为我们仅仅处理字符串,该解决方案是与字符串操作添加扩展:

newpath = path + '.res'
Run Code Online (Sandbox Code Playgroud)

它不起作用,pathlib.Path因为它不允许连接任意字符.我能找到的最接近的是:

newpath = path.with_suffix(path.suffix + '.res')
Run Code Online (Sandbox Code Playgroud)

它看起来像一个变通方法,因为它最终仍然使用字符串添加.它有一个新的陷阱,因为我首先忘记了已经有几个扩展并且你想要添加一个新扩展的情况,导致以下代码恢复旧的行为:

newpath = path.with_suffix(''.join(path.suffixes) + '.res')
Run Code Online (Sandbox Code Playgroud)

现在它不会感到简洁和干净,因为它使用越来越多的字符串操作来实现旧行为而不是纯路径操作.Path.suffixes存在的事实意味着库的开发人员考虑了文件可以有多个扩展的情况,但我找不到简单地向路径添加新扩展的方法.我是否有更多惯用的方式来实现相同的行为?

编辑:实际上path.with_suffix(path.suffix + '.res')足以处理已经有几个文件扩展名的情况,即使它对我来说并不是很明显.

P-G*_*-Gn 61

我发现以下内容比已经给出的答案更令人满意:

new_path = path.parent / (path.name + '.suffix')
Run Code Online (Sandbox Code Playgroud)

  • 稍微简化的版本:`new_path = path.parent / f"{path.name}.suffix"` (5认同)

Vic*_*era 8

我认为这会更好,因为您只想用任意字符串扩展当前路径。

old_path = Path("/the/old/path.foo")  # "/the/old/path.foo"
new_path = Path(f"{old_path}.bar")    # "/the/old/path.foo.bar"
Run Code Online (Sandbox Code Playgroud)

  • 令人惊讶的是,这是最易读的代码。Pathlib 在后缀方面走得太远,忘记了最简单的事情。 (2认同)

scn*_*erd 7

似乎不像就地修改Path一样(您无法更改.parts[-1]目录或change .suffixes等),但这并不意味着您需要诉诸于任何太不愉快的事情。即使它不是我想要的那么优雅,以下代码也可以正常工作:

new_path = (path.parent / path.name).with_suffix(path.suffix + new_suffix)
Run Code Online (Sandbox Code Playgroud)

path您的原始Path变量在哪里,并且new_suffix是带有新后缀/扩展名的字符串(包括前导“。”)

  • 但是... `path.parent / path.name` 与原始的 `path` 完全相同,那么它与 OP 的 `path.with_suffix(path.suffix + '.res')` 有何不同? (7认同)
  • 您的答案将替换后缀,而不是添加它 (4认同)
  • 如果您要写出两个扩展名,那么写为“new_path = path.with_suffix(new_suffix)”可能会更规范 (2认同)
  • @ImanolUr 我认为“new_suffix”将包含所需的一切。请参阅编辑后的代码以获得更直观的答案。 (2认同)

bit*_*nox 7

您可能会使用 pathlib3x - 它提供了最新的(在撰写此答案 Python 3.10.a0 之日)Python 3.6 或更高版本的 Python pathlib 的反向移植,以及一些附加功能,例如 append_suffix

>>> python -m pip install pathlib3x

>>> import pathlib3x as pathlib

>>> pathlib.Path('some_path').append_suffix('.ext')
PosixPath('some_path.ext')
>>> pathlib.Path('some_path.ext.ext2').append_suffix('.ext3')
PosixPath('some_path.ext.ext2.ext3')


Run Code Online (Sandbox Code Playgroud)

你可以在githubPyPi上找到它


免责声明:我是 pathlib3x 库的作者。

  • @Dash:只要我活着,它就会被维护 - 然后你可以接管;-)因为我每天都使用它...... (2认同)

Win*_*and 5

您可以将其转换Path为字符串,然后添加新的扩展名并转换回Path

from pathlib import Path
first = Path("D:/user/file.xy")
print(first)
second = Path(str(first)+".res")
print(second)
Run Code Online (Sandbox Code Playgroud)

  • 你也可以猴子修补它:`Path.__add__ = lambda self, rhs: Path(str(self) + rhs)` (4认同)

小智 -1

以下代码应该以非常动态的方式执行您想要的操作。

from pathlib import Path
import time

p = Path('.')
p = p / '..' / 'Python' / 'Files' / 'Texts_to_read' / 'a_text_file'

new_p = str(p).split('\\')

new_suffix = '.txt'

new_p[-1] = new_p[-1] + new_suffix

p = Path('.')

for x in new_p:
    p = p / x

print(new_p)

print(p)
print(str(p))

time.sleep(5)
Run Code Online (Sandbox Code Playgroud)

事实上,在这种情况下可以使用普通的字符串操作是一件好事,因为它增加了对所需文件路径的大量控制,而不需要大量的新函数。