Squeak.ru - шаблоны программирования

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

Я конвертировал старый код 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') достаточно для обработки случая, когда уже есть несколько расширений файлов, хотя это не было сразу очевидно для меня.


  • Не видел вашего редактирования, пока не опубликовал мой ответ... это тоже кажется довольно хорошим решением 01.11.2018
  • кажется, не было лучшего ответа, чем однострочник, который у вас уже был. pathlib, кажется, имеет некоторые очень раздражающие фатальные недостатки, которые затрудняют работу с простыми строками - например, если вы хотите добавить суффикс _foo.res к своему методу, вы получите ValueError: Invalid suffix, потому что он не начинается с точка! 27.06.2019
  • Вероятно, следует выбрать ответ... 19.11.2020
  • @MadPhysicist Я бы сделал это, если бы считал, что есть один хороший ответ, но, как свидетельствует ответ, в котором упоминается pathlib3x, в стандартной библиотеке нет чистого решения (и я не хочу добавлять новую зависимость для всей библиотеки ), и хотя некоторые из предложенных альтернатив верны, ни одна из них не кажется удовлетворительной. Я бы предпочел, чтобы масса выбрала свой любимый ответ. 19.11.2020
  • @Морвенн. А пока ваш вопрос валяется в очереди без ответа, а какому-то незадачливому человеку не хватает своих 15 баллов 19.11.2020
  • @MadPhysicist Я знаю об этом, к сожалению, очередь без ответов и баллы меня больше не волнуют. Я считаю, что действительно значимые знаки принятия имеют большую ценность для всего сообщества. 19.11.2020

Ответы:


1

Я нахожу следующее немного более удовлетворительным, чем ответы, которые уже были даны:

new_path = path.parent / (path.name + '.suffix')
18.02.2020
  • славный. Я боролся с этим - я не думал о скобках. 23.12.2020

  • 2

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

    from pathlib import Path
    first = Path("D:/user/file.xy")
    print(first)
    second = Path(str(first)+".res")
    print(second)
    
    02.11.2018
  • Вы также можете исправить это: Path.__add__ = lambda self, rhs: Path(str(self) + rhs) 30.10.2019

  • 3

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

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

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

    31.10.2018
  • Если вы собираетесь написать оба расширения, вероятно, более каноничным будет написать как new_path = path.with_suffix(new_suffix) 19.02.2019
  • ваш ответ заменит суффикс, а не добавит его 24.05.2019
  • @ImanolUr Я предполагал, что new_suffix будет включать все желаемое. См. отредактированный код для более интуитивно понятного ответа. 24.05.2019
  • Но... path.parent / path.name в точности эквивалентен исходному path, так чем же он отличается от path.with_suffix(path.suffix + '.res') из ОП? 04.04.2020

  • 4

    Вы можете использовать pathlib3x — он предлагает резервную копию последней (на дату написания этого ответа Python 3.10.a0) Python pathlib для Python 3.6 или новее, а также несколько дополнительных функций, таких как 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')
    
    
    

    вы можете найти его на github или PyPi


    Отказ от ответственности: я являюсь автором библиотеки pathlib3x.

    02.07.2020
  • Знаете ли вы, как будет поддерживаться это репо в будущем? 02.07.2020
  • Круто, теперь это то, что я хотел бы в стандартной библиотеке :o 03.07.2020
  • @Dash: он будет поддерживаться, пока я жив, - тогда Ты сможешь взять на себя управление ;-), так как я использую его каждый день ... 03.07.2020
  • @Morwenn, это была одна из причин, по которой я это сделал - с одной стороны, ясно, что разработчики не хотят загромождать стандартную библиотеку, с другой стороны, я хочу добавить полезные функции таким образом, чтобы они были совместимы и соответствовали стиль стандартной библиотеки. Просто чтобы сделать мой собственный код более читабельным и менее подробным. 03.07.2020

  • 5

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

    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)
    

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

    06.07.2018

    6

    Я думаю, что это было бы лучше, поскольку вы просто хотите расширить текущий путь произвольной строкой.

    old_path = Path("/the/old/path.foo")  # "/the/old/path.foo"
    new_path = Path(f"{old_path}.bar")    # "/the/old/path.foo.bar"
    
    11.05.2021

    7

    если вы хотите добавить имя файла, но не изменить расширение, это работает

    matfile2 = pathlib.Path.joinpath(matfile.parent, matfile.stem+' insert'+matfile.suffix)
    
    24.04.2020
    Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...