python基础

本文介绍了几种实用的Python编程技巧,包括文件搜索、分布式进程实现、生成验证码图片、解析HTML和XML文档以及使用MD5加密等。这些技巧对于日常开发非常有用,能够提高工作效率并简化复杂操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.递归 查找当前文件夹下的所有文件(包括子文件夹),名称包含 s 的文件

方法一:


import os

def search(s):
    mydict={}
    isDirOrFile(os.path.abspath('.'),mydict)
    for k,v in mydict.items():
        if k.__contains__(s):
            print v

def isDirOrFile(path,kw):
    if os.path.isdir(path):
        for x in os.listdir(path):
            result = os.path.join(path, x)
            isDirOrFile(result, kw)
    elif os.path.isfile(path):
        kw.setdefault(path, os.path.abspath(path))

if __name__ == '__main__':
    search('File')

方法二:

import os

def search(s, path):
    for x in os.listdir(path):
        result = os.path.join(path, x)
        if os.path.isdir(result):
            search(s, result)
        else:
            if s in x:
                print result

if __name__ == '__main__':
	start_path = os.path.abspath('.')
    search('File', start_path)

2.分布式进程

暂时不太懂,感觉跟java的消息队列很像
这两个代码是:
taskManager 先往队列中放数据,
然后 taskWorker 得到数据,计算,将结果发送到另一个队列
taskManager 就得到了最后的计算结果

先执行这个:
taskManager.py

import random,time,Queue
from multiprocessing.managers import BaseManager

# 发送任务和接受任务的队列
task_queue=Queue.Queue()
result_queue=Queue.Queue()
# 解决windows系统__main__.<lambda> not found问题
def return_task_queue():
    return task_queue
def return_result_queue():
    return result_queue

class QueueManager(BaseManager):
    pass

if __name__ == '__main__':
    # 把两个queue 注册到网络上,callback参数关联queue对象
    QueueManager.register('get_task_queue',callable=return_task_queue)
    QueueManager.register('get_result_queue',callable=return_result_queue)
    # 绑定端口,设置验证码
    manager=QueueManager(address=('127.0.0.1',5000),authkey='abc')
    manager.start()

    task=manager.get_task_queue()
    result=manager.get_result_queue()

    for i in range(10):
        n=random.randint(0,10000)
        print 'Put task %s ' % n
        task.put(n)
    print 'Try get results ...'
    for i in range(10):
        r=result.get(timeout=10)
        print 'Result : %s ' % r

    manager.shutdown()

再执行这个:
taskWorker.py

import time, sys, Queue
from multiprocessing.managers import BaseManager

class QueueManager(BaseManager):
    pass
# 只需要从网络上获取queue,所以注册时只需要提供名字
QueueManager.register('get_task_queue')
QueueManager.register('get_result_queue')

server_addr='127.0.0.1'
print 'Connect to %s ' % server_addr

m=QueueManager(address=(server_addr,5000),authkey='abc')
m.connect()

task=m.get_task_queue()
result=m.get_result_queue()

for i in range(10):
    try:
        n=task.get(timeout=1)
        print 'Run task %s * %s ...' % (n,n)
        r='%s * %s = %s' % (n,n,n*n)
        time.sleep(1)
        result.put(r)
    except Queue.Empty:
        print 'Task queue is empty.'
print 'Worker exit.'

python生成一个验证码图片

转自:https://www.liaoxuefeng.com/wiki/897692888725344/966759628285152

from PIL import Image,ImageDraw,ImageFont,ImageFilter
import random

# 随机字母
def randomChar():
    code=chr(random.randint(65, 90))
    print code
    return code

# 随机颜色
def randomColor():
    return (random.randint(64,255),random.randint(64,255),random.randint(64,255))

# 随机颜色2
def randomColor2():
    return (random.randint(32,127),random.randint(32,127),random.randint(32,127))

# 240*60
width=60*4
height=60
image=Image.new('RGB',(width,height),(255,255,255))
# 创建font对象
font=ImageFont.truetype('C:\Windows\Fonts\Arial.ttf',36)
# 创建draw对象
draw=ImageDraw.Draw(image)
# 填充每个像素
for x in range(width):
    for y in range(height):
        draw.point((x,y),fill=randomColor())
# 输出文字
for t in range(4):
    draw.text((60*t+10,10),randomChar(),font=font,fill=randomColor2())
# 模糊
image=image.filter(ImageFilter.BLUR)
image.save('code.jpg','jpeg')

python解析html

解析html,得到想要的数据

from HTMLParser import HTMLParser
import urllib

class MyHTMLParser(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)
        self._count=0
        self._events=dict()
        self._flag=None
	# 开始标签
    def handle_starttag(self,tag,attrs):
        if tag=='h3' and attrs.__contains__(('class','event-title')):
            self._flag='even-title'
            self._count+=1
            self._events[self._count]=dict()
        if tag=='time':
            self._flag='time'
        if tag=='span' and attrs.__contains__(('class','event-location')):
            self._flag='event-location'
	# 标签中的元素
    def handle_data(self,data):
        if self._flag=='even-title':
            self._events[self._count]['even-title']=data
        if self._flag=='time':
            self._events[self._count]['time']=data
        if self._flag=='event-location':
            self._events[self._count]['event-location']=data
        self._flag=None

    def get_events(self):
        return self._events

try:
    page=urllib.urlopen('https://www.python.org/events/python-events/')
    html=page.read()
except IOError,e:
    print e
else:
    parser=MyHTMLParser()
    parser.feed(html)
    events=parser.get_events()
    print events
finally:
    if page:
        page.close()

python解析xml

import urllib  #用来抓去网站信息的模块
from xml.parsers.expat import ParserCreate  #解析器
import re  #正则表达式

try:
    #创建链接实例,获取百度天气API
    page = urllib.urlopen('http://api.map.baidu.com/telematics/v2/weather?location=%E5%8C%97%E4%BA%AC&ak=B8aced94da0b345579f481a1294c9094')
    #读取实例内容,赋值给XML
    XML = page.read()
finally:
    page.close()

a = re.compile(r'^\s+$')  #空格,正则表达式

class BaiduWeatherSaxHandler(object):
    def __init__(self):
        self.L = []  #创建一个list装XML中的关键数据
        self.R = False
        self.d = ['currentCity','date','weather','wind','temperature']

    def start_element(self,name,attrs):
        # print ('sax:start_element:%s,attrs:%s' % (name,str(attrs)))
        if name in self.d:
            self.R = True

    def char_data(self, text):
        if a.match(text):  #去掉空格的(没内容的)
            pass
        elif self.R:
            self.L.append(text)
            self.R = False
        # else:
        #     print ('sax:char_data: %s' % text)

    def end_element(self, name):
        # print ('sax:end_element: %s' % name)
        if name == 'results':
            for x in self.L:
                print x
            raise SystemExit  # 关闭程序

handler =BaiduWeatherSaxHandler()  #设置解析方法
parser =ParserCreate()  #创建解析器
# 设置解析器参数
parser.returns_unicode = True  #返回unicode编码
parser.StartElementHandler = handler.start_element
parser.EndElementHandler = handler.end_element
parser.CharacterDataHandler = handler.char_data
parser.Parse(XML)  #解析文本

python中MD5的demo

import sys
import hashlib

class user(object):
	# 类比数据库
    db = dict()
    
    # 根据用户的登录名和口令,生成更安全的口令
    def register(self,username,password):
        if username in self.db:
            print 'This username %s is already exist!' % username
            # 终止程序,跟java类似
            sys.exit(0)
        # 用户名 没有被注册  pasword+username+盐 来生成复杂的密码
        realPassword=password+username+'The-Salt'
        md5=hashlib.md5()
        md5.update(realPassword)
        resultPassword=md5.hexdigest()
        self.db.setdefault(username,resultPassword)
        print 'Register Success,%s' % username

    # 验证用户登录的函数
    def login(self,username, password):
        for k, v in self.db.items():
            if username == k:
                md5 = hashlib.md5()
                md5.update(password+username+'The-Salt')
                pw = md5.hexdigest()
                if pw == v:
                    return True
        return False


if __name__ == '__main__':
    u=user()
    u.register('Caren','123456')
    flag=u.login('Caren','123456')
    if flag:
        print '登录成功!'
    else:
        print '用户名或密码不正确!'
    print u.db
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值