<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[haeasringnar的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/haeasringnar</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; haeasringnar]]></copyright><item><title><![CDATA[Python 利用飞桨OCR、layoutparser、TensorFlow对票据进行表格检测和识别]]></title><link>https://blog.youkuaiyun.com/haeasringnar/article/details/124556486</link><guid>https://blog.youkuaiyun.com/haeasringnar/article/details/124556486</guid><author>haeasringnar</author><pubDate>Tue, 03 May 2022 16:18:28 +0800</pubDate><description><![CDATA[draft-detect
运行环境：
Windows10 系统  6核6线程 16G内存
基于 Python3.8 版本 vitualenv 虚拟环境
1、安装依赖
先创建虚拟环境，基于Python3.8，然后激活虚拟环境。
安装 requirements 中的依赖项
pip install -r requirements.txt

安装版面分析的特定库，注意：只能安装这个库，其他版本的库会有问题
pip install -U https://paddleocr.bj.bcebos.com/whl/layo]]></description><category></category></item><item><title><![CDATA[飞桨OCR打标、训练、预测、部署全流程]]></title><link>https://blog.youkuaiyun.com/haeasringnar/article/details/122936537</link><guid>https://blog.youkuaiyun.com/haeasringnar/article/details/122936537</guid><author>haeasringnar</author><pubDate>Tue, 15 Feb 2022 09:51:53 +0800</pubDate><description><![CDATA[注：本文档全部在Windows10环境下操作
注：本文档使用的飞桨OCR全景项目代码版本为 release/2.4
查询文档列表：
飞桨OCR官方中文文档：https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.4/README_ch.md
飞桨OCR for pdserving 部署官方文档：https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.4/deploy/pdserving/REA]]></description><category></category></item><item><title><![CDATA[Python 使用 Web3.py 进行 ETH 和代币转账]]></title><link>https://blog.youkuaiyun.com/haeasringnar/article/details/122761580</link><guid>https://blog.youkuaiyun.com/haeasringnar/article/details/122761580</guid><author>haeasringnar</author><pubDate>Mon, 31 Jan 2022 20:26:33 +0800</pubDate><description><![CDATA[Python使用Web3]]></description><category></category></item><item><title><![CDATA[Python 处理人民币金额，大小写互转]]></title><link>https://blog.youkuaiyun.com/haeasringnar/article/details/121632479</link><guid>https://blog.youkuaiyun.com/haeasringnar/article/details/121632479</guid><author>haeasringnar</author><pubDate>Tue, 07 Dec 2021 17:20:03 +0800</pubDate><description><![CDATA[在工作中经常可以遇到人民币金额大小写的转换问题，这里是以 Python3 实现的人民币大小写转换的脚本，实测可用，准确无误，最大支持16位以内的金额大小写转换。
脚本如下，可以在本地启动后输入小写金额进行验证：
# handleCNY.py

class ChangeCNY(object):
    NUM_DICT = {
        '0': '零',
        '1': '壹',
        '2': '贰',
        '3': '叁',
        '4': '肆',
  ]]></description><category></category></item><item><title><![CDATA[Django 使用不同配置文件的三种方式]]></title><link>https://blog.youkuaiyun.com/haeasringnar/article/details/121233549</link><guid>https://blog.youkuaiyun.com/haeasringnar/article/details/121233549</guid><author>haeasringnar</author><pubDate>Fri, 12 Nov 2021 18:10:52 +0800</pubDate><description><![CDATA[1、背景简要
开发过程中，环境分离是很常见的情况，一般都会分开发环境和生产环境。也有些分开发环境、日常环境、生产环境。
当环境更多的时候，咱在写代码的时候当然不希望每次在上代码时再改配置，比较好的方法就是写多个配置文件，通过环境变量来决定使用哪个配置文件。
Django 中默认是使用项目目录中的 settings.py 作为配置文件，接下来就按照开发、生产两套环境来探讨下，在 Django 中都有什么方式来动态使用配置文件。
写在前面：
本例的 Django 项目名称为 base_django_api 就是]]></description><category></category></item><item><title><![CDATA[Python 通过pyautogui进行自动化操作，截图定位]]></title><link>https://blog.youkuaiyun.com/haeasringnar/article/details/115626899</link><guid>https://blog.youkuaiyun.com/haeasringnar/article/details/115626899</guid><author>haeasringnar</author><pubDate>Sun, 24 Oct 2021 21:40:54 +0800</pubDate><description><![CDATA[import pytest
import pyautogui
import os
import time
import allure
from PIL import Image
import cv2
import aircv as ac
import numpy as np


if __name__ == "__main__":
    # pytest.main(['-s', r'D:\aeas\shendu_-ui_zidonghua\tests\test_zaoshang\test_zaoshang]]></description><category></category></item><item><title><![CDATA[Python 对称加密ECB简单实现]]></title><link>https://blog.youkuaiyun.com/haeasringnar/article/details/120828340</link><guid>https://blog.youkuaiyun.com/haeasringnar/article/details/120828340</guid><author>haeasringnar</author><pubDate>Sun, 24 Oct 2021 21:34:18 +0800</pubDate><description><![CDATA[利用pycrypto中的方法来实现简单的ECB对称加密
具体代码如下
from base64 import b64decode
from base64 import b64encode
from Crypto.Cipher import AES # pip install pycrypto==2.6.1
import time


class ECBCipher(object):
    '''
    定义一个基于AES的ECB模式的加解密类
    '''
    def __init__(self, ]]></description><category></category></item><item><title><![CDATA[数据分析时利用 Python3 生成大量数据集CSV的通用脚本]]></title><link>https://blog.youkuaiyun.com/haeasringnar/article/details/113486916</link><guid>https://blog.youkuaiyun.com/haeasringnar/article/details/113486916</guid><author>haeasringnar</author><pubDate>Sun, 31 Jan 2021 22:45:40 +0800</pubDate><description><![CDATA[在做数据分析时可能会需要很多数据来做测试，但数据并不是每次都能找到合适的，所以可以通过一些方法生成一些数据来做计算，可以根据自己的需求来生成需要的数据。
实现方式就是利用多进程多线程来并发的生成数据，主要用于生成大量数据集的数据CSV文件
主要代码如下：
# create_data_util.py
import time
import random
from multiprocessing import Process, Manager, Pool
from threading import Thread
]]></description><category></category></item><item><title><![CDATA[使用 influxdb 包向 influxdb 数据库批量插入csv中的数据]]></title><link>https://blog.youkuaiyun.com/haeasringnar/article/details/111995435</link><guid>https://blog.youkuaiyun.com/haeasringnar/article/details/111995435</guid><author>haeasringnar</author><pubDate>Wed, 30 Dec 2020 19:40:33 +0800</pubDate><description><![CDATA[1、安装相关的包
pip install influxdb==5.3.1
pip install pandas==1.1.3

2、具体代码
先准备一个csv的数据文件 命名为test.csv
脚本会将csv中的数据批量插入到influxdb数据库
import csv
from influxdb import InfluxDBClient
import os
import json
import time
import datetime

def main():
	# 连接influxdb数据库
    ]]></description><category></category></item><item><title><![CDATA[Python 使用xlwt xlrd 读写表格数据]]></title><link>https://blog.youkuaiyun.com/haeasringnar/article/details/110331205</link><guid>https://blog.youkuaiyun.com/haeasringnar/article/details/110331205</guid><author>haeasringnar</author><pubDate>Sun, 29 Nov 2020 16:55:04 +0800</pubDate><description><![CDATA[1、安装相关包
pip install xlrd xlwt

2、使用xlwt写表格数据
import xlwt


def main():
    init_data1 = {
        "姓名": ['张三', '李四', '王五', '王二'], 
        "年龄": [23, 22,12,43], 
    }
    book = xlwt.Workbook(encoding="utf-8",style_compression=0)
    sheet1 = book.add_she]]></description><category></category></item><item><title><![CDATA[总结：Python 轻量级序列化和反序列化包 marshmallow 详细使用指南]]></title><link>https://blog.youkuaiyun.com/haeasringnar/article/details/109339949</link><guid>https://blog.youkuaiyun.com/haeasringnar/article/details/109339949</guid><author>haeasringnar</author><pubDate>Wed, 28 Oct 2020 18:55:58 +0800</pubDate><description><![CDATA[第一部分、marshmallow 基本的数据类型及基础属性介绍
1、基础数据类型
fields.String(*, default, missing, data_key, …) 字符串类型
fields.UUID(*, default, missing, data_key, …) UUID字符串类型
fields.Integer(*, strict, **kwargs) 整数类型
fields.Decimal(places, rounding, *, allow_nan, …) 支持Python中的deci]]></description><category></category></item><item><title><![CDATA[Python 基于Redis实现一个分布式读写锁]]></title><link>https://blog.youkuaiyun.com/haeasringnar/article/details/108342984</link><guid>https://blog.youkuaiyun.com/haeasringnar/article/details/108342984</guid><author>haeasringnar</author><pubDate>Tue, 01 Sep 2020 15:45:40 +0800</pubDate><description><![CDATA[1、简述出现背景
Python 基于redis实现一个简单的分布式锁
Python 基于Redis实现一个分布式可重入锁
在前面实现了简单分布式锁是用来解决分布式场景下的并发写数据问题，分布式可重入锁是用来解决并发场景下同一线程下再次或多次获得锁的问题。
那么分布式读写锁又是解决什么问题的呢？
首先来理解下概念，读写锁其实可以拆分为读锁和写锁，又称共享锁和排它锁，没错，和MySQL中的共享锁、排它锁几乎是同一个东西。那可能就有同学要问了，既然MySQL有，还用Redis实现干什么，因为Redis足够快。
它]]></description><category></category></item><item><title><![CDATA[Python 基于Redis实现一个分布式可重入锁]]></title><link>https://blog.youkuaiyun.com/haeasringnar/article/details/108342386</link><guid>https://blog.youkuaiyun.com/haeasringnar/article/details/108342386</guid><author>haeasringnar</author><pubDate>Tue, 01 Sep 2020 15:20:00 +0800</pubDate><description><![CDATA[1、简述出现背景
Python 基于redis实现一个简单的分布式锁
前面实现了一个简单的分布式锁，它在某些场景下可以有效的处理并发写数据问题。但是如果我们在某个线程中需要二次或多次获得同一个锁，这个分布式锁就会出现死锁，一直等待第一个加锁逻辑结束后才能继续进行，并且会直接导致当前的业务逻辑的异常和超时。因此还需要实现一种分布式可重入锁，来应对这种场景。
2、简述原理
简述一下可重入锁实现原理：首先在加锁时，进行判断是否能获得锁，如果获得锁，那么此时维护一个计数器，并在获得锁时设置计数器值为0。然后如果是同]]></description><category></category></item><item><title><![CDATA[Tornado 实践：基于 Peewee、Marshmallow、Aioredis 实现用户登录注册接口]]></title><link>https://blog.youkuaiyun.com/haeasringnar/article/details/108330618</link><guid>https://blog.youkuaiyun.com/haeasringnar/article/details/108330618</guid><author>haeasringnar</author><pubDate>Mon, 31 Aug 2020 22:08:42 +0800</pubDate><description><![CDATA[1、首先看下需要的目录结构
auth_demo/
├── apps
│   ├── __init__.py
│   └── public
│   	   ├── handler.py
│   	   ├── __init__.py
│   	   ├── models.py
│   	   ├── schemas.py
│   	   ├── tests.py
│   	   └── urls.py
├── base
│   ├── handler.py
│   ├── __init__.py
│   ├─]]></description><category></category></item><item><title><![CDATA[Tornado 实践：简介及初步使用Tornado]]></title><link>https://blog.youkuaiyun.com/haeasringnar/article/details/108296238</link><guid>https://blog.youkuaiyun.com/haeasringnar/article/details/108296238</guid><author>haeasringnar</author><pubDate>Sat, 29 Aug 2020 16:34:16 +0800</pubDate><description><![CDATA[1、Tornado 是什么
Tornado 是一个 Python Web 框架和异步网络库，最初由 FriendFeed 开发。 通过使用非阻塞网络 I/O，Tornado 可以扩展到成千上万的开放连接，非常适合长时间轮询，WebSocket 和需要与每个用户建立长期连接的其他应用程序。Tornado 出现的目的在于解决高并发场景下的稳定性和性能问题。Tornado 提供了一个 HttpServer，在 Tornado 6.x 版本中，使用了最新的异步 IO 库，使该服务器的性能大大提高。它使用非阻塞网络 ]]></description><category></category></item><item><title><![CDATA[Python 使用unittest进行接口测试]]></title><link>https://blog.youkuaiyun.com/haeasringnar/article/details/107850078</link><guid>https://blog.youkuaiyun.com/haeasringnar/article/details/107850078</guid><author>haeasringnar</author><pubDate>Thu, 06 Aug 2020 21:38:40 +0800</pubDate><description><![CDATA[1、准备发起请求的类
本例的目录结构如下
tests/
├── request_obj.py
├── run_test.py
└── test_public.py

本例使用requests库封装一个请求的类来使用
首先安装requests库
pip install requests

下面就来创建一个文件，命名为request_obj.py，输入一下内容：
import requests
import os
import json
import random
from io import BytesIO
]]></description><category></category></item><item><title><![CDATA[Django 使用内置的单元测试]]></title><link>https://blog.youkuaiyun.com/haeasringnar/article/details/107774283</link><guid>https://blog.youkuaiyun.com/haeasringnar/article/details/107774283</guid><author>haeasringnar</author><pubDate>Mon, 03 Aug 2020 22:02:11 +0800</pubDate><description><![CDATA[1、在你的app内的tests.py文件内添加测试用例代码
本例的代码结构如下：

由于我的app较多，也为了方便管理，我将app统一放在了apps目录下，想要达到这样的效果，只需在settings.py配置文件中增加以下代码
...
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file_]]></description><category></category></item><item><title><![CDATA[Python 实用的序列化和反序列化包marshmallow的使用指南]]></title><link>https://blog.youkuaiyun.com/haeasringnar/article/details/107674878</link><guid>https://blog.youkuaiyun.com/haeasringnar/article/details/107674878</guid><author>haeasringnar</author><pubDate>Fri, 31 Jul 2020 22:26:07 +0800</pubDate><description><![CDATA[marshmallow是一个非常实用的序列化和反序列化框架，由于使用简单、功能丰富被很多开发人员使用，结合Flask或Tornado，可以很轻松使开发人员在开发RESTful风格的API。
下面结合peewee的model来讲解marshmallow的使用
假设有这样两个model
class Group(BaseModel):
group_type_choices = (
(‘SuperAdmin’, ‘超级管理员’),
(‘Admin’, ‘管理员’),
(‘NormalUser’, ‘普通用户’),
]]></description><category></category></item><item><title><![CDATA[Python 轻量级ORM框架Peewee的使用指南]]></title><link>https://blog.youkuaiyun.com/haeasringnar/article/details/107674096</link><guid>https://blog.youkuaiyun.com/haeasringnar/article/details/107674096</guid><author>haeasringnar</author><pubDate>Wed, 29 Jul 2020 20:39:42 +0800</pubDate><description><![CDATA[1、基础：
初始化数据库：
db = MySQLDatabase('database_name', user='www-data', charset='utf8mb4')

创建model：
class BaseModel(Model):
    class Meta:
        database = db

class User(BaseModel):
    name = CharField(unique = True)
    age = IntegerField()
    sex = Cha]]></description><category></category></item><item><title><![CDATA[Python3 元类编程]]></title><link>https://blog.youkuaiyun.com/haeasringnar/article/details/107050917</link><guid>https://blog.youkuaiyun.com/haeasringnar/article/details/107050917</guid><author>haeasringnar</author><pubDate>Tue, 30 Jun 2020 21:47:06 +0800</pubDate><description><![CDATA[在Python中一切接对象，类也是一个对象，所有的类都是有type类创建，我们实际开发中最常用的type方法，是用来获取某个对象的类型的，例如type(1) ⇒ int 、type(‘str’) ⇒ str。但是type还有一种用法，就是用来创建类的。
1、通过type动态创建无父类、无属性的类
People = type('People', (), {})

p = People()
print(p)

2、通过type动态创建有父类、无属性的类
class Animal(object):
    nam]]></description><category></category></item></channel></rss>