python的一些有趣的库
1百度爬虫爬取图像这个的项目路径在这里BaiduSpider: BaiduSpider,一个爬取百度搜索结果的爬虫,目前支持百度网页搜索,百度图片搜索,百度知道搜索,百度视频搜索,百度资讯搜索,百度文库搜索,百度经验搜索和百度百科搜索。我给它搞成一个demo,这样我们用图像的时候可以搞一个关键字直接使用了from baiduspider import BaiduSpiderimport reque
目录
9 语音识别 speechrecognition与pocketsphinx
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()打不开默认的浏览器,这个时候你可以用下面的命令试试
- chromium-browser --disable-gpu --kiosksk 'https://www.baidu.com/'
好用的话就用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
- 参考 speechrecognition_魔天一念的博客-CSDN博客
- 目前我只试过识别英文,链接中提到的中文包我没装
两个库都用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的时候也可以比对
比如我删了几个库,改变了几个库的版本是可以识别出来的,不是呆板的逐字比对
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)