Python, Tkinter. Изменить расширение и взять цифру из имени файла

401 просмотра
0
0 Комментариев

Суть задачи такова: пользователь выбирает текстовый документ через askopenfilename, который имеет вид textX.txt, где X — цифра (например, text0.txt).

Вопрос в том, как убрать убрать расширение .txt, заменив его на .gif, и получить число Х.

В конечном счёте должно получится imgX.gif.

from Tkinter import *
from tkFileDialog  import askopenfilename
 
class App:
   def __init__(self, master):
 
    frame = Frame(master)
    frame.pack()
 
    self.button = Button(frame, text="QUIT", command=frame.quit)
    self.button.pack(side=BOTTOM)
 
    self.text = Text(frame)
    self.text.pack(side=BOTTOM)
 
    self.choosen = askopenfilename(initialdir='files/')
    self.text.insert(END,open(self.choosen).read())
 
 
    ###RIGHT HERE###
    self.link  = PhotoImage(file=##########)
    self.image = Label(frame,image=self.link)
    self.image.pack(side=TOP)
 
root = Tk()
app = App(root)
root.mainloop()


Добавить комментарий

3 Answers

Python Опубликовано 09.12.2018
0

Вам нужно что-то наподобие os.path.splitext:

namewithoutext = os.path.splitext(self.choosen)[0]

Прибавить .gif, надеюсь, не проблема.


Чтобы извлечь финальные цифры, проще всего наверное использовать регулярку:

import re
re.findall(r"\d+$", namewithoutext)


Чтобы откусить найденное число, можно сделать просто

nakedname = namewithoutext[:-len(trailingnumber)]

Добавить комментарий
0

В вашем случае будет удобно написать вспомогательную функцию, которая:

  1. выделяет в пути имя файла;
  2. выполняет замену;
  3. формирует новый путь.

Для разделения пути и финального объединения лучше воспользоваться функциями из os.pathsplit (разбиение) и join (слияние). Саму замену же удобно сделать при помощи регулярных выражений.

Функция может иметь следующий вид.

import os.path
import re
 
def get_img_name(txt_path):
    # Разделяем путь и имя файла
    (path, txt_name) = os.path.split(txt_path)
    # Выполняем замену
    gif_name = re.sub(r"^text(\d+)\.txt$", r"img\1.gif", txt_name)
    # Возвращаем новый путь
    return os.path.join(path, gif_name)

Здесь path_txt — путь к файлу textX.txt.

Регулярное выражение (шаблон поиска и замены) включает следующие элементы:

  • ^ — признак начала текста,
  • \d — одиночная цифра,
  • \d+ — последовательность цифр (одна и более),
  • ( ) — позволяют выделить группу символов и сослаться на неё в строке замены через \1,
  • $ — признак конца текста.

re.sub принимает три аргумента: регулярное выражение; текст, на который выполняется замена; исходная строка.

Пример выполнения:

print get_img_name('/tmp/test/text12.txt')

/tmp/test/img12.gif

Стоит также дополнить функцию проверками на возможные исключительные ситуации и ошибочные входные данные. Здесь для краткости проверки были опущены. Поэтому если имя не будет соответствовать шаблону textX.txt, то замена не будет выполнена.

Документация на библиотеку os.path

Документация на библиотеку re

Добавить комментарий
0

Если у вас все файлы начинаются с одного и того же слова «text», то обработать имя файла можно гораздо проще:

old_filename = filename.split('.')
new_filename = 'img' + old_filename[0][4:] + '.gif'

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up