python.lxml
В python2* назначает кодировку
# -*- coding: utf-8 -*-
[] - изменяемо - список - list
() - неизменяемо - кортэж - tuple
{} - хэшовый - словарь - dict
d = {1: 'one', 2: 'two', 3: 'three', 4: 'four'} print d[1] # = one print d # = {1: 'one', 2: 'two', 3: 'three', 4: 'four'} for key, val in d.items(): # цикл по всему словарю print key, val for key in d.keys(): # цикл по ключам словаря print key, d[key] for val in d.values(): # цикл по значениям словаря print val d.update() # пополняется словарь
some in var - проверка наличия
some and some = если 1-ый и 2-ой true значит true, в ином случае false
some or some - если 1-ый some false, значит 2-ой some. Если и 2-ой false, возращает false
some[start:end:step] - срез (some[::-1] - в обратном порядке)
A = sets.Set([1, 2, 3]) B = sets.Set([2, 3, 4]) print A | B, A & B, A - B, A ^ B
Set([1, 2, 3, 4]) Set([2, 3]) Set([1]) Set([1, 4])
if boolean: some elif boolean: some else: some
while boolean: some
for tmp in interable: some
try: some except some_exception as var: some except some_exception_2 as var2:
def name(var, var, ...): some return some
var.append() - добавление в конец
sys.argv - врнета имена запуска
random.randint(int, int) - рандом число
random.choice([str1,str2,str3]) - рандом выбор
dir() - список антрибутов объекта
re.compile() - переменная
len() - возвращает размер
some.join() - объединяет полученные данные, с разделителем some
some.count(some2,[срез some]) - Возвращает колличество вхождений some2 в some
some.find(some2,[срез some]) - Возвращает позицию первого some2 в some или -1
some.lower() - Возвращает в нижнем регистре (some.upper() - наоборот)
some.partition(some2) - Разбить строку some по some2
some.replace(some1, some2, [int]) - В строке some, находит some1 и заменяет на some2
some.splitlines([bool]) - Разбивает some по символам перевода строки
some.strip([chars]) - Обрезает пробельные символы в начале и конце файла. еще есть [r|l]strip()
vars() - Возвращает список всех переменных в виде словаря.
open() - Открытие файла. Вторым параметром “r” чтение, “w” запись, “a” добавление или “w+”, “a+”, “r+” изменение.
random
pdb - python debug. Модуль отладчик
#!/usr/bin/python '''manyname.py -- from "Learning Python" by Mark Lutz and David Ascher, published by O'Reilly. Demonstrates name-spaces associated with classes, functions, and methods.''' X = 11 # Module (global) name/attribute class C: X = 22 # Class variable def m(self): X = 33 # Local variable in method self.X = 44 # instance variable def f(): X = 55 # Local variable in function print(X) def g(): print(X) # Access module X (11) if __name__ == '__main__': print(X) # 11: module (a.k.a. manynames.X outside file) f() # 55: Local g() # 11: Global obj = C() print(obj.X) #22: From Class obj.m() print(obj.X) # 44: class instance print(C.X) # 22: class (a.k.a. obj.X if no X in instance) #print(C.m.X) # fails: only visible in method #print(f.x) # fails: only visible in function
(На самом деле, можно ставить через pip install mysql-python)
#Ставим Python wget http://www.python.org/ftp/python/3.2.2/Python-3.2.2.tar.bz2 tar -xvf Python-3.2.2.tar.bz2 cd Python-3.2.2 ./configure make make install #Ставим setuptools и easy_install-3.2 wget http://python-distribute.org/distribute_setup.py python3.2 distribute_setup.py #Ставим MySQLdb wget https://github.com/davispuh/MySQL-for-Python-3/tarball/master tar -xzvf master cd davispuh-MySQL-for-Python-3-3403794/ python3.2 setup.py build python3.2 setup.py install
UDP: На дворе 2013, все к чертям обновилось. Вместо попыток устанавливать python3.2 + MySQLdb лучше просто установить 3.3 + pymysql3
Для начала установим пакет “python3-setuptools”: sudo apt-get install python3-setuptools Далее, с помощью “easy_install3” установим “pymysql3”: easy_install3 pymysql3 Собственно, и всё, можно пользоваться. Для примера, стандартные команды для работы с базой, выложенный автором PyMySQL и слегка подправленный мной: import pymysql conn = pymysql.connect(host='127.0.0.1', user='root', passwd='superpass', db='mysql', charset='utf8') cur = conn.cursor() cur.execute("SELECT Host,User FROM user") # print cur.description # r = cur.fetchall() # print r # ...or... for r in cur: print (r) cur.close() conn.close()
import MySQLdb conn = MySQLdb.connect (host = "localhost", user = "testuser", passwd = "testpass", db = "test") cursor = conn.cursor () cursor.execute ("SELECT VERSION()") row = cursor.fetchone () print "server version:", row[0] cursor.close () conn.close ()
help('modules')
SomeClass.Some.__bases__
import traceback try: some_code except: print "Some Error:" traceback.print_exc(file=sys.stdout) print "+++++++++++++++++++++++++++++++++++++++++++++++++++++++"
import io ErrorMassageBuf = io.StringIO() ... try: self.execution() except: print("Some Error:") traceback.print_exc(file=ErrorMassageBuf) ... print(str(ErrorMassageBuf.getvalue()))
import subprocess as sub p = sub.Popen(['ping', '-c4', '8.8.8.8'],stdout=sub.PIPE) MyVar = p.communicate() print MyVar[0]
import sys import signal import time class TimeoutException(Exception): pass def timeout_handler(signum, frame): raise TimeoutException() signal.signal(signal.SIGALRM, timeout_handler) signal.alarm(3) # Даем 3 секунды на выполнение while 1: try: timecode = 1 while 1: print timecode timecode += 1 time.sleep(1) signal.alarm(0) # Отключаем timeout except TimeoutException: continue
import signal, threading, time class TestTread(threading.Thread): def __init__(self): threading.Thread.__init__(self) # kill -SIGUSR1 $PID signal.signal(signal.SIGUSR1 , self.mystop) # kill -SIGUSR2 $PID signal.signal(signal.SIGUSR2 , self.mystop2) def run(self): while(1): print("live") time.sleep(1) def mystop(self, signum, frame): print("Signal USR1") def mystop2(self, signum, frame): print("Signal USR2") TestTread().start()
import threading import time class myThread (threading.Thread): def __init__(self, threadID, name, counter): self.threadID = threadID self.name = name self.counter = counter threading.Thread.__init__(self) def run(self): print "Starting " + self.name print_time(self.name, self.counter, 5) print "Exiting " + self.name def print_time(threadName, delay, counter): while counter: time.sleep(delay) print "%s: %s" % (threadName, time.ctime(time.time())) counter -= 1 # Create new threads thread1 = myThread(1, "Thread-1", 1) thread2 = myThread(2, "Thread-2", 2) # Start new Threads thread1.start() thread2.start() print "File end"
class myThread (threading.Thread): def __init__(self, id): threading.Thread.__init__(self) self.id = id def run(self): pass threads = [] for id in range(200): thread = myThread(id) thread.start() threads.append(thread)
#!/usr/local/bin/python2.6 # -*- coding: utf-8 -*- import MySQLdb import os import sys import cgitb import cgi cgitb.enable() b = "<br />" print "Content-Type: text/html; charset=utf-8" print "" print """<html> <body> <form action="main.py" method="post"> FIO: <input type="text" name="fio" /><br /> Email: <input type="text" name="email" /><br /> <input type="submit" name="submit" value="Search" /> </form><br /> """ form = cgi.FieldStorage() SearchFIO = form.getfirst("fio", "") # This way it's safe. SearchEmail = form.getfirst("email", "") # This way it's safe. db = MySQLdb.connect(host="localhost", user="user", passwd="PASS", db="MYDB", charset='utf8') cursor = db.cursor() if SearchEmail: cursor.execute("SELECT * FROM `emails` WHERE `email` LIKE '%" + SearchEmail + "%' LIMIT 0, 10000") rows = cursor.fetchall() print "<TABLE>" print "<TR><TD> Id </TD><TD> Email </TD><TD> Resume </TD><TD> Send </TD><TD> FIO </TD><TD> Date Send </TD></TR>" for row in rows: print "<TR>" for words in row: print "<TD>" try: print words except: print words.encode('utf-8') print "</TD>" print "</TR>" print "</TABLE>" print """ </body> </html> """ sys.exit() if SearchFIO: cursor.execute("SELECT * FROM `emails` WHERE `fio` LIKE '%" + SearchFIO + "%' LIMIT 0, 10000") rows = cursor.fetchall() print "<TABLE>" print "<TR><TD> Id </TD><TD> Email </TD><TD> Resume </TD><TD> Send </TD><TD> FIO </TD><TD> Date Send </TD></TR>" for row in rows: print "<TR>" for words in row: print "<TD>" try: print words except: print words.encode('utf-8') print "</TD>" print "</TR>" print "</TABLE>" print """ </body> </html> """ sys.exit()
from smtplib import SMTP from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText import quopri def QuoHead(String): s = quopri.encodestring(String.encode('UTF-8'), 1, 0) return "=?utf-8?Q?" + s.decode('UTF-8') + "?=" FIOin = "Андрей Петрович" emailout = "some@test.ru" emailin = "some2@test.ru" msg = MIMEMultipart() msg["Subject"] = QuoHead("Добрый день " + FIOin).replace('=\n', '') msg["From"] = (QuoHead("Ирина Федоровна") + " <" + emailout + ">").replace('=\n', '') msg["To"] = (QuoHead(FIOin) + " <" + emailin + ">").replace('=\n', '') m = """Добрый день. Это тестовое письмо. Пожалуйста, не отвечайте на него.""" text = MIMEText(m.encode('utf-8'), 'plain', 'UTF-8') msg.attach(text) connect = SMTP('11.22.33.44:25') connect.set_debuglevel(1) #connect.starttls() connect.login('some@test.ru', 'password') connect.sendmail(emailout, emailin, msg.as_string()) connect.quit()
Вывод print :
Content-Type: multipart/mixed; boundary="===============2112037152==" MIME-Version: 1.0 Subject: =?utf-8?Q?=D0=94=D0=BE=D0=B1=D1=80=D1=8B=D0=B9=20=D0=B4=D0=B5=D0=BD=D1=8C=20=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9=20=D0=9F=D0=B5=D1=82=D1=80=D0=BE=D0=B2=D0=B8=D1=87?= From: =?utf-8?Q?=D0=98=D1=80=D0=B8=D0=BD=D0=B0=20=D0=A4=D0=B5=D0=B4=D0=BE=D1=80=D0=BE=D0=B2=D0=BD=D0=B0?= <some@test.ru> To: =?utf-8?Q?=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9=20=D0=9F=D0=B5=D1=82=D1=80=D0=BE=D0=B2=D0=B8=D1=87?= <some2@test.ru> --===============2112037152== MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 0JTQvtCx0YDRi9C5INC00LXQvdGMLgogINCt0YLQviDRgtC10YHRgtC+0LLQvtC1INC/0LjRgdGM 0LzQvi4K0J/QvtC20LDQu9GD0LnRgdGC0LAsINC90LUg0L7RgtCy0LXRh9Cw0LnRgtC1INC90LAg 0L3QtdCz0L4u --===============2112037152==--
#К примеру, при получение списков из SQL запоса MySQLWords = list(MyCursor.fetchall()) LiteWords = LiteCursor.fetchall() TestList = list(set(LiteWords).difference(MySQLWords)) for i in TestList : print("have LiteWords > " + str(i)) TestList = list(set(MySQLWords).difference(LiteWords)) for i in TestList: print("have MySQLwords < " + str(i))
http://cx-freeze.sourceforge.net/
cd . del dist\*.* /Q call cxfreeze "С:\script.py" --base-name=Win32GUI --target-dir dist pause
Вопрос: Существует ли портативный Python? Организовать работы программы с использованием .exe для запуска .py с использованием портативного python? Инсталяция библиотек в портативном питоне?
16ти ричные значения windows-1251
16ти ричные значения utf8 для кирилицы
еще не прочитал
Значения могут быть в 16ти ричном значение или ввиде символов.
>>> var = "Привет" >>> var # Строка хранится в виде символов utf-8 'Привет' >>> type(var) <class 'str'> >>> var.encode() #по умолчанию utf-8 # Перекодируем строку из символьнного вида в 16ти ричные значения. (Буква 'П' имеет 16 ричное значение d0 9f) b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82' >>> var.encode('windows-1251') # Конвертируем символьные значения utf-8 в 16ти ричные значения windows-1251 (Буква 'П' имеет 16 ричное значение cf) b'\xcf\xf0\xe8\xe2\xe5\xf2' Из байткода, в символы. >>> BiteUTFVAR = b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82' >>> BiteCP1251VAR = b'\xcf\xf0\xe8\xe2\xe5\xf2' >>> type(BiteUTFVAR) <class 'bytes'> >>> BiteUTFVAR.decode() #по умолчанию utf-8 'Привет' >>> BiteCP1251VAR.decode('cp1251') 'Привет'
>>> BiteUTFVAR.decode('cp1251') #Попытка декодировать 16ричный байткод UTF-8 в windows-1251 выдаст стандартные "краказябры" 'Привет' >>> BiteCP1251VAR.decode('utf-8') #Попытка декодировать 16ричный байткод windows-1251 в UTF-8 символы, вернет ошибку: UnicodeDecodeError: 'utf8' codec can't decode byte 0xcf in position 0: invalid continuation byte >>> BiteCP1251VAR.decode('cp1251').encode('utf-8')# Конвертируем 16ричный байткод windows-1251 в 16ричный байткод windows-1251 b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82' >>> BiteUTFVAR.decode('utf-8').encode('cp1251') # Конвертируем 16ричный байткод UTF-8 в 16ричный байткод windows-1251 b'\xcf\xf0\xe8\xe2\xe5\xf2'
#добавить, символьное utf8 в символьное cp1251 и наоборот #Узнать байкод символьной переменной
sys.stdout.encoding
http://www.macfreek.nl/memory/Encoding_of_Python_stdout
/usr/local/bin/python3.2 >>> import sys >>> sys.stdout.encoding 'US-ASCII' /usr/bin/env LANG=ru_RU.UTF-8 /usr/local/bin/python3.2 >>> import sys >>> sys.stdout.encoding 'UTF-8'
Конвертируем UTF-8 в CP1251 >>> utf8 = 'Привет' >>> utf8 '\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82' >>> uni = utf8.decode('utf8') >>> utf8.decode('utf8') u'\u041f\u0440\u0438\u0432\u0435\u0442' >>> uni.encode('cp1251') '\xcf\xf0\xe8\xe2\xe5\xf2'
#!/usr/bin/python # -*- coding: utf-8 -*- import os import sys import cgitb import cgi cgitb.enable() b = "<br />" print "Content-Type: text/html; charset=utf-8" print "" print """<html> <body> <form method="post"> FIO: <input type="text" name="fio" /><br /> <input type="submit" name="submit" value="Search" /> </form><br /> """ form = cgi.FieldStorage() SearchFIO = form.getfirst("fio", "") # This way it's safe. if SearchFIO: print "<h1>Your name:" print SearchFIO print "</h1>" sys.exit()
#!/usr/bin/python2.7 from pprint import pprint cpplan = 100 cp = 400 bad_cp_plan = 0 bad_cp = 0 def ratio_num(big, small): res = 0 if big > 1 and small > 1: res = float(big) / float(small) * 100 return int(res) pprint(ratio_num(cpplan, cp)) pprint(ratio_num(cp, cpplan)) pprint(ratio_num(bad_cp_plan, cp)) pprint(ratio_num(bad_cp_plan, bad_cp)) pprint(ratio_num(cp, bad_cp_plan)) pprint(ratio_num(bad_cp, bad_cp_plan))
def recursive_str_to_unicode(target): """ recursive function for convert all string in dict, tuple and list to unicode """ pack_result = [] if isinstance(target, dict): level = {} for key, val in target.iteritems(): ukey = recursive_str_to_unicode(key) uval = recursive_str_to_unicode(val) level[ukey] = uval pack_result.append(level) elif isinstance(target, list): level = [] for leaf in target: uleaf = recursive_str_to_unicode(leaf) level.append(uleaf) pack_result.append(level) elif isinstance(target, tuple): level = [] for leaf in target: uleaf = recursive_str_to_unicode(leaf) level.append(uleaf) pack_result.append(tuple(level)) elif isinstance(target, str): return as_unicode(target) else: return target result = pack_result.pop() return result def as_unicode(string): return same_string_type_as(u"", string) def same_string_type_as(type_source, content_source): if isinstance(type_source, str) and isinstance(content_source, unicode): return content_source.encode("utf-8") elif isinstance(type_source, unicode) and isinstance(content_source, str): return content_source.decode("utf-8") else: return content_source if __name__ == '__main__': test_obj = {str('a'): [str('test'), str('some')], str('b_key'): 'b_val'} print repr(test_obj) print repr(recursive_str_to_unicode(test_obj))
worker1 = dict(message_id='1', worker_id='1') worker2 = dict(message_id='2', worker_id='2') worker3 = dict(message_id='3', worker_id='3') worker4 = dict(message_id='4', worker_id='4') worker5 = dict(message_id='1', worker_id='1') worker6 = dict(message_id='1', worker_id='1') worker7 = dict(message_id='1', worker_id='1') worker8 = dict(message_id='1', worker_id='1') s = [worker1, worker2, worker3, worker4, worker5, worker6, worker7, worker8] for val in s[:]: print 'value: %s' % val if '1' == val.get('message_id'): s.remove(val)
pydoc modules | tr ' ' '\n' | grep -v '^$'
# -*- coding: utf-8 -*- from __future__ import unicode_literals class RequestFactory(object): _instance = None def __init__(self, name): print '__init__' # print 'Before name: %s' % repr(self.name) if hasattr(self, 'name'): print 'Before name: %s' % repr(self.name) self.name = name print 'After name: %s' % repr(self.name) def __new__(cls, *args, **kwargs): print '__new__' if not cls._instance: cls._instance = super(RequestFactory, cls).__new__(cls, *args, **kwargs) return cls._instance if __name__ == '__main__': s1 = RequestFactory('Alice') s2 = RequestFactory('Patric') if id(s1) == id(s2): print "Same" else: print "Different"
from pprint import pprint def request(*args, **kwargs): pprint(args) # tuple pprint(kwargs) # dict for count, thing in enumerate(args): print '---args' print '{0}. {1}'.format(count, thing) for name, value in kwargs.items(): print '---kwargs' print '{0} = {1}'.format(name, value)
def dd(*args, **kwargs): for count, thing in enumerate(args): print '============= %s =============' % repr(thing) for name, value in kwargs.items(): print '%s: %s' % (name, repr(value)) def dd(some): with open('var.log', 'a') as log: log.write(some + '\n') log.flush()
http://www.scotttorborg.com/python-packaging/ - организация кода по методу пакетов
Discussion
Exception reraise:
Вывод:
http://farmdev.com/talks/unicode/ - unicod и проблемы с кодировками
http://docs.openstack.org/developer/hacking/ - openstack стиль кода
variable to file
traceback to variable
mysqldb и escape
http://www.slideshare.net/openpbs/sql-injection-defense-in-python – используем cursor.execute('select some from some where some = %s', (var, ))
multiline with variable
echo server
DeadLock при форке
http://bugs.python.org/issue6721
http://bugs.python.org/issue874900
Вывод
Strace порожденного, зависшего процесса:
через kill -15 выходит
Включение логирования
add path include
Асинхронная RPC
Ребята с freenode#python подсказали посмотреть в сторону dbus(сомнительно) и AMP(который является частью twisted)
Немного дебага объектов (вывод его полей)
socket server
http://pep8.ru/doc/tutorial-3.1/ – классный сайт, классные учебники.
Есть предположение:
property
timeout working on yeild
запуск программы с переходом в интерактивный режим
TODO: через написание программы с глобальными переменными и импорт и запуск его через интерактивный режим с возвратом управления в случае ожидаемого события.
template
правильная работа с файлами
Вместо:
используем:
потому что:
Re-raising Exceptions
http://www.ianbicking.org/blog/2007/09/re-raising-exceptions.html
safe change file
wrapper (decorator)
sqlite, mysql -- select to dict
Mysql
Sqlite
sqlite, mysql -- escape
Mysql
Sqlite
Почему в python2 не следует использовать utf8
При использование sqlite:
При использование open: он открывает файл в str и если в нем есть кирилица и ты попробуешь добавить к нему text_plain += u'some', то получишь ошибку
logging not safe for multiprocessing
debug (trace running process) with pyringe
https://github.com/google/pyringe
Starting
Прочитать
http://docs.quantifiedcode.com/python-anti-patterns
самые популярные репозитории
https://github.com/jkbrzt/httpie
https://github.com/django/django
https://github.com/vinta/awesome-python