Толик Востряков

Русские имена файлов в zip-архиве и Python

Мне всегда доставляет удовольствие узнать что-то новое в программировании или технологиях. И недавно мне повезло. Аж целых две новые штуки за раз! В этом посте расскажу о первой, а в следующем о второй.

Итак задача стояла: загрузить на сервер zip-архив картинок товаров, пройтись на сервере по всем именам файлов в архиве, производя над каждым файлом определенные действия. Следуют сказать, что названия файлов были чрезвычайно важны, так как название файла - это код товара. По этому коду в базе находился нужный товар и к нему крепился распакованный файл из архива. Все естественно работало на ура, пока названия были англоязычные, но как только коды товаров, а соответственно и названия файлов стали попадаться с русскими буквами все поломалось. И что же обнаружилось?

  1. Кодировка названий файлов в zip-архиве созданным под виндой оказалась не Windows-1251 и даже не KOI8-R, а CP866 (кодировка времен DOS). Под маком имена файлов кодируются в UTF-8.
  2. Работа с русскими названиями файлов в Питоне зависит от ниже лежащей операционной системы. Немного света на этот вопрос пролил раздел Unicode filenames. Совет из этого раздела "When opening a file for reading or writing, you can usually just provide the Unicode string as the filename, and it will be automatically converted to the right encoding for you..." оказался не всегда верным, так как на нашем виртуальном сервере под FreeBSD оказалась была задана кодировка ASCII для имен файлов и изменить ее без обращения в тех. поддержку не представлялось возможным (узнать кодировку можно с помощью команды sys.getfilesystemencoding() ). А без ее изменения попытка открыть файл с названием в формате unicode все падало. Оказалось универсальным методом является преобразовать строку в обычную 8-битную в формате UTF-8 и уже полученную строку подсунуть в функцию открытия файла open(filename, 'w').

Итак, код распаковывающий по-файлово zip-архив с русскими названиями файлов в нем, работающий как на архивах созданных под Windows, так и под Mac (сам код работает успешно под Mac и Unix) будет выглядеть так:

    from zipfile import ZipFile
    import os

    # путь для распаковки файлов
    path = os.path.join(settings.PROJECT_DIR, 'media/upload/products')

    f = ZipFile(filename, 'r')
    for name in f.namelist():
        try:
            unicode_name = name.decode('UTF-8').encode('UTF-8')
        except:
            unicode_name = name.decode('cp866').encode('UTF-8')

        # some analyzing of unicode_name and execute some actions
        # ...

        file_name = os.path.join(path, unicode_name)
        f2 = open(file_name, 'w')
        #f.extract(name, path) # works only for python 2.6+
        f2.write(f.read(name))
        f2.close()

    f.close()
  • 27 Авг 15:08

Подводные грабли web, django, python

django-projector – годная (с оговорками) альтернатива trac’у

django-projector – это инструмент управления проектами, написанный на django. Он умеет много всего интересного, но пока не оброс неизбежной нелогичностью состыковок этого множества. В отличии от trac’а он “из коробки” заточен под большое кол-во проектов  (судя по демо, на которой, кстати, надо регистрироваться) и поддерживает деление на команды.

Авторы, видимо замученные гонениями общественности, оправдываются “Don't get us wrong, Trac is great tool but we believe that django's pluggable applications are far easier to configure and deploy.” и тут с ними трудно согласится, хотя звучит вроде бы, логично (установить и сконфигурировать всё это, ещё и написанное по разному – тоже задача не для новичка).

Да ,ещё: django-projector работает с mercurial, а поддержку других scm пока только планируют.

В общем, надо будет как-нибудь попробовать…






Даёшь Django в народные массы!

Об истории джанго

Для тех, кто не в курсе - откуда появился Django.

Роман Ворушин

Скорость

"Три мушкетера", дуэль д'Артаньяна и де Жюссака

Эта борьба в конце концов вывела де Жюссака из терпения. Разъяренный тем, что ему не удается справиться с противником, которого он счел юнцом, он разгорячился и начал делать ошибку за ошибкой. Д'Артаньян, не имевший большого опыта, но зато помнивший теорию, удвоил быстроту движений. Жюссак, решив покончить с ним, сделал резкий выпад, стремясь нанести противнику страшный удар. Но д'Артаньян ловко отпарировал, и, в то время как Жюссак выпрямлялся, гасконец, словно змея, ускользнул из-под его руки и насквозь пронзил его своей шпагой. Жюссак рухнул как подкошенный.

Одно из осознанных направлений моего развития, как разработчика, я вижу скорость. Делать за месяц то, что раньше делал за год. В этом направлении я вижу два главных аспекта: развитие мышления и овладение наиболее эффективными инструментами.

Четкость мышления

Понимать что именно нужно сделать, а что - не делать вообще. Примером в этом для меня является Ryan Singer из 37signals (см. 1 и 2).

Видеть как устроен проект и постоянно держать его архитектуру четкой, понятной и максимально адекватной задачам. Не бояться рефакторинга и постоянно улучшать имена переменных, классов функций. "There are only two hard things in Computer Science: cache invalidation and naming things" © Phil Karlton

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

Эффективные инструменты

Если есть языки программирования, фреймворки, технологические подходы, позволяющие вместо 10000 строк писать, отлаживать и поддерживать всего 1000 строк, то это может быть огромным преимуществом, даже если более компактный язык менее распространен или менее производителен. Проектов, умерших от того, что они не справились с наплывом пользователей, намного меньше, чем тех, что угасли, так и не дойдя до бета-версии.

Viaweb написан на Lisp, Youtube и Friendfeed - на Python (1 и 2), Twitter - на Ruby (да, потом его заменили на Scala, но взлетел проект именно на этом тогда еще странном и редком языке из Японии), GitHub - на Ruby, в проекте Echo используют Erlang + OCaml.

У меня есть опыт написания интернет-банкинга на Python + Django в Java-ориентированном банке. Я делал все в несколько раз быстрее, чем обычно, а с этим было сложно поспорить.

Что еще хорошо в повышении индивидуальной эффективности и скорости - что этот процесс зависит только от тебя. Не нужно никого мотивировать, уговаривать. Ты становишься быстрее, это становится заметно, и твои возможности по изменению мира многократно возрастают.

  • 24 Авг 11:25

Подводные грабли web, django, python

Cx_Oracle, XE Client и собственно Oracle

Я уже писал, что под виндой отхватил кучу багов и зависаний при работе с XE Client’ом Oracle из cx_Oracle (python-ячья библиотека). Чудесным образом прошлый раз проблема решилась, но недавно (а ничего не менялось) возникла снова, причем, с удвоенной силой (стало валиться и намертво вещать консоль в два раза чаще). Очередное прозрение заключается в использовании dll библиотек из instantclient’а вместо XE Client’а. Вот эти файлы с скопировал в windows\system32

oraociei11.dll
oci.dll
ociw32.dll
oraocci11.dll

Вряд ли нужны все 4-ре, но дальше париться и выяснять не хочется…






Блог django на хабрахабре

Django Framework / [Ссылка] Обзор книги Головатого и Каплана-Мосса. «Django. Подробное руководство»

Недавно вышла новая книга про Django на русском языке. По ссылке обзор этой книги и сравнение ее с предыдущей книгой "Django. Разработка веб-приложений на Python" авторов Форсье, Биссекса и Чана.

«Django. Подробное руководство» написана двумя авторами самого Django, так что эту книгу можно считать источником из первых рук.

Роман Ворушин

django-simple-captcha

Простое, гибко настраиваемое приложение для добавления captcha в формы

http://code.google.com/p/django-simple-captcha/
  • 23 Авг 12:25

Толик Востряков

Передача параметров по ссылке в Питоне

Мне нужно было передать в функцию параметр, в функции он изменяется и снаружи функции видно изменение. То есть фактически передать в функцию переменную по ссылке. Оказалось в Питоне с этим хитро. Есть изменяемые и неизменяемые переменные. Зависит от типа. Например, строки неизменяемый тип, а списки изменяемый. Соответственно строки передаются в функцию по значению, а список по ссылке. Пример параметра списка:

def test(a):
  a.append('new element')

a = ['first element']
test(a)

Результат в переменной "а": ['first element', 'new element']

Если есть другие варианты явно указать, что параметр функции передается по ссылке, прошу в комментарии к посту.

  • 23 Авг 11:44

Блог python на хабрахабре

Язык программирования Python / Using Pylons with Pydev in Eclipse

Решил написать небольшой проект с использованием Pylons. Для тех, кто не знает, что это такое, могу сказать, что это один из самых мощных Python фреймворков. Он хранит себе лучшие идеи языков Perl, Ruby и Python и использовался в небезызвестных проектах DropBox, Digg, SourceForge и тд.
В качестве среды разработки я часто использую Eclipse. Но тут меня поджидали небольшие неудобства.

Блог python на хабрахабре

Язык программирования Python / Библиотека для вывода изображений в командную строку



Fabulous — замечательная библиотека, позволяющая выводить красивый цветной текст, картинки, фигуры прямо в окно терминала!

Для того, чтобы установить библиотеку, выполните в терминале:
sudo apt-get install gcc python-imaging python-setuptools
sudo easy_install -U fabulous

Или просто скачать в архиве:

fabulous-0.1.3.tar.gz

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

После установки можете попробовать несколько примеров, выполнив такой код:
python -m fabulous.demo - выводит в терминал примерно первое изображение
python -m fabulous.rotating_cube
— пример вращающегося куба
python -m fabulous.image obama.jpg — после такого вызова в терминале появится следующее изображение (как видите, чтобы вывести изображение, достаточно одной строки):

Vurtseed

untitled

Клевый студент радостно обосрался в попытке меня потролить и на всякий случай забанил в своем журнале. Хотите отхватить лулзов от того кто щитает себя дохуя умным выучив слова "алгоритмы корелляции и кластеризации" и думает что в алгоритмах сортировки есть сколько-то полезное знание, то можно почитать его блог. Много забавных логических цепочек уровня "GAE сделан из Django" равносильных логической связке "человек сделан из собственного говна", доставляэ.

Впрочем то что МИЭМ выпускает в массе негодных специалистов известно давно.
  • 15 Авг 15:25

Записки океанолога - обработка и визуализация данных

CDO (Climate Data Operators) - рабочая лошадка для обработки netCDF файлов

Задача: проводить манипуляции с файлами формата netCDF, в том числе осреднение и выборку по различным осям, установку временной оси, интерполяцию полей, объединение и разделение файлов.
Инструмент: CDO (Climate Data Operators)

Причина, по которой я так долго тянул с постом о cdo, наверное в том, что они настолько незаметны и настолько часто мной используются, что я практически забываю об их существовании, воспринимая больше просто как некие обычные команды шела. Однако без них жизнь человека работающего с netCDF (а также GRIB) файлами становится гораздо неуютнее. На сегодняшний день существует около 400 операторов, позволяющих проводить первичную обработку файлов. Как бы я не любил Python, поручить ему обработку террабайтов информации значит обречь себя на очень долгое ожидание, тогда как cdo, написанные на C++, справляются с крупномасштабными задачами сравнительно быстро, при этом обладают очень простым для понимания синтаксисом.

В посте я расскажу об установке CDO под Ububtu 10.04 и Windows (да, они есть и под винду) покажу как пользоваться несколькими наиболее популярными их функциями.

Блог django на хабрахабре

Django Framework / Наши на Django Dash

В субботу, 14 августа, в 8:00 по Москве начнётся соревнование DjangoDash, и скромная русская команда e-Legion решила поучаствовать в этом мероприятии. Кстати, в конкурсе участвует и, например, широко известный в узких кругах джангистов Malcolm Tredinnick (да, я тоже не понял почему команда с двумя участниками называется «три слепые мыши»).

Блог python на хабрахабре

Язык программирования Python / Пишем себе немного OpenID-авторизации


Взгляд в будущее


    В последнее время всякие социальные сети и вообще сервисы-лидеры интернета по посещаемости и количеству аккаунтов завели очень неплохую, на мой взгляд, привычку — предоставление уникальных OpenID-идентификаторов для пользователей, дабы с их использованием можно было зайти на сторонний сайт. Кроме того, параллельно развивается очень похожая, но все-таки не совсем производная технология OAuth, которая появилась на свет благодаря стараниям создателей небезызвестного Twitter и, цитируя википедию, «позволяет предоставить третьей стороне доступ к защищенным ресурсам пользователя, без необходимости передавать ей (третьей стороне) логин и пароль».
    Лично меня такая тенденция очень радует и, более того, я почти уверен, что за подобной технологией будущее. В частности, в будущем обязательно появятся новые мэшапы для аггрегирования информации с кучи сайтов (в частности, хочется вспомнить очень хороший, но несправедливо забытый сервис Yahoo Pipes, который так и не смог покорить сердца и умы просто потому, что его время тогда еще не пришло. Возможно, все еще впереди), а именно такой «форм-фактор» требует логина на кучу сервисов сразу.

Python for SEO

Переход на python 2.7?

На форуме дали ссылку на популярные модули для Питона, причем как для 2.6, так и 2.7. Все модули в виде exe-файлов, не надо набирать в консоли setup.py install и тому подобное. Сама ссылка очень порадовала, все необходимые мне модули там есть: pycurl, mechanize(ClientForm), Pil, и т.д.; и заставила задуматься о переходе на версию 2.7.

Метки

.net .NET C# 1.2 2.6 2008 2009 2010 404 error actions activestate admin AdminSite AIMP ajax albums by year alex gaynor algorithm amazon Amazon EC2 and apache apache2 api apple apps apt-get aptana Aptana Studio archlinux asp.net async async server atom attribute auth autocomplete automator bash Bind9 bing blog blogengine Blogger blogs blogspot boo book books bootstrap bot bpython burn byteflow C C++ cache captcha catalyst cdo cell centos changes CharField charset chrome ClientForm clojure closure Cloud Computing cms code code coverage code_swarm coding style COM comet command line composition compressor conditions conf conference contest contests Context CouchDB coverage cPickle CppCMS cpyext cpython crud csrf CSS ctypes curl custom custom model fields cython database DataMining DateFields datetime db db2api dbm dbqueries debian debug debug toolbar debugging decode decorator decorators defer deferred deploy deployment descriptor deseb design dev devconf development diphost distutils diveintopython Django django 1.0 django 1.1 django 1.2 django advent django form django forms django forum django framework django orm django template django tips. django django trunk django weblog django-admin-tools django-annoying django-cms django-compressor django-json-rpc django-maintenancemode django-messages django-notification django-piston django-publicauth django-registration django.admin django.contrib.admin django.contrib.comments djangoadvent djangocms djangoconf djangodash djangosnippets DMS documentation dpkg dreampie drupal dsl dtl dvd e-legion eclipse Eclipse Marketplace eclipse plugin EGit emacs EmailField en encoding epoll erlang event evolvedb excel exception experience ExtJS fabric Fabulous facebook faq fastcgi features Feedburner feedparser feedzilla field fields file file uploads filefield finaloption flash messages flup fonts ForeignKey form forms formset Fortran fp framework freebsd freelance freeswitch friendfeed fs2web fun funcparserlib functional future gae gallary image games gamin generator expressions generic views geodjango gettext gevent gil GIS git github gitosis GMT go language golodnyj Google Google App Engine Google AppEngine Google Maps google wave Google Web Toolkit grailmud greenlet grep Grig group_concat growisofs GSM gtd gtk gtkbuilder gtug gui gvr gwt-json-rpc habraeditor habrawars hacks hand made haskell haystack hg hgshelve high load highlighter highload holi war hosting how-to howto html http-клиент humor i18n icfpc idiomatic if iis 7.0 iis 7.5 image image-scripting improvements inheritance install intellisence interface Internet internet explorer interpreter ipark ipod ipython ironpython itunes izmenimsya.ru jabber Jacob Kaplan-Moss james tauber java javascript jinja JIT jmeter job jquery json jstree Jump Break just for fun jython kde kde4 kiev kikola kio kiyv kwallet l10n lambda functions lang ldap learning lenny libevent library libs Life limit request rate linkexchange linkfeed Links linux Linux & Unix lisp list clustering list clusterization list comprehensions lists LLVM localization lock lxml mac Mac OS X macosX madskills mail mark pilgrim markdown math mathlab Matplotlib me mediafiles mediavirus memcache messages messaging metaclass method Microsoft Azure middleware migration milestone mindfuck model models mod_python mod_wsgi mongodb monitoring monkeypatch moscow mozilla mptt MRO mud multi upload multidb multithreading music musicmans.ru musicx mutagen my projects mysql nagare netCDF newforms newforms-admin news nginx Nhibernate nix nose NoSQL Notebook notification numpy object odessa open source openapi OpenID opster optimization OptionParser oracle oreilly orm os osx Other package packages packaging pagination parser path pdf PEP8 performance perl personality php picture-driven computing PIL pinax pingback pip plasma plasmoid plugins portal post postgre postgresql power designer Price programming progress bar project property psycopg2 py2exe pybb pycamp pycon pycow pycurl pydev pygments pygtk Pyhton pylint pylons PyNGL pypy PyQt4 pyrant pyrex pySerial pytho Python Python 2.5 python 2.7 python 3 python string methods python-mssql python.su python3 Qt Qt4 queryset-refactor queue rabbitmq raimp rating raw sql reCaptcha registration release replace repoze repoze.bfg request rate limit RequestContext REST reusable apps robot routing rpc rss ru ruby ruby-on-rails russian sample sape sape.ru satchmo sax scalability scheme SciPy screencast sea ice search security fix selenium self.error seo server sessions settings setuptools shell signals sikuli sinatra sitemap sites slice slicing SmartGWT sms snipets snippet snow leopard soap social network software sorting south spb-archlinux spbstu sphinx sql sqlalchemy sr ssh start startup study studying styleguides subversion sugar superfcgi svarga svn swfupload syntax SyntaxHighlighter system tagging tags task queue tdd tddspry teh drama teleofis template template engine templates templatetags test testing text processing TextField the art of programming thinkpad threading threads thumbnail thumbnails tinymce tips tips and tricks tokyo tokyo cabinet tokyo tyrant tools TOR tornado tornado server tortoise trac tricks trouble tumblr turbogears tutorial tuturial twisted twisted sms twitter type typography Ubuntu uml Uncategorized unicode unit test unit testing UnitTest Unladen Swallow update upload url shortener urls user utils ux validation vcs versioning video views vim virtualenv Visual Studio vkontakte vkontakte.ru voip wave web web 2.0 web-devel web-money web-server web-services web-программирование web-разработка web-сервер webdev webkit weblog webpy webtest webui werkzeug where widget widgets wiki windows windows server wizard work wrapper wsgi wsl x11 xedant xlrd xlutils xlwt xml xmlobjets xmonad xmpp yandex ZCA zip zomg zope абстрактные классы авторизация агрегатор администрирование администрирование django админка аппле архитектура проектов асинхронное программирование асинхронщина аутентификация бабло базы данных Без рубрики библиотека библиотеки блог блоге блогосфера быки и коровы вброс введение ввод даты веб-сервисы велоспорт верстка видео Визуализация данных Викиверситет внедрение Все записи гвидо ван россум граббер грабли графика декоратор дождались! документация дремучий лес за чашечкой чая заметки замыкание звезды идея интервью интересное Интересные статьи интернет интерфейсы кака календарь капитан очевидность киев Клиентам книга книги кодогенерация командная строка конференция кэширование лёд личное локальная копия магазин мануал метаклассы мне многопоточность многопроцессовость модели модули модульное тестирование мысли наследование настройка невозможное новости Ноутбук о обертка облачные вычисления обо обо мне обработка excel файлов Обработка данных одесса оптимизация Основная лента отладка офтопик перевод Питон плагины планета поебень поиск покрытие кода полезные советы постер правила кодирования программирование Проектирование проекты работа рабочее размышлизмы Разное разработки рассылка расцветка кода реверси регистры релиз рисоваська рунет русификация сайт семафор сеть системы управления версиями скорость скрипт слайсы собеседование событие события совок сознание соревнование сортировка сортировка картинок по разрешению спортивное программирование сравнение срезы ссылки стартап стартапы статьи стиль программирования стишки тестирование тесты трясло хвостом туториал Тюмень украшательства устройство отладчика фигня философия формы хабраредактор хакинг хостинг цацки Цены чаепитие часовые пояса шаблоны экзотика эксперимент Эксперименты юмор Яндекс