Как вырезать конец строки по некоторому условию в Python?

Я искал возможные пути, но пока не могу их перепутать. У меня есть строка, которая является путем к изображению.

myString= "D:/Train/16_partitions_annotated/partition1/images/AAAAA/073-1_00191.jpeg"

Что я хочу сделать, это заменить images с IMAGES и отрезать 073-1_00191.jpeg часть в конце. Таким образом, новая строка должна быть

newString = "D:/Train/16_partitions_annotated/partition1/IMAGES/AAAAA/"

И нарезанная часть (073-1_00191.jpeg) будет использоваться отдельно в качестве имени обработанного изображения. Функция .replace() здесь не работает, так как мне нужно предоставить path а также filename как отдельные параметры.

Причина, по которой я хочу это сделать, заключается в том, что я обращаюсь к изображениям по их путям и делаю с ними что-то, а при их сохранении мне нужно создать другой каталог (в данном случае IMAGES) и следующие каталоги после этого (в данном случае AAAAA) должен остаться прежним (вместе с названием соответствующего изображения).

Обратите внимание, что изображения могут иметь разные имена и расширения

Если что-то не понятно с моей стороны, пожалуйста, спросите, я постараюсь прояснить

3 ответа

Решение

Как упоминалось в комментариях, os.path полезен для манипулирования путями, представленными в виде строк.

>>> import os

>>> myString= "D:/Train/16_partitions_annotated/partition1/images/AAAAA/073-1_00191.jpeg"

>>> dirname, basename = os.path.split(myString)

>>> dirname
'D:/Train/16_partitions_annotated/partition1/images/AAAAA'

>>> basename
'073-1_00191.jpeg'

На этом этапе то, как вы хотите использовать заглавные буквы, является функцией вашей более широкой цели. Если вы хотите просто использовать это слово с большой буквы, dirname.replace('images', 'IMAGES') должно хватить. Но вы, похоже, спрашиваете о более обобщенном способе использовать второй и последний каталог в абсолютном пути:

>>> def cap_penultimate(dirname):
...     h, t = os.path.split(dirname)
...     hh, ht = os.path.split(h)
...     return os.path.join(hh, ht.upper(), t)
... 

>>> cap_penultimate(dirname)
'D:/Train/16_partitions_annotated/partition1/IMAGES/AAAAA'

Простой способ:

myString= "D:/Train/16_partitions_annotated/partition1/images/AAAAA/073-1_00191.jpeg"

a = myString.rfind('/')

filename = myString[a+1:]

restofstring = myString[0:a]


alteredstring = restofstring.replace('images', 'IMAGES')
print(alteredstring)

выход:

D:/Train/16_partitions_annotated/partition1/IMAGE/AAAAA

Это игра нарезки, здесь вы можете попробовать это:

myString= "D:/Train/16_partitions_annotated/partition1/images/AAAAA/073-1_00191.jpeg"

myString1=myString.split('/')


pre_data=myString1[:myString1.index('images')]

after_data=myString1[myString1.index('images'):]

after_data=['IMAGE'] + after_data[1:2]

print("/".join(pre_data+after_data))

выход:

D:/Train/16_partitions_annotated/partition1/IMAGE/AAAAA
Другие вопросы по тегам