1. Make a column of incrementing numbers
:put =range(1,50)
2
.
Use Ctrl+V to select the first column of text in the lines you want to comment.
Then hit Shift+i and type the text you want to insert. (www.example.com/page=)
Then hit Esc, wait 1 second and the inserted text will appear on every line.
Voila
Posts Categorized: Python
исправить кодировки имен файлов Ubuntu
sudo apt-get install convmv
find . -type f -print -exec convmv —notest -f
UPD: Неприятный случай с «doubly-encoded to utf-8 from iso-8859-5»
#-*-coding:utf8-*-
import os
allfiles=[]
for root, dirs, files in os.walk("./", topdown=False):
for name in files:
allfiles.append(os.path.join(root, name))
for f in allfiles:
try:
newf=f.decode('utf8').encode('latin1').decode('utf8', 'replace')
except:
print "{} is in proper encoding".format(f)
else:
os.rename(f, newf)
print "{} decoded well".format(f)
pretty print nested dict with unicode values
>>> import json
>>> print json.dumps({}, sort_keys=True, indent=4, ensure_ascii=False)
http://stackoverflow.com/questions/3229419/pretty-printing-nested-dictionaries-in-python
dict to class — рекурсивно
# convert a dictionary to a class
class Struct(object):
def __init__(self, adict):
"""Convert a dictionary to a class
@param :adict Dictionary
"""
self.__dict__.update(adict)
for k, v in adict.items():
if isinstance(v, dict):
self.__dict__[k] = Struct(v)
def get_object(adict):
"""Convert a dictionary to a class
@param :adict Dictionary
@return :class:Struct
"""
return Struct(adict)
Рецепт:
Рекурсивное обновление словарей
def rUpdate(targetDict, itemDict):
«Recursively updates nested dicts»
for key, val in itemDict.items():
if type(val) == type({}):
newTarget = targetDict.setdefault(key,{})
rUpdate(newTarget, val)
else:
targetDict[key] = val
Считаем непустые элементы в списке
len(filter(None, iterable))
SQLFORM.grid — коробочный настраиваемый броузер таблиц
Быстро вывести табличку с базой данных поможет такая простая конструкция в web2py :
grid = SQLFORM.grid(db.table)
А вот и параметры ее
SQLFORM.grid( query, fields=None, # выборка полей для вывода field_id=None, # id - поле left=None, # LEFT JOIN headers={}, # Заголовки orderby=None, # сортировка groupby=None, # группировка searchable=True, # поле поиска sortable=True, # кнопки сортировки paginate=20, # записей на страницу deletable=True, # кнопка удалить editable=True, # кнопка редактировать details=True, # кнопка Подробнее selectable=None, # чекбокс для выбора create=True, # можно создавать новые элементы csv=True, # экспорт в csv links=None, # поля - ссылки links_in_grid=True, # показывать в главной таблице ссылки upload='<default>', # args=[], # user_signature=True, # maxtextlengths={}, # максимальная длина текста в полях maxtextlength=20, # onvalidation=None, # функция вызываемая при проверке формы oncreate=None, # функция при создании нового элемента onupdate=None, # функция при редактировании элемента ondelete=None, # функция при удалении элемента sorter_icons=(XML('↑'), XML('↓')), # иконки сортировки ui = 'web2py', # можно поставить jquery-ui, либо описать все компоненты индивидуально словарем showbuttontext=True, # Текст на кнопках _class="web2py_grid", # класс формы formname='web2py_grid', # имя формы search_widget='default', # поисковая форма ignore_rw = False, # formstyle = 'table3cols', # exportclasses = None, # formargs={}, # аргументы формы createargs={}, # аргументы функции создания нового элемента editargs={}, # аргументы функции редактирования элемента viewargs={}, # аргументы функции просмотра элемента buttons_placement = 'right', # кнопки справа links_placement = 'right' # ссылки справа )
Credits : http://www.web2py.com/book/default/chapter/07#SQLFORM.grid
logging : пишем логи в файл
Выводим время, уровень ошибки, файл и строку вызова, ну и естественно, текст сообщения:
import logging logging.basicConfig(format = u'%(filename)s[LINE:%(lineno)d]# %(levelname)-8s [%(asctime)s] %(message)s', level = logging.DEBUG, filename = u'applog.log') logging.debug('This is just a debug')
via http://habrahabr.ru/post/144566/
upd: лучший пример со stackoverfow :
import logging
log = logging.getLogger("mylog")
log.setLevel(logging.DEBUG)
formatter = logging.Formatter(
"%(asctime)s %(threadName)-11s %(levelname)-10s %(message)s")
# Alternative formatting available on python 3.2+:
# formatter = logging.Formatter(
# "{asctime} {threadName:>11} {levelname} {message}", style='{')
# Log to file
filehandler = logging.FileHandler("debug.txt", "w")
filehandler.setLevel(logging.DEBUG)
filehandler.setFormatter(formatter)
log.addHandler(filehandler)
# Log to stdout too
streamhandler = logging.StreamHandler()
streamhandler.setLevel(logging.INFO)
streamhandler.setFormatter(formatter)
log.addHandler(streamhandler)
# Test it
log.debug("Some message")
log.error("An error!")
try:
something()
except:
log.exception("An exception occured!")
via http://stackoverflow.com/questions/4722745/logging-between-classes-in-python
scrapy — кроулим, парсим и грабим
scrapy — весьма ценная библиотека для тех, кому нужно пройти по большому массиву страниц (с большой вложенностью, заранее не ограниченному), и добыть оттуда набор однотипной информации.
В общем, пойди туда — пока не знаю куда, принеси то — пока не знаю что. И сформируй из этого таблицу csv или файл json.
pip install scrapy # создаем новый проект - ScrapySample scrapy startproject ScrapySample
Редактируем конфигурационные файлы. Сначала что собирать — файл item.py в папке webcrawl
from scrapy.item import Item, Field class ScrapySample(Item): title = Field() link = Field() content = Field() pass
Теперь сам паук. В папкe ScrapySample/spiders создаем ScrapySpider.py
from scrapy.spider import BaseSpider from scrapy.selector import HtmlXPathSelector from scrapy.http.request import Request from scrapy_sample.items import ScrapySampleItem class ScrapyOrgSpider(BaseSpider): name = "scrapy" allowed_domains = ["scrapy.org"] start_urls = ["http://blog.scrapy.org/"] def parse(self, response): hxs = HtmlXPathSelector(response) next_page = hxs.select("//div[@class='pagination']/a[@class='next_page']/@href").extract() if next_page: yield Request(next_page[0], self.parse) posts = hxs.select("//div[@class='post']") items = [] for post in posts: item = ScrapySampleItem() item["title"] = post.select("div[@class='bodytext']/h2/a/text()").extract() item["link"] = post.select("div[@class='bodytext']/h2/a/@href").extract() item["content"] = post.select("div[@class='bodytext']/p/text()").extract() items.append(item) for item in items: yield item # возвращаем генератор собранных объектов
Запускаем:
scrapy crawl ScrapySample -o ScrapySample.json -t json
(можно в csv или xml)
Thanks :
http://amaral.northwestern.edu/blogs/2013/apr/8/quick-introduction-web-crawling-using-scrapy-part-/
dataset — еще одна обертка баз данных для ленивых
import dataset db = dataset.connect('sqlite:///:memory:') table = db['sometable'] table.insert(dict(name='John Doe', age=37)) table.insert(dict(name='Jane Doe', age=34, gender='female')) john = table.find_one(name='John Doe') # Внимание, теперь самое вкусное! # Запросы: table = db['users'].table statement = table.select(table.c.name.like('%Snoopy%')) result = db.query(statement) # Сохраняем в json/csv всех result = db['users'].all() dataset.freeze(result, 'users.json', format='json') # Или каждого пользователя в свой файл # export one JSON file per user dataset.freeze(result, 'users/{{ id }}.json', format='json', mode='item')