Я учусь кодить на Пайтоне. Если не трудно, покажите приемы оптимизации на данном примере. Скрипт рабочий. Если надо могу приложить еще образец файла, откуда все читается. К сожалению, некоторые отступы «поползли». Sorry.
#! /usr/bin/python
# -*- coding: utf-8 -*-
"""Файл-мэнеджер, обрабатывающий файлы Descript.ion, созданные программой FAR
Файлы раскодируются из DOS, выводится список файлов с их каментами, опция асинхронного запуска.
"""
from Tkinter import *
import codecs
import re
import os
import subprocess
root = Tk()
class wid:
def __init__(self):
fr = Frame(root) # рисуем gui
fr.pack(side=TOP)
self.bt = Button(fr, text='Run', command = self.yak)
self.bt.pack(side=LEFT)
self.en = Entry(fr, width=70)
self.en.pack(expand=NO, side=RIGHT)
def yak(self): # функция, выполняемая при нажатии кнопки run
z = self.en.get()
ss = re.compile(r"(^(\".*?\"|[^ ]*) (.*$))") # отделяем имя файла от камента
u = list(ss.match(z).groups()) # to do: это надо делать в начале глав. цикла...
global f_name
f_name = u[1].replace('"','') # вычищаем лишние кавычки
img = ['jpg|JPG', 'gif|GIF', 'png|PNG', 'tiff|TIFF'] # файловые ассоциации
vid = ['avi|AVI', 'mpg|MPG']
def check(ls): # функция проверки расширения файлов
ext = f_name[-3:] # вырезаем расширение из имени файла
for y in ls: # обходим переданный список расширений
t = re.compile(y)
if t.match(ext): # если расширение соответствует паттерну
w = os.getcwd() + '/' + f_name # выводим путь
break
else:
w = 0
return w
wls = [] # список аргументов для передачи объекту Popen
if check(img) != 0: # если check нашел расширение и вернул путь к файлу
wls.append('feh') # делаем список для запуска в ком. строке
wls.append(check(img))
# print wls
subprocess.Popen(wls) # обработка списка (модуль subprocess)
# else: # здесь должно быть исключение. лучше try - except
#subprocess
# print 'img'
else:
if check(vid) != 0:
wls.append('mplayer') # делаем список для запуска в ком. строке
wls.append(check(vid))
# print wls
subprocess.Popen(wls) # весь кусок после wls = [] - в объект. Не всем типам файлов нужен
# асинхронный запуск...
# else: # здесь должно быть исключение. лучше try - except
###################### MAIN ############################
try:
fp = codecs.open('./Descript.ion', "rb", "cp866") # читаем файло
l = fp.read()
p = l.split("\n")
fp.close
except:
print "no desc file found"
some = []
for i in range(len(p) - 1): # построчная обработка списка. Главный цикл.
some.append(wid()) # добавляем экземпляры класса, содержащего кнопку и поле ввода
some[i].en.insert(0, p[i].rstrip()) # пишем в поле текст из строки
root.mainloop()
# to do: 1 стоит здесь (в главном цикле) разделить имя файла и камент. То и другое - globals
# 2 добавить вывод ls (опционально вывод только откомментированных файлов)
# 3 сохранение файла описания в файл utf8 (desc.utf). при старте поиск этого файла, затем
# поиск старого файла Descript.ion
# 4 забить каменты в базу (lightSQL?), поиск по базе каментов.