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

Рейтинг: 1Ответов: 2Опубликовано: 13.04.2015

Суть задачи такова: пользователь выбирает текстовый документ через 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()

Ответы

▲ 4Принят

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

  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

▲ 1

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

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