Добавление другого суффикса к пути, который уже имеет суффикс с pathlib

Я конвертировал какой-то старый код Python, чтобы использовать pathlib вместо os.path для большинства связанных с 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 существует, означает, что разработчики библиотеки рассмотрели случай, когда файл может иметь несколько расширений, но я не смог найти способ просто добавить новое расширение в путь. Есть ли более идиоматический способ, который я пропустил для достижения такого же поведения?

EDIT: на самом деле path.with_suffix(path.suffix + '.res') достаточно, чтобы обрабатывать случай, когда есть уже несколько расширений файлов, хотя это было не сразу для меня очевидным.

Ответ 1

Это не похоже на Path как изменение на месте (вы не можете изменить .parts[-1] или изменить .suffixes и т.д.), Но это не означает, что вам нужно прибегнуть к чему-то слишком неприятному, Следующее работает просто отлично, даже если оно не так элегантно, как хотелось бы:

new_path = (path.parent / path.name).with_suffix(path.suffix + new_suffix)

где path - ваша исходная переменная Path, а new_suffix - строка с вашим новым суффиксом/расширением (включая new_suffix ".")

Ответ 2

Вы можете просто преобразовать свой Path в строку, затем добавить новое расширение и преобразовать обратно в Path:

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

Ответ 3

Следующий код должен делать то, что вы хотите, очень динамичным способом.

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)

Тот факт, что обычные строковые операции могут быть использованы в этом случае, очень полезен, поскольку он добавляет большой контроль над желаемым файловым пути, не требуя большого ассортимента новых функций.