71

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

newpath = path + '.res'

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

newpath = path.with_suffix(path.suffix + '.res')

它看起来像是一种解决方法,因为它最终仍然使用字符串添加。它有一个新的陷阱,因为我一开始忘记处理已经有几个扩展并且你想添加一个新的情况,导致下面的代码恢复旧的行为:

newpath = path.with_suffix(''.join(path.suffixes) + '.res')

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

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

4

7 回答 7

64

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

new_path = path.parent / (path.name + '.suffix')
于 2020-02-18T13:24:40.400 回答
13

看起来 Path 不像被就地修改(你不能更改.parts[-1]目录或更改.suffixes等),但这并不意味着你需要求助于任何太令人讨厌的东西。以下工作很好,即使它不像我想要的那样优雅:

new_path = path.with_suffix(path.suffix + new_suffix)

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

于 2018-10-31T21:37:19.483 回答
12

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

from pathlib import Path
first = Path("D:/user/file.xy")
print(first)
second = Path(str(first)+".res")
print(second)
于 2018-11-02T10:11:48.867 回答
10

您可以使用 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')


你可以在githubPyPi上找到它


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

于 2020-07-02T14:16:37.543 回答
3

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

old_path = Path("/the/old/path.foo")  # "/the/old/path.foo"
new_path = Path(f"{old_path}.bar")    # "/the/old/path.foo.bar"
于 2021-05-11T11:56:42.317 回答
0

如果您想附加文件名,但不更改扩展名,这可行

matfile2 = pathlib.Path.joinpath(matfile.parent, matfile.stem+' insert'+matfile.suffix)
于 2020-04-24T00:28:27.057 回答
0

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

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)

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

于 2018-07-06T15:27:17.733 回答