目录

1  百度爬虫爬取图像 baiduspider

2  图像去重 

3  音频信号采集与播放 pyaudio

4  二维码 MyQR

4.1  生成一个二维码

4.2  识别二维码

5  使用设备的默认浏览器打开一个网页 webbrowser

6  windows鼠标宏 pynput

7  python操作excel内容 xlwings

8  语音合成 pyttsx3

8.1  播放 

8.2  保存音频文件

9  语音识别 speechrecognition与pocketsphinx

10  排列组合 itertools

10.1  可重复顺序有所谓组合

10.2  不重复顺序无所谓组合 

11  python解压7z文件 py7zr 

12  文本比对 difflib


1  百度爬虫爬取图像 baiduspider

这个的项目路径在这里 BaiduSpider: BaiduSpider,一个爬取百度搜索结果的爬虫,目前支持百度网页搜索,百度图片搜索,百度知道搜索,百度视频搜索,百度资讯搜索,百度文库搜索,百度经验搜索和百度百科搜索。

我给它搞成一个demo,这样我们用图像的时候可以搞一个关键字直接使用了

from baiduspider import BaiduSpider
import requests
page_number = 5
picture_number = 10
search_content = '猫'

for page in range(page_number):
    if page == 0:
        continue
    for picture_name in range(picture_number):
        try:
            result = BaiduSpider().search_pic(search_content, pn=page)
            url = result['results'][picture_name]['url']
            respones = requests.get(url)
            with open('./爬取到的图片/'+ str(search_content) + str(page)+ '_' + str(picture_name) + '.jpg','wb') as f:
                f.write(respones.content)
            print(page,picture_name)
        except:
            print('error')
            pass
  • page_number是百度图片下面的页数,以前的页面上有,现在没有了
  • picture_number是每一页要搞下来的图片数,应该每一页不只有10个
  • serch_content是搜索的内容

环境的话我们需要requests和baiduspider,这两个直接用pip install 就可以下载下来了

运行之后的结果是这样的

  • 需要在代码同级路径下创建名为 爬取到的图片 的文件夹

有的图像会出现爬取失败的现象,我已经用try进行容错了

在baiduspider中还可以爬其他的东西,可以在我一开始给的链接中看一下

2  图像去重 

import os
import hashlib

path = 'all/'

def md5sum(filename):
    f = open(filename, 'rb')
    md5 = hashlib.md5()
    while True:
        fb = f.read()
        if not fb:
            break
        md5.update(fb)
    f.close()
    return (md5.hexdigest())

def delfile():
    all_md5 = {}
    filedir = os.walk(path)
    for i in filedir:
        for tlie in i[2]:
            tlie = path + str(tlie)
            if md5sum(tlie) in all_md5.values():
                os.remove(tlie)
            else:
                all_md5[tlie] = md5sum(tlie)

delfile()

os与hashlib都是python自带的库

我们在代码相同路径中创建文件夹all,里面的内容是这样的,我们发现里面有很多重复的图片

现在我们运行代码,运行后,发现重复的图像消失了

3  音频信号采集与播放 pyaudio

import sys
import pyaudio
import wave
import time

CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1#仅支持单声道
RATE = 16000
RECORD_SECONDS = 3#更改录音时长

#录音函数,生成wav文件
def record(file_name):
    try:
        os.close(file_name)
        os.remove(file_name)#先删除一下文件,以防重名
    except:
        pass                  #如果文件不存在直接跳过

    p = pyaudio.PyAudio()
    stream = p.open(format=FORMAT,
                    channels=CHANNELS,
                    rate=RATE,
                    input=True,
                    frames_per_buffer=CHUNK)
    
    frames = []    
    print('录音开始')
    for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
        data = stream.read(CHUNK)
        #print('i的数据:%s'%data)
        frames.append(data)
    print("录音结束")

    stream.stop_stream()
    stream.close()
    p.terminate()

    wf = wave.open(file_name, 'wb')
    wf.setnchannels(CHANNELS)
    wf.setsampwidth(p.get_sample_size(FORMAT))
    wf.setframerate(RATE)
    wf.writeframes(b''.join(frames))
    wf.close()

#播放函数,播放wav文件
def play(file_name):
    # 定义数据流块
    CHUNK = 1024
    # 只读方式打开wav文件
    wf = wave.open(file_name, 'rb')#(sys.argv[1], 'rb')
    p = pyaudio.PyAudio()
    # 打开数据流
    stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
                    channels=wf.getnchannels(),
                    rate=wf.getframerate(),
                    output=True)
    # 读取数据
    data = wf.readframes(CHUNK)
    # 播放
    print('试听开始')
    while data != b'':
        
        stream.write(data)
        data = wf.readframes(CHUNK)
    print('试听结束')
    # 停止数据流  
    stream.stop_stream()
    stream.close()
    # 关闭 PyAudio  
    p.terminate()

if __name__=='__main__':
    record('1.wav')
    play('1.wav')
  • record是录音,play是播放

pyaudio是我们要安装的库,这个有时不这么好装,如果pip install pyaudio不行的话,可能要下whl包或者其他方式进行安装

如果报错 OSError: [Errno -9999] Unanticipated host error 这个要检查一下麦克风,如果麦克风连接正常,你要查一下麦克风的权限

一般只有windows上会出这样的问题,在设置中搜索麦克风

回车后点击这个

这里变为开就好了

运行的显示是这样的

在录音结束后会成成 1.wav 的音频文件

这个1.wav在windows中双击打开也是可以听的

4  二维码 MyQR

4.1  生成一个二维码

from MyQR import myqr
import os

myqr.run(
        words='https://www.baidu.com/',
        picture='python.png',
        colorized=True,
        save_name='./二维码.png',
        save_dir=os.getcwd()
)

需要MyQR这个库,用pip install 的方法可以安装上

可以在二维码中加入图像,也可以不加,也可以加入gif,但有的gif效果不会很好,我们加一张这个图片看一下

生成的结果是这样的

  • 加了一层马赛克,不然CSDN上会图片违规

 如果用微信扫一下的话会直接访问百度的链接

4.2  识别二维码

from pyzbar import pyzbar
import datetime
import cv2

print('开始识别....')
imagePath = "QR code.png"
img = cv2.imread(imagePath)
im = cv2.resize(img,(640,520),)
barcodes=pyzbar.decode(im)

for barcode in barcodes:
    (x,y,w,h)=barcode.rect
    cv2.rectangle(im,(x,y),(x+w,y+h),(0,0,255),2)
    #对二维码内容进行解码,输入时间,内容和类型
    barcodeData=barcode.data.decode("utf-8")
    barcodeType=barcode.type
    text="{}({}){}".format(datetime.datetime.now(),barcodeData,barcodeType)
    print(text)
    cv2.putText(im,text,(x,y-1),cv2.FONT_HERSHEY_SIMPLEX,0.4,(0,255,0),1)
    cv2.imshow("QR code",im)
    cv2.waitKey(0)

效果是这样的

5  使用设备的默认浏览器打开一个网页 webbrowser

使用的库为webbrowser,是python的内建库

import webbrowser

webbrowser.open('http://www.baidu.com')

运行后会使用默认浏览器打开百度 

在windows上测试可以成功用默认的浏览器打开地址,在某些地方用webbrowser.open()打不开默认的浏览器,这个时候你可以用下面的命令试试

好用的话就用os.system()就行了

6  windows鼠标宏 pynput

使用的库是win32api(这个是python自带的)与 pynput

我们下面搞一个连点的效果,我想当我按下PgUp的时候,鼠标连点,按下PgDn的时候终止程序

import win32api
from pynput.mouse import Button, Controller
mouse = Controller()

# num = 0
while True:
    if (win32api.GetAsyncKeyState(0x21) & 0x8000 > 0):
        mouse.click(Button.left)
        # num = num + 1
        # print(num)
    if (win32api.GetAsyncKeyState(0x22) & 0x8000 > 0):
        break

如果想了解更多可以看一下 Python的pynput模块使用_保罗森的博客-CSDN博客_pynput 与 win32平台下按键处理关联的一系列知识点详解_watl0的博客-CSDN博客

7  python操作excel内容 xlwings

使用的库是xlwings,这个库是python自带的,参考 这可能是全网最完整的 Python 操作 Excel 库总结_我爱Python数据挖掘的博客-CSDN博客_python操作excel的库

我下面做个例子

我现在想将 直径>=30,材料为金属,年龄>=18的行挑出来,然后在结果中写上GC2

只需要修改下面红框的部分

  • xlsx_path 是你要使用excel文件的地址
  • sheet.range('A2').value 是获取A2这个格子内的值,获取到的元素类型为字符串
  • sheet.range('D2').value = 'GC2' 是给D2这个格子写上GC2

由于excel中没有0行,并且第一行常常是表头,所以0行与1行使用continue

源码

import xlwings as xw

xlsx_path = 'test.xlsx'
app = xw.App(visible=True, add_book=False) # 程序可见,只打开不新建工作薄
app.display_alerts = False # 警告关闭
app.screen_updating = False # 屏幕更新关闭
wb = app.books.open(xlsx_path)

sheet = xw.sheets.active

for i in range(6):
    if i in [0,1]:
        continue
    diameter = int(sheet.range('A'+str(i)).value)
    material = sheet.range('B'+str(i)).value
    age = int(sheet.range('C'+str(i)).value)
    if diameter>=30 and material == '金属' and age>=18:
        sheet.range('D'+str(i)).value = 'GC2'
    print(str(i)+'行已搞完')

wb.save() # 保存文件
wb.close() # 关闭文件
app.quit() # 关闭程序

8  语音合成 pyttsx3

使用的库是pyttsx3,项目地址 GitHub - nateshmbhat/pyttsx3: Offline Text To Speech synthesis for python

我在树莓派上使用pip安装后使用会出现这个错误 OSError: libespeak.so.1: cannot open shared object file: No such file or directory

安装这个包就可以了 sudo apt-get install espeak

下面我简单摘录两个功能

8.1  播放 

import pyttsx3
pyttsx3.speak("你好")

运行后可以听到你好

8.2  保存音频文件

import pyttsx3
engine = pyttsx3.init() # object creation

"""Saving Voice to a file"""
# On linux make sure that 'espeak' and 'ffmpeg' are installed
engine.save_to_file('你好', 'test.mp3')
engine.runAndWait()

运行后会得到一个mp3文件,双击播放会听到 你好

9  语音识别 speechrecognition与pocketsphinx

两个库都用pip install 下载就行,pocketsphinx是speechrecognition

import speech_recognition as sr

# obtain audio from the microphone
r = sr.Recognizer()
harvard = sr.AudioFile("test.wav")
with harvard as source:
    audio = r.record(source)
# recognize speech using Sphinx
try:
    result = r.recognize_sphinx(audio)
    print(result)
except sr.UnknownValueError:
    print("Sphinx could not understand audio")
except sr.RequestError as e:
    print("Sphinx error; {0}".format(e))

10  排列组合 itertools

10.1  可重复顺序有所谓组合

我在abced这5个字符中,随便取3个,可以取多个同一元素,abc和bac算两个

10.2  不重复顺序无所谓组合 

我在abced这5个字符中,随便取3个,不可以取多个同一个元素,abc和bac算一个

11  python解压7z文件 py7zr 

用windows默认的压缩包软件可能压缩不了7z文件,于是我用linux打包一个7z文件,首先安装p7zip-full

123是密码 test.7z是生成的7z压缩包 test.txt是要压缩的文件

安装py7zr

import py7zr

with py7zr.SevenZipFile('test.7z', mode='r', password='123') as z:
    z.extractall()

运行后发现可以解压

并且内容正确

当我们忘记了压缩包密码的时候,我们可以进行枚举破解,首先创造出一个密码本

  • 枚举只能搞位数少的,如果是仅数字的5位密码就有10w个,如果是仅数字的6位密码就有100w个,100w行内容写在记事本中,双击打开记事本都会卡顿几秒。100w算1秒可以排除一个错误的密码,从头排到尾需要11天半。100w还算不大的,比如对于30位哈希值来讲,可能的密码条数非常之多(62的30次方,个数有5.9122213e+53,9位是1亿这个数有53位),即使我把每100w条密码存在一个密码本中,这个数量级也是搞不定的
import itertools

password_txt = open('password_txt.txt','w')

#所有英文字符就用这个
#include_char = '''
#ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789/*-+.~`!@#$%^&*()_+=-{}[]:;"'|\<,>? 
#'''

#如果仅数字就用这个
include_char = '''
0123456789
'''

include_char = include_char.splitlines()[1]
include_list = []

for char in include_char:
    include_list.append(char)

#如果确定是6位就是range(6,7),如果确定是1到6位就是range(1,7)
for len_password in range(3,4):
    combinations = list(itertools.product(include_list, repeat=len_password))
    for combination in combinations:
        print(str(''.join(combination)),file=password_txt,flush=True)

运行完后会生成要给密码本,里面是所有可能的密码

纯数字的3位密码有1000种可能

然后通过密码本的内容进行解压

12  文本比对 difflib

首先需要有两个txt,一个放正确的文本,一个放错误的文本

之后执行 

import difflib
import webbrowser

left_file_name = '正确的.txt'
right_file_name = '错误的.txt'

with open(left_file_name,encoding="utf-8") as f:
    left_text = f.read().splitlines()
with open(right_file_name,encoding="utf-8") as f:
    right_text = f.read().splitlines()

d=difflib.HtmlDiff(wrapcolumn=45)

with open('./result.html','w',encoding='utf-8') as f:
    f.write(d.make_file(left_text,right_text,fromdesc=left_file_name,todesc=right_file_name))

webbrowser.open('result.html')

然后会弹出网页

这个比对还是挺智能的,比如想比对requirement.txt的时候也可以比对

比如我删了几个库,改变了几个库的版本是可以识别出来的,不是呆板的逐字比对

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐