Как стать автором
Поиск
Написать публикацию
Обновить

Питон для Домохозяек

Суть проблемы


В нашем вузе помимо основных экзаменов и зачетов принято сдавать так называемый трудзачет. Именно поэтому в конце семестра многие студенты бегают по двору университета с лопатами и вениками, активно используя запатентованную русскую технолоию ИБТД (Имитация Бурной Трудовой Деятельности). Некоторые отрабатывают трудзачет на кафедрах. Там им предлагается высокоинтеллектуальная работа по сортированию различных документов и занесению их имен в Excel. К числу последних отношусь и я...


В принципе, данная работа не является чем-то сложным до тех пор, пока тебе на хард не попадает 11GB информации, которую ты должен рассортировать и записать в Excel...


На помощь мне пришел Python.


Основные задачи


Скрипт, представленный ниже, должен решать две задачи:


  1. Искать все файлы, которые соответствуют заданному шаблону
  2. Заносить их имена в файл, формат которого поддерживает Excel (например Excel XML)

Решение


Решение состоит из 3 файлов: (main.py, config.py,template.xml)


  1. main.py — непосредственно сам скрипт
  2. config.py — файл настроек
  3. template.xml — файл шаблона (файл получается путем сохранения пустого файла Excel в формат Excel XML и выкидывания из него лишних строк)

Начнем с файла template.xml:


<?xml version="1.0" encoding="cp1251"?><?mso-application progid="Excel.Sheet"?><Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:x="urn:schemas-microsoft-com:office:excel">
Алексей
Алексей
2009-04-29T19:00:04Z
2009-04-29T19:00:18Z
11.5606

11250
18075
240
30
False
False

<Style ss:ID="Default" ss:Name="Normal">
<Alignment ss:Vertical="Bottom"/>
<Borders/>
<Font ss:FontName="Arial Cyr" x:CharSet="204"/>
<Interior/>
<NumberFormat/>
<Protection/>


<Worksheet ss:Name=«files»>

<PageMargins x:Bottom=«0.984251969» x:Left=«0.78740157499999996» x:Right=«0.78740157499999996» x:Top=«0.984251969»/>

<Selected/>
False
False






Далее файл настроек (config.py):
# -*- coding: cp1251 -*-s
import re
import os
#Определяем основные настройки скрипта с помощью словаря
class Config:
root_dir = os.path.curdir#Директория, где будет работать скрипт
reg1 = r"([-()._\sa-zA-zа-яА-Я0-9ёЁ?!+=№\S&@:;,]+) - ([-()._\sa-zA-zа-яА-Я0-9ёЁ?!+=№\S&@:;,]+).(zip|pdf|doc|djvu)$"# Регулярное выражение для поиска файлов по умолчанию ищет файл вида: "[Название книги] - [автор книги].[расширение файла]"
reg2 = r"([-()._\sa-zA-zа-яА-Я0-9ёЁ?!+=№\S&@:;,]+) - ([-()._\sa-zA-zа-яА-Я0-9ёЁ?!+=№\S&@:;,])$"# Регулярное выражение для поиска дирректорий содержащихся в корневой папке
template = "template.xml"
output = "output.xml"
def __init__(self):
self.r1 = re.compile(self.reg1)
self.r2 = re.compile(self.reg2)

conf = Config()#Создаем объект конфигурации

Файл main.py:
# -*- coding: cp1251 -*-s
# Импортируем необходимые модули
import sys, re, os, xml.dom.minidom, array
from xml.sax import *

#Подключаем файл настроек
from config import *

class App:
stat = 0
filedirs={"files": [],"dirs": []}
#Дирректорию на предмет файлов (сканирование производится также и во вложенных папках)
def search(self,config):
for root, dirs, files in os.walk(config):
for i in files: #Имена файлов заносим в переменную
self.filedirs["files"].append(i)

for i in dirs:
self.filedirs["dirs"].append(i)

self.filedirs["files"].sort() # Имена файлов сортируем по алфавиту
#Проверяем файлы на сответсвие шаблону
def query(self,reg,dom):
for i in self.filedirs["files"]:
if re.findall(reg,i):
tmp = re.findall(reg,i)
self.xml_operate(dom,tmp)
else:
self.stat = self.stat+1
# Анализируем xml документ
def parsexml(self,xmltoparse):
dom = xml.dom.minidom.parse(xmltoparse)
dom.normalize()
return dom
# Добавляем информацию в таблицу
def xml_operate (self,dom,i):
table = dom.getElementsByTagName("Table")
row = dom.createElement("Row")
table[0].appendChild(row)
for j in i[0]:
cell = dom.createElement("Cell")
data = dom.createElement("Data")
text = dom.createTextNode(j)
row.appendChild(cell)
cell.appendChild(data)
data.appendChild(text)
return dom
# Записываем изменения
def write_xml(self,dom,template):
f = open(template, "w", 1)
f.write(dom.toxml(encoding="cp1251"))
f.close()

def __init__(self,config):
self.search(config.root_dir)
dom = self.parsexml(config.template)
self.query(config.r1,dom)
self.write_xml(dom,config.output)
print "Коллличество файлов не соответсвующих шаблону"
print self.stat
a = App(conf) #В качестве параметров передаем скрипту объект, содержащий настройки

Все файлы кладем в директорию, в которой будет осуществляться поиск. Запускаем через Eclipse файл main.py (можно запускать также в чем-нибудь другом, при условии совместимости кодировок. Если запускать через консоль в Windows — появится ошибка)


Скрипт создает файл output.xml, который можно открыть с помощью Excel


Данный код не претендует на профессионализм и совершенство.


Пример иллюстрирует применение Python в бытовых условиях.

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.