фокусы с питоном

задняя часть Python сервер Windows
фокусы с питоном


Данная статья используется как запись.Некоторые приемы и хитрости встречаются в процессе использования python, часть кодов написана мной, часть встроенные функции python, а часть взяты из интернета. Эта запись предназначена только для резервного копирования, и ее легко найти, если ее забыли.
Эта статья будет постоянно обновляться, а ее содержание ограничено записью некоторых часто используемых кодов или модулей, которые просты в использовании, но никогда не запоминаются.

консольная операция

Консоль не вылетает

os.system('pause')

получить размер консоли

rows, columns = os.popen('stty size', 'r').read().split()

Управление вводом/выводом

Решить проблему искажения китайских символов в строке ввода.

raw_input(unicode('请输入文字','utf-8').encode('gbk'))

форматированный вывод

print a.prettify()

Принимать несколько строк ввода

text=""
while 1:
    data=raw_input(">>")
    if data.strip()=="stop":
        break
    text+="%s\n" % data
print text
---------------------------
>>1
>>2
>>3
>>stop
1
2
3

одноранговый вывод

Print '%s' % a,
Print '%s \r' % a

стандартный ввод и вывод

sys.stdout.write("input") 标准输入
sys.stdout.flush() 刷新缓冲区

Функция print аналогична sys.stdout.write, поскольку по умолчанию print в версии 2.x указывает вывод на стандартный вывод (sys.stdout).

контроль цвета

Консоль управления цветом (для окон)

WConio.textcolor(WConio.YELLOW)
print "yellow"
WConio.textcolor(WConio.BLUE)
print "blue"

Управление цветом вывода (полная платформа)

red = '\033[1;31m'
green = '\033[1;32m'
yellow = '\033[1;33m'
white = '\033[1;37m'
reset = '\033[0m’
print red+"color is red"+reset
print green+"color is green"+reset

индикатор выполнения

Вариант первый

from __future__ import division
import sys,time
j = '#'
for i in range(1,61):
    j += '#'
    sys.stdout.write(str(int((i/60)*100))+'%  ||'+j+'->'+"\r")
    sys.stdout.flush()
    time.sleep(0.1)

Вариант 2

import sys
import time
for i in range(1,61):
    sys.stdout.write('#'+'->'+"\b\b")
    sys.stdout.flush()
    time.sleep(0.5)

третье решение

from progressbar import *
import time
import os
rows, columns = os.popen('stty size', 'r').read().split() #获取控制台size    
console_width=int(columns)
total = 10
progress = ProgressBar()
def test():
    '''
    进度条函数,记录进度
    '''
    for i in progress(range(total)):
        test2()
def test2():
    '''
    执行函数,输出结果
    '''
    content="nMask'Blog is http://thief.one"
    sys.stdout.write("\r"+content+" "*(console_width-len(content)))
    time.sleep(1)
    sys.stdout.flush()
test()

Более продвинутое использование может использовать модуль progressbar.

работа системы

системное сообщение

Получить путь установки Python

from distutils.sysconfig import get_python_lib
print get_python_lib

Получить текущую версию Python

sys.version_info
sys.version

получить текущее время

c=time.ctime()
#自定义格式输出
ISOTIMEFORMAT=’%Y-%m-%d %X’
time.strftime( ISOTIMEFORMAT, time.localtime() )

Просмотр переменных системной среды

os.environ["PATH"]

получить системный диск

os.popen("wmic VOLUME GET Name")

Получить текущий путь (включая текущее имя файла py)

os.path.realpath(__file__)

Терминатор строки, используемый текущей платформой

os.linesep

получить размер терминала

rows, columns = os.popen('stty size', 'r').read().split()
#python3以后存在可以使用os
os.get_termial_size()

выйти из программы

  • return: возвращает значение функции и выходит из функции.
  • exit(): выйти напрямую.
  • sys.exit(): вызывает исключение SystemExit. Если ошибка не обнаружена, программа Python завершает работу напрямую; после обнаружения исключения можно выполнить дополнительную работу по очистке.
  • sys.exit(0): для нормального выхода другие (1-127) являются ненормальными, и для захвата могут быть созданы исключения. (Обычно используется для выхода из программы в основном потоке)
  • os._exit(0): выйти из программы python напрямую, и следующий код не будет выполняться. (обычно используется для выхода из программы в потоке)

работа в сети

разрешить доменное имя в ip

ip= socket.getaddrinfo(domain,'http')[0][4][0]

Получить информацию о версии сервера

sUrl = 'http://www.163.com'
sock = urllib2.urlopen(sUrl)
sock.headers.values()

файловые операции

открыть функцию, использовать wb, rb вместо w, r

with open("test.txt","wr") as w:
    w.write("test")

Этот способ написания совместим с python2/3.
Вывести все имена файлов в каталоге

def search(paths):
    if os.path.isdir(paths):  #如果是目录
          files=os.listdir(paths)  #列出目录中所有的文件
          for i in files:
               i=os.path.join(paths,i)  #构造文件路径
               search(i)           #递归
          elif os.path.isfile(paths): #如果是文件
               print paths   #输出文件名

поиск файлов

import glob
print glob.glob(r"E:/*.txt")     #返回的是一个列表
查找文件只用到三个匹配符:”*”, “?”, “[]“
”*”匹配0个或多个字符;
”?”匹配单个字符;
”[]“匹配指定范围内的字符,如:[0-9]匹配数字。

Найдите путь к папке с указанным именем

def search(paths,file_name,tag,lists):
    if os.path.isdir(paths):  #如果是目录
        if file_name==tag:    #如果目录名称为tag
            lists.append(paths) #将该路径添加到列表中
        else:                 #如果目录名称不为tag
            try:
                files_list=os.listdir(paths)  #列出目录中所有的文件
                for file_name in files_list:
                    path_new=os.path.join(paths,file_name)  #构造文件路径
                    search(path_new,file_name,tag,lists)    #递归
            except: #遇到特殊目录名时会报错
                pass
    elif os.path.isfile(paths): #如果是文件
        pass
    return lists

манипуляция данными

Определите тип данных

isinstance("123",(int,long,float,complex)

строка (строка)

понимание строк

a="True"
b=a if a=="True" else "False"
>>>print b
True

Метод форматирования объединяет строки и переменные.

a="{test} abc {test2}".format(test="123",test2="456")
>>>>print a 
123 abc 456
或者:
a="{},{}".format(1,2)
>>>>>print a
1,2

убрать цифры после запятой

a=1.21311
b=Int(math.floor(a))

Строка символов

>>> a =  "codementor"
>>> a[::-1]

Первая буква String Variable Capital

info = 'ssfef'
print info.capitalize()
print info.title()

Возвращает новую строку длины, ширины, центрированной и дополненной пробелами.

"center string".center(width) #width设置为控制台宽度,可控制输出的字符串居中。

Список всех букв

print string.ascii_uppercase 所有大写字母
print string. ascii_lowercase 所有小写字母
print string.ascii_letters 所有字母(包括大小写)

список

дедупликация списка

ids = [1,4,3,3,4,2,3,4,5,6,1]
ids = list(set(ids))

Контрольный список пуст

a=[]
if not a:

список операций

a=[1,2,3]
b=[3,4,5]
set(a)&set(b) 与
set(a)|set(b) 或
set(a)-set(b) 非

Добавление элементов одного списка

a = ["Code", "mentor", "Python", "Developer"]
>>> print " ".join(a)
Code mentor Python Developer

Добавить несколько элементов списка по отдельности

list1 = ['a', 'b', 'c', 'd']
list2 = ['p', 'q', 'r', 's']
>>> for x, y in zip(list1,list2):  
        print x, y
ap
bq
cr
ds

Преобразование вложенного списка в один список

a = [[1, 2], [3, 4], [5, 6]]
>>> import itertools
>>> list(itertools.chain.from_iterable(a))
[1, 2, 3, 4, 5, 6]

Добавить элементы в список

a=[1,2,3](数字)
sum(a)

создает список строк az

map(chr,range(97,123))

Копия списка

a=[1,2,3]
b=a
当对b进行操作时,会影响a的内容,因为共用一个内存指针,b=a[:] 这样就是单独复制一份了。

понимание списка

Если + остальное со списком разборы

[i if i >5 else -i for i in range(10)]

многоуровневый вложенный список

a=[[1,2],[3,4]]
b=[for j in i for i in a]
print b
[1,2,3,4]

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

a=(i else i+1 for i in b if i==1)

Понимание словаря

Изменить позиции ключа и значения

dict={"a":1,"b":2}
b={value:key for key value in dict.items()}

Словарные операции (dict)

Отфильтровать ключи с повторяющимися значениями

list1=self.dict_ip.items()             
        ddict=defaultdict(list)
        for k,v in list1:
            ddict[v].append(k)
        list2=[(i,ddict[i]) for i in ddict if len(ddict[i])>1]
        dict_ns=dict(list2)

лексикографическая сортировка (py2)

file_dict={"a":1,"b":2,"c":3}
file_dict_new=sorted(file_dict.iteritems(), key=operator.itemgetter(1),reverse=True) ##字典排序,reverse=True由高到低,itemgetter(1)表示按值排序,为0表示按key排序。

Словарное оценочное суждение

b={"a":1}
a=b.get("a","")  #如果不存在a,则返回””
c=a if a else 0  #如果存在a,则返回a,不然返回0

работа модуля

При импорте модуля задайте свойства или методы, которые разрешено импортировать.

fb.py:
-----------------------
__all__=["a","b"]
a="123"
c="2345"
def b():
    print “123”
-----------------------
from fb import *
可以导入__all__内定义的变量,a跟b()可以导入,c不行。如果不定义__all__则所有的都可以导入。

Импортируйте пакет в родительский каталог

sys.path.append("..")
from spider.spider_ import spider_

Импорт модулей из внешних каталогов

需要在目标目录下创建__init__.py文件,内容随便。

добавить свойства модуля

有时候源代码中,我们需要写上自己的名字以及版本介绍信息,可以用__name__的方式定义。
a.py:
#! -*- coding:utf-8 -*-
__author__="nMask"

Затем, когда мы импортируем модуль a, мы можем вывести dir(a), чтобы увидеть

>>> import p
>>> print dir(p)
['__author__', '__builtins__', '__doc__', '__file__', '__name__', '__package__']
>>> print p.__author__
nmask

Динамически загружать все модули в каталоге

目录:
---test
   ----a.py
   ----b.py
---c.py
c.py导入test下面的所有模块:
for path in ["test"]:
    for i in list(set([os.path.splitext(i)[0] for i in os.listdir("./"+path)])):
        if i!="__init__" and i!=".DS_Store": ##排除不必要的文件
            import_string = "import path+"."+i+"
            exec import_string #执行字符串中的内容

работа функции

eval/exec

def test(content):
    print content
exec(“test(‘abc')”)

вывод: абв
Описание: Функция exec не имеет возвращаемого значения.

def test(content):
    return content
print eval(“test(‘abc')”)

вывод: абв
Описание: функция eval имеет возвращаемое значение

функция декоратора

декоратор вывода текущего времени

def current_time(aclass):
    def wrapper():
        print "[Info]NowTimeis:",time.ctime()
        return aclass()
    return wrapper

итераторы itertools

p=product(["a","b","c","d"],repeat=2)
----
[("a","a"),("b","b")......]

уменьшить функцию

Результат этого выполнения функции передается в следующий раз.

def test(a,b):
    return a+b
reduce(test,range(10))
结果:从0+1+2......+9

функция перечисления

Введите элементы списка и порядковые номера

n=["a","b","c"]
for i,m in enumerate(n):
    print(i,m)

настройка тайм-аута функции

@Обновлено 27.05.2017
Используйте сигнал, чтобы установить время ожидания выполнения функции

import time
import signal
 
def test(i):
    time.sleep(0.999)#模拟超时的情况
    print "%d within time"%(i)
    return i
 
def fuc_time(time_out):
    # 此为函数超时控制,替换下面的test函数为可能出现未知错误死锁的函数
    def handler(signum, frame):
        raise AssertionError
    try:
        signal.signal(signal.SIGALRM, handler)
        signal.alarm(time_out)#time_out为超时时间
        temp = test(1) #函数设置部分,如果未超时则正常返回数据,
        return temp
    except AssertionError:
        print "%d timeout"%(i)# 超时则报错
 
if __name__ == '__main__':
    for i in range(1,10):
        fuc_time(1)

повторение ошибки функции

Используйте модуль повторных попыток для реализации функций отчетов об ошибках и функции повторных попыток.

import random
from retrying import retry
@retry
def have_a_try():
    if random.randint(0, 10) != 5:
        raise Exception('It's not 5!')
    print 'It's 5!'

Если мы запустим функцию have_a_try, она не завершится, пока random.randint не вернет 5, в противном случае она будет выполнена повторно, пожалуйста, поищите другие варианты использования этого модуля.

Работа программы

@Обновлено 27.05.2017

Ctrl+C для выхода из программы

Используйте signal для реализации ctrl+c для выхода из программы.

import signal
import sys
import time
def handler(signal_num,frame):
    print "\nYou Pressed Ctrl-C."
    sys.exit(signal_num)
signal.signal(signal.SIGINT, handler)
# 正常情况可以开始你自己的程序了。
# 这里为了演示,我们做一个不会卡死机器的循环。
while 1:
    time.sleep(10)
# 当你按下Ctrl-C的时候,应该会输出一段话,并退出.

программа перезапускается

Используйте метод os.execl для реализации самозапуска программы

import time
import sys
import os
def restart_program():
     python = sys.executable
     print "info:",os.execl(python, python, * sys.argv)
     #os.execl方法会代替自身进程,以达到自重启的目的。
if __name__ == "__main__":
     print 'start...'
     print u"3秒后,程序将结束...".encode("utf8")
     time.sleep(3)
     restart_program()

стена времени

@2017.04.19 Создал этот пост
@2017.04.24 Добавлена ​​функция eval/exec
@2017.05.27 Добавить операцию программы, таймаут функции, повтор ошибки функции
@ 2017.08.24 Добавить форматирование строк и переменных, производных строк