прочитайте почему выбирают Python?

Онлайн школа програмирования Python Django(1,7 - 2,0 +) для людей, которые хотят стать программистами, веб-разработчиками.

Если вы готовы и хотите получить новую профессию и начать реально применять программирование на практике, значит этот портал для вас! Приступайте!

смотреть видео

Python с чего начать? Онлайн подробное руководство.

прочитайте почему выбирают Python?

http://spb-tut.ru/guest/category/3/

Первая программа на Python
В этом посте мы напишем первую программку, Эта статья рассчитана для python порграммеров среднего уровня.

Описание нашей программки

Наша программка будет простой, она сможет открывать окно для ввода пароля в случае если пароль будет неверным правильным мы будем выполнять действие к примеру выводить предупреждение.

Начинаем действовать

В уроке мы будем использовать Python версии 2.7 и библиотеку PyMsgBox. Начнём с установки, для этого просто введите в bash: pip install PyMsgBox Эта команда установит нужную нам библиотеку.

Пишем сам скрипт

Для написания скрипта я советую вам использовать текстовый редактор sublimetext. Он настраиваемый, и красивый. Теперь приступим к писанию самого кода. С начала импортируем библиотеку: from pymsgbox import * Теперь попробуем написать какое нибудь уведомление:
alert(text="I'm python beginer", title="My first app", button="Ок :3")
у нас высветится уведомление на подобии этого:
И унас выведится
Теперь внесём логики в прогу (сделаем так чтобы она думала), как я и сказал мы будем выводить предупреждение если юзер ввёл пароль. Поэтому напишем:
 from pymsgbox import *  
 pas = password('Enter your password.')  
 alert(text="Your password is {}".format(pas), title="My first app", button="OK :3") 
Вот как будет тогда работать наша программка: P.S мой блог

​Третий год подряд портал Айти-Событие.рф проводит Python-конференцию - «Piter Py», которая в этом году станет 2-х дневной и состоится 22 и 23 апреля в Санкт-Петербурге. Конференция призвана объединить людей, небезразличных к языку программирования Python для общения и обмена опытом.

xz9kEsFmBag_7jH6qKS.jpg

_

Формат:

    Двухдневная конференция в 2 параллельных потока докладов.
    День первый: с 14:00 до 19:00
    День второй: с 10:00 до 19:00

_

Язык:

    Русский + английский.

_

Типы докладов:

    Блиц-доклад: 20 мин. (15 мин. на доклад + 5 мин. на обсуждение)
    Двойной блиц-доклад: 40 мин. (30 мин. на доклад + 10 мин. на обсуждение)
    Секционный доклад / мастер-класс: 60 мин. (45-50 мин. на доклад + 10-15 мин. на обсуждение)

_

Предложить свой доклад...

_

Темы:

    Python и Web
    Python и Cloud
    Python и DevOps
    Python и Автоматизация
    Python и Наука…

_

Как это было раньше:

    Подробный отчет по итогам Piter Py #2 (20 марта 2015г.)
    Подробный отчет по итогам Piter Py #1 (25 апреля 2014г.) http://www.it-sobytie.ru/system/ckeditor/pictures/8152/content_pv-c0kkatmi.jpg

Задался вопросом, как выводить новости в разделе "Блог" по типу последняя новость сверху т.е. как в админеке Django при добавлении новости она выводится первой сверку а на сайте получается, что последняя. Вот решил сделать так, чтоб было как в админке последняя новость была первая сверху Подробнее можно посмотреть на моем сайте-практикуме!

Школа практического программирования.

Подробная инструкция как построить своё обучение на порталах. Инструкция составлена на уровень Python = 0, Django = 0, если вы знаете Python, значит просто отбрасываете этот пункт и т. д.

Читать инструкцию полностью.

Кого ищем?
    - сильный опыт/скилл Python, buzz words: Tornado, Celery; - знание и понимание шаблонов разработки - их преимуществ и недостатков, понимание сложности алгоритмов; - любые реляционные СУБД; - реальный опыт работы с NoSQL (Mongo, Redis, etc.); - уверенный bash. Желательно и будет существенным плюсом: - опыт highload; - опыт работы с RabbitMQ, Hadoop; - front-стек - angular, backbone, ember;
Кто мы такие?
    Clickavia сегодня - лидер на рынке продажи чартеров в онлайне. Нам уже больше 5 лет - создавали все сами с нуля, на свои деньги и без привлечения внешних инвестиций. Теперь мы заняты новой большой историей - платформой динамического пакетирования и продажи туров.
Что будем делать?
    Подключать новых поставщиков данных к нашей единой платформе, вырабатывать и внедрять стандарты для рынка. Обрабатывать и анализировать большие объемы данных, множество интеграций, API и парсинга. Новые технологии, highoad, тонна анализа, big data и персонализация на Hadoop, вот это все.
Как у нас работается?
    Весело и дико интересно. Отличная атмосфера без склок и бюрократии - нет никакой иерархии, все горизонтально. Драйв, динамика и зашкаливающие скорости. Отличный офис-лофт (фотки: тыц), вечеринки с ди-джеями и много веселья. Мы, прежде всего, технологическая компания и, несмотря на то, что давно работаем на рынке, дышим духом стартапа.
Условия
    - Full-time и тонна драйва, скучать не придется; - з/п - up to you; - офис – Солнечный Бали
  • Резюме на lmaiv16@gmail.com
  • +7 925 908 56 15 (Майя)
  • Второй год подряд портал Айти-Событие.рф проводит Python-конференцию - «Piter Py», которая состоится 20 марта в Санкт-Петербурге.

      Конференция призвана объединить людей, небезразличных к языку программирования Python для общения и обмена опытом.
      bann_python_conf_2.jpg
    Формат:
  • Однодневная конференция в 2 параллельных потока докладов.
    • Типы докладов:
    • Секционный доклад: 1 час (45-50 мин. на доклад + 10-15 мин. на обсуждение)
    • Блиц-доклад: 20 мин. (15 мин. на доклад + 5 мин. на обсуждение)
    • Двойной блиц-доклад: 40 мин. (30 мин. на доклад + 10 мин. на обсуждение)
      • Темы:
      • Python и Web
      • Python и Cloud
      • Python и DevOps
      • Python и Автоматизация
      • Python и Наука….
          • Подать свой доклад!
          CheckIO — ресурс для изучения и практики языка программирования Python. Абсолютно любой пользовать может зарегистрироваться на площадке и начать обучение или, уже зная язык, отшлифовать свои навыки.

          Обучение представлено в виде игры, в которой каждому пользователю необходимо в той или иной мере использовать свои знания. Например, первый этап обучения «Learning» — это цепочка задач от легкой к сложной. Причем, в описании самой задачи есть все справочные данные для ее решения.

          Таким образом, пользователь на примерах учится языку программирования Python и параллельно пробует свои силы. Впоследствии это может быть использовано для изучения и получения навыков работы с оупенсорсными библиотеками.

          Следующий тип задач — Score Games или Single Player Game. Это игры, в которых выиграть нельзя, но можно постараться набрать как можно больше очков. Первым представителем этих игр стал Lines lite.

          От классической игры в Lines эту игру отличает то, что не нужно, чтобы шар проходил путь полностью, а достаточно, чтоб он просто становился на пустое место. Как только пользователь написал программу и нажал play, он увидит в результатах работы программы поле, которое будет заполняться шарами разных цветов.

          Нажимая next или prev, пользователь будет двигаться по итерациям этой игры. Под игровым полем выводится количество набранных очков. Если пользователь набрал больше 0, он попадает в High Score этой игры.

          Третий тип задач — это Competition или Multi Player Game. Для тестирования своей программы пользователь выбирает соперника. Под соперником понимается написанная на этом портале кем-то другим программа, т. е. играют друг с другом программы пользователя. Первым представителем этой игры является «5 in row» или «Gomoku».

          Пользователю необходимо написать программу, которая бы играла с «кем-то» в эту игру. Кроме того, он может разместить свою игру на Арене («On Arena») для того, чтобы другие пользователи тестировали свою игру с этой программой. Игры, помещенные на Арену, периодически запускаются системой для проведения между ними соревнований.

          Проект был запущен в 2011 году.

          Утилита для работы с архивными каталогами

          Часто возникает желание привести свои фото-видео и просто архивы впорядок, но никогда не хватает терпения сделать это вручную. Решил написать удобную утилитку для поиска дубликатов ( дубликатами считаюся файлы с одинаковым содержимым, точнее с одинаковым md5 hexdigest, хотя они могут иметь и разные имена ) в "архивных"(raw) каталогах и поискать во всех возможных местах "потерянные"(uniq) файлы т.е файлы отсутствуразветвительющие в "архивных"(raw) каталогах. Хотелось набросать это за пару часов и "хотелось, как лучше, а получилось, как всегда". Вместо пары часов ушло пару вечеров. И раз уж все равно потрачено много времени, хочется довести эту утилитку до "более законченного" сосотояния и услышать от Питонистов их менение, замечания и просто пожелания по поводу: оптимизации, стиля, форматирования/оформления кода, именования переменных и т.д. В общем любая конструктивная критика приветствуется. Надеюсь с вашей помощью поучить что-то полезное не только для себя. Возможности настройки и использование должны быть понятны из кода (безусловно по возможности добавлю описание)

          Вкратце

          Утилита только читает каталоги и ничего не меняет. Пока, не меняет, в следующих версиях возможно будет. Утилита принимает на вход либо конфигурационный файл, либо опции коммандной строки(command-line) Например: ./ardiff.py --config=test.conf , либо и то и то, при этом command-line опции имеют приоритет. Основной параметр это "архивный каталог"(raw) или их список в которых будет осуществляться поиск дубликатов. Например вот так: ./ardiff.py --raw=dir1,dir2 #через запятую без пробелов. Могут быть указаны абсолютные пути или только их "относительная"(name) часть. Относительная по отношению к текущему каталогу или к каталогу, указанному в --raw-root./ardiff.py --raw-root=/home/user/photo-arch --raw=dir1,dir2 Аналогичным способом можно указать "внешние"(raw-sorted) каталоги, где будет осуществряться поиск недостающих(uniq) в "архивных"(raw) каталогах файлов. Еще можно управлять выводом результатов работы, их можно выводить на экран --verbose=2 и/или в файлы см. пример ниже.

          Рабочий пример

          В этом примере, утилита запускается с опциями, при которых будут найдены все дубликаты файлов в подкаталогах dir1 и dir2, которые находятся в каталоге /home/user/photo-arch, затем будут найдены все файлы, которые есть в подкаталогах dir3, dir4 и dir5 каталога photo-arch на внешнем носителе примонтированном к /media/user/3XX, при этом результаты будут выведены, как на экран, так и в файлы в каталоге ./folder-for-results.

          
          ./adiff.py  --raw-root=/home/user/photo-arch --raw=dir1,dir2 --raw-sorted-root=/media/user/3XX/photo-arch
          --raw-sorted=dir3,dir5 --dup_prefix=dup- --check_dup=Y --uniq_prefix=uniq- --check_uniq=Y 
          --out_root=folder-for-results --verbose=2
          
          Чтобы было не очень скучно сидеть, пока утилита перетряхивает гигабайты ваших арховов, при verbose = 1 на stdout, а при verbose = 2 на stderr, будет выводиться количество просмотренных каталогов, файлов и скорость из обхода в файлах в секунду. Утилитка пока сырая, но в умелых руках, вполне полезная и, как я уже писал, вполне безопасная, потому что ничего не удаляет и не пишет, кроме не очень больших файлов с результатами работы. Да и их порождение можно отключить.
          Не судите строго, и это именно тот не частый случай, когда помогать советом - уместно.

          Теперь исходники

          Файл: ardiff.py
          
          #!/usr/bin/env python
          # encoding: utf-8
          '''
          fsutils.ardiff -- Utility to help cleaning up the files archives/catalogs
          
          fsutils.ardiff is an utility to help cleaning up the files(photo,video, etc.) 
          archives/catalogs. For now it is do only look up for duplicates thru the 
          "main"/"raw" archives/catalogs. Also this utility can find unique files (files
          which not in the "main"/"raw" archives) in external catalogs. 
          
          It defines classes_and_methods
          
          @author:	 Gurman
          
          @copyright:  2014 Gurman Inc. All rights reserved.
          
          @license:	"Copyright 2014 Gurman (Gurman Inc.)    	\
          			Licensed under the Apache License 2.0\n		\
          			http://www.apache.org/licenses/LICENSE-2.0" 
          
          @contact:	apgurman@gmail.com
          @deffield	updated: Updated
          '''
          import sys
          import os
          import md5
          import time
          
          from kcommon import OptionParserWraper
          from kcommon import err_report
          from kcommon import CatalogsWalker
          from kcommon import OutSplitter
          
          __all__ = []
          __version__ = "v0.1"
          __date__ = '2014-11-24'
          __update__='2014-11-24'
          
          __version_string__ = '%%prog %s (%s)' % (__version__, __update__)
          
          DEBUG = 1
          
          __SORTED_SUFFIX__= "sorted.txt"
          __ASIS_SUFFIX__= "asis.txt"
          
          class FileInfo(object):
          	""" Class to hold file info """
          	
          	def __init__(self,_path,_name=None):
          		""" if _path only passed the _path == path+name """
          		self.__size, self.__hexdigest = None, None
          		if _name is None:
          			self.__path = os.path.dirname(_path)
          			self.__name = os.path.basename(_path)		  
          		else:
          			self.__path, self.__name = _path, _name
          		
          			
          	@property		
          	def path(self):
          		return self.__path
          	
          	@property		
          	def name(self):
          		return self.__name
          	
          	@property
          	def full_name(self):
          		return os.path.join(self.path,self.name)
          	
          	@property
          	def size(self):
          		""" calculate if need and return size for file """
          		if self.__size is None:
          			self.__size = os.stat(self.full_name).st_size
          		return self.__size
          	
          	@property
          	def hexdigest(self):
          		""" calculate if need and return md5 hexdigest for file """
          		if self.__hexdigest is None:
          			_md5 = md5.new()
          			_file = open(self.full_name, 'rb')
          			_block = _file.read(_md5.block_size)
          			while _block:
          				_md5.update(_block)
          				_block = _file.read(_md5.block_size)
          			self.__hexdigest = _md5.hexdigest()
          		return self.__hexdigest
          	
          	@hexdigest.setter
          	def hexdigest(self,_hxd):
          		""" hexdigest setter if we want to use something specific """
          		self.__hexdigest = _hxd
          		return self.__hexdigest
          	
          	def __eq__(self,finfo):
          		if finfo.size == self.size:
          			if self.name == finfo.name:
          				return True
          			else:
          				if self.hexdigest == finfo.hexdigest:
          					return True
          		return False
          	
          	def __ne__(self, o):
          		return not self.__eq__(o)
          	
          	def is_in(self,_flist):
          		for finfo in _flist:
          			if self.__eq__(finfo):
          				return True
          		return False
          						
          
          class RawCatalogs(object):
          
          	"""Class to manipulate and hold list of raw(archive) catalogs - main storage """
          
          	def __init__(self, opts ):
          		self.__count = 0
          		self.__opts=opts
          		
          		ctlgs=opts.raw.split(',')
          		self.__raw_catalogs = [os.path.join(opts.raw_root,x) for x in ctlgs] if opts.raw_root else ctlgs
          		
          		self.__out_splitter = OutSplitter([sys.stdout]) if opts.verbose == 1  else OutSplitter([sys.stderr])
          		
          		self.__raw_files, self.__raw_dup_files, self.__uniq_files = None, None, None
          
          	@property
          	def raw_files(self):
          		if self.__raw_files  is None:
          			self.__raw_files = {}
          			self._add_arhs(self.__raw_catalogs)
          		return self.__raw_files
          	
          	@property			
          	def raw_dup_files(self):
          		if self.__raw_dup_files is None:
          			self.__raw_dup_files = {}
          			self.raw_files
          		return self.__raw_dup_files
          	
          	@property
          	def uniq_files(self):
          		if self.__uniq_files is None:
          			self.__uniq_files = {}
          		return self.__uniq_files
          	
          	def _check_duplicate(self, finfo):
          		""" checks if the file's info already in archives """
          		for i in self.__raw_files[finfo.size]:
          			if finfo.hexdigest == i.hexdigest:
          				#First duplicate
          				if finfo.hexdigest not in self.__raw_dup_files:
          					d = []; d.append(i)
          					self.__raw_dup_files[finfo.hexdigest] = d
          				else:	#More then one duplicate
          					pass
          				#Remembering all duplicates
          				self.__raw_dup_files[finfo.hexdigest].append(finfo)
          			else: #Same size but different files 
          				pass
          		
          	def _add_to_arh_dict(self, finfo):
          		""" add file's information to archives """
          		if finfo.size not in self.raw_files:
          			self.raw_files[finfo.size] = []
          		elif self.__opts.check_dup == 'Y' :	
          			self._check_duplicate(finfo)
          			
          		self.raw_files[finfo.size].append(finfo)
          		
          	def _add_arhs(self,_catalogs, out_splitter=None):
          		""" main loop thru the archives to create internal structures """
          		
          		if out_splitter is None: out_splitter = self.__out_splitter
          		
          		for p,n in CatalogsWalker(_catalogs, out_splitter):
          			finfo = FileInfo(p,n)
          			self._add_to_arh_dict(finfo)
          	
          	def check_for_uniq_files(self,_catalogs,rfs=None,out_splitter=None):
          		""" look up external catalogs for files which isn't in archives """
          		uniq_files={}
          		
          		rfs = self.raw_files if rfs is None else rfs
          		
          		if out_splitter is None: out_splitter = self.__out_splitter
          		
          		cw=CatalogsWalker(_catalogs,out_splitter)
          		for p,n in cw:
          			
          			finfo = FileInfo(p,n)
          			
          			if finfo.size in rfs:
          				if not finfo.is_in(rfs[finfo.size]):
          					if finfo.hexdigest not in uniq_files:
          						x = []; x.append(finfo)
          						uniq_files[finfo.hexdigest] = x
          								
          			elif finfo.hexdigest not in uniq_files:
          					x = []; x.append(finfo)
          					uniq_files[finfo.hexdigest] = x
          					
          		return uniq_files
          	
          	def group_by_folders(self,d):
          		pd={}
          		for i in d:
          			for z in d[i]:
          				if z.path not in pd:
          					pd[z.path]=[]
          				pd[z.path].append(z)
          		return pd
          
          	def print_as_is(self,n,d,outs):
          		if not hasattr(outs, 'write') : return
          		w = outs.write
          		w(n)
          		for i in d:
          			w("\n")
          			for x in d[i]:
          				w(x.hexdigest+repr(x.size).rjust(12)+(x.full_name).rjust(64)+'\n')
          		w("\n")	
          						
          	def print_sorted_by_full_name(self,d,outs):
          		if not hasattr(outs, 'write') : return
          		for i in sorted(d.items(), key=lambda x: x[1][0].full_name):
          			print '\n',
          			for z in d[i]:
          				print z.full_name,"\t", z.size,"\t",z.hexdigest
          		print "\n"
          	
          	def print_sorted_by_catalogs_and_names(self, n, d,outs):
          		if not hasattr(outs, 'write') : return
          		w = outs.write
          		w(n)
          		for i in d:
          			w('\n\npath='+ i+ "\nfiles=")
          			for z in sorted(d[i], key=lambda x: x.name):
          				w(z.name + ',') #,"\t", z.size,"\t",z.hexdigest
          		w("\n")
          				
          def _time_str():
          	gmt=time.gmtime()
          	return  '-'+str(gmt.tm_year)+'-'+str(gmt.tm_mon)+'-'+str(gmt.tm_mday)+'-'+str(gmt.tm_hour)+\
          	 	 '-'+str(gmt.tm_min)+'-'+str(gmt.tm_sec)+'-'
          		
          def main_scenario(opts,args):
          	
          	rctlgs=RawCatalogs(opts)
          	
          	stdouts = sys.stdout if opts.verbose == 2 else None
          
          	if opts.check_dup == 'Y' :
          		rctlgs.raw_dup_files
          		
          		r, p = opts.out_root, opts.dup_prefix
          		fout_prefix = ( os.path.join(r, p+_time_str()) if r else p + _time_str() ) if p else None 			
          		
          		if fout_prefix or stdouts: 
          			fout_prefix_ = fout_prefix + __SORTED_SUFFIX__ if fout_prefix else None
          			out_splitter = OutSplitter([stdouts, fout_prefix_])
          			if out_splitter.pipes:
          				rctlgs.print_sorted_by_catalogs_and_names("\n[SORTED DUPLICATES]\n",
          					 	 	 rctlgs.group_by_folders(rctlgs.raw_dup_files), 
          						 	 out_splitter)
          			fout_prefix_ = fout_prefix + "-asis.txt" if fout_prefix else None	
          			out_splitter = OutSplitter([stdouts, fout_prefix_])
          			if out_splitter.pipes:
          				rctlgs.print_as_is("\n[DUPLICATES]\n", 
          								rctlgs.raw_dup_files, 
          								out_splitter)
          
          	if opts.check_uniq == "Y":
          		_catalogs=opts.raw_sorted.split(',')
          		_catalogs=[os.path.join(opts.raw_sorted_root,x) for x in _catalogs] if opts.raw_sorted_root else _catalogs
          		rctlgs.check_for_uniq_files(_catalogs)
          		
          		r, p = opts.out_root, opts.uniq_prefix
          		fout_prefix = ( os.path.join(r, p) if r else p ) if p else None 
          
          		if fout_prefix or stdouts: 
          			out_splitter = OutSplitter([stdouts, fout_prefix+__ASIS_SUFFIX__])
          			if out_splitter.pipes:
          				rctlgs.print_as_is("\n[UNIQS]\n",rctlgs.uniq_files, out_splitter) 
          	
          	print("\nThe end")
          			
          def main(argv=None):			
          	
          	try:
          		
          		opt_parser = OptionParserWraper(argv)#, version_string = __version_string__)
          		
          		main_scenario(opt_parser.opts,opt_parser.args)
          	
          	except Exception:
          		err_report()
          		return 2		
          
          
          if __name__ == "__main__":
          	if DEBUG:
          		if len(sys.argv) == 1:
          			sys.argv.append("--config=test.conf")
          			pass
          
          	sys.exit(main())
          
          
          Файл: kcommon.py
          
          #!/usr/bin/env python
          # encoding: utf-8
          
          import sys
          import os
          import time
          from sets import Set
          
          from optparse import OptionParser
          
          __def_vers__ = "v0.1"
          __def_duild_date__ = "2014-11-24"
          
          def err_report():
              
              if sys.exc_info() != (None,None,None) : 
                  last_type, last_value, last_traceback = sys.exc_info()
              else : 
                  last_type, last_value, last_traceback = sys.last_type, sys.last_value, sys.last_traceback 
              
              tb, descript = last_traceback, []
              
              while tb :
                  fname, lno = tb.tb_frame.f_code.co_filename, tb.tb_lineno
                  descript.append('\tfile "%s", line %s, in %s\n'%(fname, lno, tb.tb_frame.f_code.co_name))
                  tb = tb.tb_next
                  
              descript.append('%s : %s\n'%(last_type.__name__, last_value))
              
              for i in descript : 
                  sys.stderr.write(i),
          
          
          class Error(Exception):
              """Base class for ardiff exceptions."""
          
              def __init__(self, msg=None):
                  self.msg = msg
          
              def __str__(self):
                  return self.msg
              
              #def __repr__(self, *args, **kwargs):
              #    return Exception.__repr__(self, *args, **kwargs)
              
          class ConfigNotFoundError(Error):
              """Raised if config file passed but not found."""
          
              def __str__(self):
                  return "call expression when config file passed but not found"
              
          class OutSplitter(object):
              """ splitter """
              
              def __init__(self, out_splitter):
                  self.__pipes=None
                  if isinstance(out_splitter, OutSplitter):
                          self.__pipes = Set(out_splitter.pipes)
                  elif out_splitter:
                      if hasattr(out_splitter,"__iter__") : #
                          for pn in out_splitter:
                              self.add_pipe(pn)
                      else:
                          self.add_pipe(out_splitter)
                             
              @property
              def pipes(self):
                  return self.__pipes
              
              def add_pipe(self, pn):
                  if isinstance(pn, basestring):
                      if pn == 'stderr': x = sys.stderr
                      elif pn == 'stdout': x = sys.stdout
                      else: 
                          p = os.path.dirname(pn)
                          if p and not os.path.exists(p):
                              os.makedirs(p)
                          x = open(pn,'w+')
                  else: x = pn
                  
                  if hasattr(x, 'write') and hasattr(x, 'flush'):
                      if self.__pipes is None:
                          self.__pipes=Set()
                      self.__pipes.add(x)
              
              def write(self,s):
                  if self.__pipes:
                      for p in self.__pipes:
                          p.write(s)
              
              def flush(self):
                  if self.__pipes:
                      for p in self.__pipes:
                          p.flush()
                          
          class CatalogsWalker(OutSplitter):
              
              def __init__(self,catalogs,out_splitter=None):
                  OutSplitter.__init__(self,out_splitter)        
                  self.__catalogs = catalogs
                  self.__file_counter, self.__catalog_counter, self.__start_time, self.__speed = 0, 0, 0, 0
                  
              def __iter__(self):
                  self.__file_counter, self.__catalog_counter, self.__start_time, self.__speed = 0, 0, 0, 0
                  self.__start_time=time.time()
                  for catalog in self.__catalogs:
                      for p,d,ns in os.walk(catalog): 
                          _ = d;
                          self.__catalog_counter+=1
                          for n in ns:
                              self.__file_counter+=1
                              self.__speed=self.__file_counter/(time.time()-self.__start_time)
                              self.fanny_indicator(self.__catalog_counter, self.__file_counter, self.__speed)
                              yield p,n
                              
              @property
              def catalog_counter(self):
                  return self.__catalog_counter    
              
              @property
              def file_counter(self):
                  return self.__file_counter
              
              @property
              def start_time(self):
                  return self.__start_time
              
              @property
              def speed(self):
                  return self.__speed    
              
              def fanny_indicator(self,p,n,s):
                  if self.pipes:
                      _result="\rcataloges:"+repr(p).rjust(8)+"\tfiles:"+repr(n).rjust(13)+"\tspeed: %12.3f"%s+" files/s"
                      self.write(_result)
                      self.flush()    
          
          class OptionParserWraper(OptionParser):
              def __init__(self,argv,
                           version_string = '%%prog %s (%s)' % (__def_vers__, __def_duild_date__),
                           longdesc = '''''', # optional - give further explanation about what the program does
                           license_ = "Copyright 2014 Gurman (Gurman Inc.)                                            \
                              Licensed under the Apache License 2.0\nhttp://www.apache.org/licenses/LICENSE-2.0"                 
                           ):
                  '''Command line options.'''
                  # setup option parser
                  OptionParser.__init__(self,
                                        version=version_string, 
                                        epilog=longdesc, 
                                        description=license_)
                  
                  x=self.add_option
                  x('--config', dest='config', default=None, metavar='FILE', 
                    help='config file')
                  x('--raw_root', dest='raw_root', default=None, metavar='PATH', 
                    help='prefix(root path) for raw catalogs')        
                  x('--raw', dest='raw', default='raw', metavar='DIRS', 
                    help='list of raw catalogs names - archives names')
                  x('--raw_sorted_root', dest='raw_sorted_root',default= None, metavar='PATH', 
                    help='prefix(root path) for sorted raw catalogs')      
                  x('--raw_sorted', dest='raw_sorted', default='raw_sorted', metavar='DIRS', 
                    help='list of sorted raw catalogs names')
                  x('--verbose',  dest='verbose', type=int, default=2, metavar='int', 
                    help='level of verbosity')
                  x('--check_dup', dest='check_dup', default='Y', metavar='Y/n', 
                    help='Y for check duplicates default[Y]')
                  x('--out_root', dest='out_root', default=None, metavar='FILE', 
                    help='root dir to results output')
                  x('--dup_prefix', dest='dup_prefix', default=None, metavar='FILE', 
                    help='filenames prefix to out list of duplicate files')
                  x('--check_uniq', dest='check_uniq', default='n', metavar='Y/n', 
                    help='Y for check uniq files default[n]')
                  x('--uniq_prefix', dest='uniq_prefix', default=None, metavar='FILE', 
                    help='filenames prefix to out list of uniq files')
                                 
                  def config_parser_and_options_merger(filename, argv=None):
              
                      cllps = (lambda s: ' '.join(s.split()))
                      dopts = {}
                  
                      fconf = open(filename, 'r')
                      for ln in fconf.read().split('\n'):
                          
                          if ln and ln[0] ==' #' or len(ln) 
          Пример содержимого test.conf:
          
          --raw_root=/home/user/photo/ 
          --raw=dir1,dir2
          #comments 1
          --raw_sorted_root=/media/user/3XX/photo/ 
          --raw_sorted=dir2,dir3
          --out_root=results
          --dup_prefix=dup-
          --uniq_prefix=uniq-
          --check_uniq=Y
          --check_dup=Y
          --verbose=2
          

          Our client is a privately owned business who are the biggest name within their sector and are widely regarded as having revolutionised their industry. They have exciting plans over the next 12 months, including two full site redesigns and the opening of an office in Europe to facilitate expansion into European markets. They are looking for a Python Web Developer to join their team and help undertake the design, testing and building of reliable and maintainable applications using Python. Drive, shape and enhance their application development standards through adopting and implementing best practices. Enforce code quality through test driven development and support build quality through use of CI practices. Requirements • Expertise in web development using Python (Django), any exposure to PHP would be ideal. • Expertise in HTML5/CSS3/JS • Ability to learn new technologies and software quickly • Good understanding of Agile (Scrum) • Excellent written and verbal communication skills and an ability to work well with both technical and non-technical peers Desirable • Embrace agile software engineering and strive for continuous improvement • Fulfilment By Amazon API experience • Working git knowledge • TDD & CI experience Our client accepts international applications and offers Visasponsoring. Interested candidates should send their CV to hr@buerolersch.de