Python中5个超实用的三方库,精简清晰版

文摘   科技   2023-12-09 14:56   北京  


ISEE小语


寒冷存在的意义,也许就是让你找到更温暖的事物。
——网友




回顾上篇


Flask制作大屏显示-实时数据动态更新(附源码)

ISEE小栈,公众号:ISEE小栈Flask制作大屏显示-实时数据动态更新(附源码)


开始本篇



  1. DeepDiff(深度差异)

    1. 对比两json对象的差异

    2. 对比两个字符串的差异

    3. 对比两个列表的差异

  2. joblib

    1. 对象持久化

    2. 缓存函数

    3. 并行执行任务

  3. tesseract

    1. Tesseract OCR安装

    2. 识别图片中的文案

  4. pyzbar

    1. 解析二维码和条形码

  5. tqdm(进度条)

    1. 进度条动态实现

  6. 总结




环境:

Pycharm

Python 3.9.16




DeepDiff


DeepDiff是一个Python库,用于比较Python对象的深度差异。它能够比较各种数据类型,包括列表、元组、字典、集合、字符串、整数、浮点数等,并给出它们之间的差异。DeepDiff的目标是提供一种简单且易于理解的方式来比较Python对象的差异

我们来举实例了解一下,如下:

安装:pip install deepdiff==6.7.1

导入:from deepdiff import DeepDiff

eg--------:

a、对比两个JSON对象的差异

其中ignore_order=True,是在比较时忽略对象内元素的顺序,以获得更准确的差异比较结果。

# 定义两个JSON对象json1和json2json1 = {    "country": "中国",    "city": "北京",    "name": "颜",    "customer_id": 1001,    "age": 28,    "add_id": 901,    "extra_1": "第一站",    "extra_2": "B201"}
json2 = { "country": "中国", "city": "北京", "name": "诡", "customer_id": 1002, "age": 26, "sex": "m", "add_id": 901, "extra_1": "第一站", "extra_2": "B201", "extra_3": "back"}
# 比较差异并输出不同的值diff = DeepDiff(json1, json2, ignore_order=True)print(diff.to_json())

(左右滑动查看完整代码)

结果:

{    "dictionary_item_added": [        "root['sex']",        "root['extra_3']"    ],    "values_changed": {        "root['name']": {            "new_value": "诡",            "old_value": "颜"        },        "root['customer_id']": {            "new_value": 1002,            "old_value": 1001        },        "root['age']": {            "new_value": 26,            "old_value": 28        }    }}

从以上输出的结果可以看出,json2是作为对比的参照方,在使用的时候要注意这一点。



b、对比两个字符串的差异

直接使用DeepDiff(obj1, obj2),默认包含了所有的差异信息。

s1 = "Hello"s2 = "Hello World"diff = DeepDiff(s1, s2)print(diff.to_json())

(左右滑动查看完整代码)

结果:

{    "values_changed": {        "root": {            "new_value": "Hello World",            "old_value": "Hello"        }    }}

从以上输出的结果可以看出,s2是作为对比的参照方,在使用的时候要注意这一点。

对比的字符串也可以是中文



c、对比两个列表的差异

其中,使用verbose_level=2,这个方法可以提供更详细的差异信息,包括差异的路径和值。

l1 = [1, 2, 3, 12, 34, 5, 3, 2]l2 = [1, 2, 5, 12, 34, 234, 3, 2, 100]diff = DeepDiff(l1, l2, verbose_level=2)print(diff.to_json())

(左右滑动查看完整代码)

结果:

{    "values_changed": {        "root[2]": {            "new_value": 5,            "old_value": 3        },        "root[5]": {            "new_value": 234,            "old_value": 5        }    },    "iterable_item_added": {        "root[8]": 100    }}


其他的类型对比,如元组、集合、整数、浮点数等,都可以进行对比差异,实现方式同上。

对于输出结果,除了输出json格式,还可以输出以树形结构展示差异,比如两个列表差异输出:

print(diff.tree)

结果:

{'iterable_item_added': [<root[8] t1:not present, t2:100>], 'values_changed': [<root[2] t1:3, t2:5>, <root[5] t1:5, t2:234>]}

小栈使用时输出json格式,在代码中处理更方便些




joblib


joblib是Python中一个非常厉害的第三方库,用于提供高效的对象持久化(序列化)和并行计算的功能。它可以用于缓存计算结果、并行执行任务、分布式计算等场景

安装:pip install joblib==1.3.2

eg--------:

a、对象持久化

将Python对象保存到磁盘文件,以便后续重用。它支持对NumPy数组、Pandas数据框等常见数据结构的持久化。

我们将上面Json对比差异的结果保存到文件,

from joblib import dump, load
# 保存对象到文件data = { "values_changed": { "root[2]": { "new_value": 5, "old_value": 3 }, "root[5]": { "new_value": 234, "old_value": 5 } }, "iterable_item_added": { "root[8]": 100 }}dump(data, 'data.joblib')

(左右滑动查看完整代码)

这时,我们可以看到当前目录下,自动创建了data.joblib

我们后面需要用的时候,可以直接从这里面取

# 从文件加载对象loaded_data = load('data.joblib')print("获取JSON对比结果:\n", loaded_data)

(左右滑动查看完整代码)

结果:




b、缓存函数

缓存函数,以前只有想过怎么能缓存函数?现在这里可以实现了,相当给力。

首先,创建一个内存缓存对象

from joblib import Memorymemory = Memory(location='cache_directory')

(左右滑动查看完整代码)

这时,我们可以看到当前目录下,自动创建了cache_directory文件夹


然后,定义一个需要缓存的函数

@memory.cachedef cache_function(x):    result = x * x    return result

(左右滑动查看完整代码)


最后,我们调用

result1 = cache_function(10)result2 = cache_function(11)print(result1)print(result2)

(左右滑动查看完整代码)

结果:

第一次执行,是将函数缓存,并得到结果。

我们再运行一次,就是从只会显示两个结果:

结果1:100结果2:121

说明已经缓存成功,后面都是调用缓存中的函数了!



c、并行执行任务

joblib提供了简单的接口来并行执行任务。它可以自动将任务分解为多个子任务,并利用多核CPU或分布式计算资源进行并行计算。

from joblib import Parallel, delayed
# 定义一个需要并行执行的任务def square(x): return x + 2
# 并行计算任务results = Parallel(n_jobs=2)(delayed(square)(i) for i in range(20))
print(results)

(左右滑动查看完整代码)

结果:

以上是使用Parallel类来并行执行该任务,其中:

n_jobs:参数指定了要使用的工作进程数(本示例中为2,即为启用两个进程来执行任务)

delayed:是装饰器,用于指定要并行执行的函数和参数

结果很清晰,但需要注意的是并行执行任务时可能会涉及到数据共享和同步的问题,你需要根据具体情况进行适当的处理,以确保并行执行的正确性和效率




pytesseract


pytesseract是一个Python的OCR工具库,它提供了与Tesseract OCR引擎的接口,可以用于识别图片中的文本。

Tesseract OCR引擎是一个开源的OCR引擎,由Google开发。它可以将图像中的文字转换为可供计算机处理的文本数据。pytesseract库就是为了方便使用Tesseract OCR引擎而开发的Python封装。

a、Tesseract OCR安装

在正式实现之前,Tesseract OCR需要在电脑上安装一下:

这个是必须安装的,要不然在识别的时候会报异常

(以windows 10为例)

1. 打开网页

https://tesseract-ocr.github.io/tessdoc/

安装过程可默认安装,也可以自定义安装,随意即可!

小栈默认安装在了C盘:

C:\Program Files\Tesseract-OCR路径下 。


2. 下载安装完成后,需要配置环境变量


3. 安装完成后查看版本信息

运行—cmd,输出tesseract -v

说明已经安装成功了,那么接下来就开始代码实现……




b、识别图片中的文案

pytesseract在实际运用的时候,需要和PIL配合使用,在安装包的时候一同安装上即可。

安装:

pip install pytesseract==0.3.10

pip install pillow==10.1.0

导入:

import pytesseract

from PIL import Image

eg--------:

准备测试图片test.jpg


接下来开始识别

import pytesseractfrom PIL import Image
# Tesseract OCR引擎的安装路径pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'lang = 'chi_sim'  # 中文语言参数
image = Image.open('./test.jpg')text = pytesseract.image_to_string(image, lang=lang)
print(text)

(左右滑动查看完整代码)

结果:




pyzbar


pyzbar是一个用于解析二维码和条形码的Python第三方库。它是基于zbar C库开发的,可以在图像中检测和解码多种常见的一维条形码和二维码格式,包括QR码、Data Matrix码、EAN-13码等。

pyzbar在实际运用的时候,需要和PIL配合使用,在安装包的时候一同安装上即可。

安装:

pip install pyzbar==0.1.9

pip install pillow==10.1.0

导入:

from pyzbar.pyzbar import decode

from PIL import Image

eg--------:

准备条形码Barcode.png


准备二维码Qr code.png


接下来开始解析

from pyzbar.pyzbar import decodefrom PIL import Image
# 读取图像文件image_bar = Image.open('Barcode.png')image_Qr = Image.open('Qr code.png')
# 解码图像中的条形码barcodes = decode(image_bar)# 解码图像中的二维码qrcodes = decode(image_Qr)
# 遍历解码结果并打印for barcode in barcodes: barcode_data = barcode.data.decode('utf-8') print("解码条形码结果:\n", barcode_data)print()for qrcode in qrcodes: qrcode_data = qrcode.data.decode('utf-8') print("解码二维码结果:\n", qrcode_data)

(左右滑动查看完整代码)

结果:



tqdm


tqdm是一个Python库,用于在循环中显示进度条。它提供了一个简单的接口,可以轻松地在for循环、while循环等迭代过程中显示进度条,帮助你直观地了解代码执行的进度。

tqdm还提供了其他一些有用的功能,例如估计剩余时间、速度等。你可以通过传递一些参数来自定义进度条的样式和设置。

安装:pip install tqdm==4.66.1

导入:

from tqdm import tqdm

from colorama import Fore

eg--------:

a、进度条动态实现

其中Fore.GREEN是设置进度条的颜色为绿色

total_num = 100with tqdm(total=total_num, bar_format="{l_bar}%s{bar}%s{r_bar}" % (Fore.GREEN, Fore.RESET)) as pbar:    for i in range(total_num):        time.sleep(0.1)        pbar.set_description("Processing")        pbar.update(1)

(左右滑动查看完整代码)

结果:

在使用的时候修改两个地方即可,将:

1. total_num修改为执行任务的迭代对象

2. time.sleep(0.1)修改为执行任务函数




总结


最近实际运用中所涉及到的三方库,取5个记录分享,不常见,却很好用。实现方式不是唯一的,找到适合的才是最佳的。

以上记录如有兴趣,请自行查阅官方资料并深入研究,功能都很强大。



寄语:世间三美,明月,清风,眼前……



看到这儿的朋友帮点个“”和“在看”,谢谢支持~!

     

文章就分享到这儿,喜欢就点个吧!

推荐阅读  点击标题可跳转

ISEE小栈
没有花里胡哨,简单才是王道。
 最新文章