xToolkit


NamexToolkit JSON
Version 0.0.89 PyPI version JSON
download
home_pagehttps://github.com/xionglihong/xToolkit
Summary
upload_time2023-11-22 09:23:08
maintainer
docs_urlNone
authorxionglihong
requires_python
licenseGNU General Public License v3.0
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 1 什么是xToolkit库

库xToolkit的中文名字叫X工具集.是python内置库的一个扩展库.把python的datetime,string,list,dist,xthread等数据结构进行了系统库功能的扩展。

安装方法(利用阿里云的pypi源安装会比默认的pypi快很多):

```shell
pip install xToolkit -i https://mirrors.aliyun.com/pypi/simple/
```

备用安装方法(由于国内几个源同步pypi源的频率都不同,如果这个频率慢了,就换其他的):

```shell
# 豆瓣源
pip install xToolkit  -i  http://pypi.douban.com/simple --trusted-host pypi.douban.com
```

升级方法(利用阿里云的pypi源安装会比默认的pypi快很)

```
pip install --upgrade xToolkit -i https://mirrors.aliyun.com/pypi/simple/
```

导入方法:

```shell
from xToolkit import xstring, xdatetime, xthreading, xlise, xfile
```

本库使用到了第三库 python-dateutil,jieba,numpy,pandas,emoji,在安装本库的时候会自动安装,不过其中有几个库比较大,可以提前安装好,这样可以避免安装第三方库的时候安装出错。

# 2 适用对象

- 适用对象:python工程师
- 作者:熊利宏
- 邮箱:xionglihong@163.com
- 有任何意见欢迎发送邮件,我们一起打造一个好用的python内置库的扩展库
- [操作文档CSDN地址:https://blog.csdn.net/qq_22409661/article/details/108531485](https://blog.csdn.net/qq_22409661/article/details/108531485)

# 3 怎么使用xToolkit呢?

## 3.1 时间模块 xdatetime模块

### 3.1.1 判断时间格式时分是否正确

支持判断的类型包括 date,datetime,time,int,float,str 其他类型默认为False

```python
xdatetime.shape("2020-03-23 00:00:00")
>> True

xdatetime.shape(25251425)
>> True

xdatetime.shape(253698.25)
>> True

xdatetime.shape("2020-03-")
>> False

xdatetime.shape("english")
>> False

xdatetime.shape("我是一个兵")
>> False

xdatetime.shape("258741")
>> True

xdatetime.shape("2020/03/20T10:09:06.252525+0800")
>> True

xdatetime.shape(datetime.datetime(2020, 9, 29, 8, 12))
>> True

xdatetime.shape(datetime.date(2020, 9, 29))
>> True

xdatetime.shape(datetime.time(8, 9, 29))
>> True
```

### 3.1.2 get方法创建对象

利用get方法可以创建时间对象,并且创建的方法还比较多,可以传入时间戳,时间字符串,datetime对象,date对象等

```python
# 时间戳方法
xdatetime.get(98787987)
>> 1973 - 02 - 17
T17: 06:27 + 0
8: 00
```

```python
# 字符串方式
xdatetime.get("1988-07-20")
>> 1988 - 07 - 20
T00: 00:00

xdatetime.get("2020-09-22-10-06-14")
>> 2020 - 0
9 - 22
T10: 06:14
```

```python
# datetime对象
xdatetime.get((datetime(2020, 3, 23, 21, 56, 12))
              >> 2020 - 03 - 23
T21: 56:12
```

```python
# date对象等
xdatetime.get(date(2020, 3, 23))
>> 2020 - 03 - 23
T00: 00:00
```

### 3.1.3 获取时间戳

获取当前时间戳

```python
# 此方法获取的时间戳没有微妙部分,如果需要获取微妙部分,用time.time()
xdatetime.get().timestamp
>> 1585833834.0
```

获取指定时间的时间戳

```python
xdatetime.get("2020-04-02 21:26:54").timestamp
>> 1585834014.0
```

### 3.1.4 获取年月日时分秒

获取日期时间元素,年月日时分秒,微妙

```python
# 年
xdatetime.get().year
>> 2020
```

```python
# 月
xdatetime.get().month
>> 4
```

```python
# 日
xdatetime.get().day
>> 2
```

```python
# 时
xdatetime.get().hour
>> 21
```

```python
# 分
xdatetime.get().minute
>> 37
```

```python
# 秒
xdatetime.get().second
>> 48
```

```python
# 微妙
xdatetime.get().microsecond
>> 70815
```

```python
# 星期
xdatetime.get().weekday
# 返回数字 1-7代表周一到周日
>> 5
```

```python
# 周
xdatetime.get().weed
# 返回整数代表当前是本年第多少个周
>> 35
```

```python
# 季
xdatetime.get().quarter
# 返回整数代表当前是本年第几个季度
>> 3
```

### 3.1.5 时间推移

shift方法获取某个时间之前或之后的时间,关键字参数:years, months, days, hours,minutes,seconds,microseconds, weeks

```python
# 一年以前
xdatetime.get().shift(years=-1)
>> 2019 - 04 - 03
T21: 10:49.095790 + 0
8: 00
```

```python
# 一年以后
xdatetime.get().shift(years=1)
>> 2021 - 04 - 03
T21: 10:49.095790 + 0
8: 00
```

```python
# 一个月之后
xdatetime.get().shift(months=1)
>> 2020 - 05 - 03
T21: 12:17.332790 + 0
8: 00
```

```python
# 一天以后
xdatetime.get().shift(days=1)
>> 2020 - 04 - 04
T21: 14:30.914443 + 0
8: 00
```

```python
#一个小时以后
xdatetime.get().shift(hours=1)
>> 2020 - 04 - 03
T22: 14:08.301192 + 0
8: 00
```

```python
# 一分钟以后
xdatetime.get().shift(minutes=1)
>> 2020 - 04 - 03
T21: 17:27.956196 + 0
8: 00
```

```python
#一秒钟以后
xdatetime.get().shift(seconds=1)
>> 2020 - 04 - 03
T21: 16:45.380686 + 0
8: 00
```

```python
#一毫秒以后
xdatetime.get().shift(microseconds=1)
>> 2020 - 04 - 03
T21: 16:58.252929 + 0
8: 00
```

```python
#一周以后
xdatetime.get().shift(weeks=1)
>> 2020 - 04 - 10
T21: 17:11.827210 + 0
8: 00
```

### 3.1.6 时间替换

替换datetime对象,年月日时分秒某一部分,返回一个被替换后的datetime对象,原对象不变关键字参数:year, month, day, hour,minute,second,microsecond

```python
# 把年替换会成2018
xdatetime.get().replace(year=2018)
>> 2018 - 04 - 03
T21: 23:42.819295 + 0
8: 00
```

```python
# 把月替换会成10
xdatetime.get().replace(month=10)
>> 2018 - 10 - 03
T21: 23:42.819295 + 0
8: 00
```

```python
# 把日替换会成7
xdatetime.get().replace(day=7)
>> 2018 - 04 - 07
T21: 23:42.819295 + 0
8: 00
```

```python
# 把时替换会成22
xdatetime.get().replace(hour=22)
>> 2018 - 04 - 03
T22: 23:42.819295 + 0
8: 00
```

```python
# 把分替换会成21
xdatetime.get().replace(minute=21)
>> 2018 - 04 - 03
T21: 21:42.819295 + 0
8: 00
```

```python
# 把秒替换会成21
xdatetime.get().replace(second=21)
>> 2018 - 04 - 03
T21: 23:21.819295 + 0
8: 00
```

### 3.1.7 时间扩展部分

#### 3.1.7.1 二个时间的差值

计算二个时间的差值,返回值为秒数,传入的二个时间格式包括,时间字符串,datetime,时间戳等

```python
xdatetime.get("2020-04-28 10:52:52", "1988-07-20 17:31:12").how
>> 1002648100
```

```python
xdatetime.get("2020-04-28", "1988-07-20 17:31:12").how
>> 1002608928
```

```python
xdatetime.get("1975-04-28 14:14:55", "1988-07-20 17:31:12").how
>> -417496577
```

#### 3.1.7.2 开始与结束时间

- 返回 指定时间中,年,月,周的开始时间和结束时间
- 类型genre Y->年,M->月,W->周
- 第一个参数:年
- 第二个参数:年月类型中,代表月,周类型代表周数

```python
# 年(当genre为年时,月失效)
xdatetime.get(2020, 0, genre="Y").begin_end
>> ['2020-01-01', '2020-12-01']

xdatetime.get(2021, 0, genre="Y").begin_end
>> ['2021-01-01', '2021-12-01']
```

```python
# 月
xdatetime.get(2020, 8, genre="M").begin_end
>> ['2020-08-01', '2020-08-31']

xdatetime.get(2021, 5, genre="M").begin_end
>> ['2021-05-01', '2021-05-31']
```

```python
# 周
xdatetime.get(2020, 35, genre="W").begin_end
>> ['2020-08-24', '2020-08-30']

xdatetime.get(2021, 45, genre="W").begin_end
>> ['2021-11-08', '2021-11-14']
```

```python
# 季
xdatetime.get(2020, 1, genre="Q").begin_end
>> ['2020-01-01', '2020-03-31']

xdatetime.get(2021, 2, genre="Q").begin_end
>> ['2021-04-01', '2021-06-30']

xdatetime.get(2020, 3, genre="Q").begin_end
>> ['2020-07-01', '2020-09-30']

xdatetime.get(2021, 4, genre="Q").begin_end
>> ['2021-10-01', '2021-12-31']
```

#### 3.1.7.3 时间是否在指定时间区间中

- 计算时间是否在指定的时间区间内,返回值为bool型
- 需要传入二个参数,第一个为需要验证的字符串,第二个是一个时间列表,里面包含二个时间,开始时间和结束时间

```python
xdatetime.get("2027-04-01", ["1988-04-14", "2020-05-14"]).middle
>> False
```

```python
xdatetime.get("2020-04-15", ["2020-04-14", "2020-05-14 12:12:14"]).middle
>> True
```

## 3.2 字符串模块xstring

### 3.2.1 字符串格式效验

进行字符串格式效验,包括车牌格式,身份证号码,整形或浮点型,时间字符串,URL地址,手机号,银行卡,用户姓名,密码,邮箱,工号。

```python
# 车牌号
xstring.check("鄂A96288").is_car_number
>> True
```

```python
# 身份证号码
# 提供中国大陆身份证验证,暂时只支持效验18位身份证
xstring.check("110101199003072316").is_identity_card
>> True
```

```python
# 整形或浮点型
xstring.check("12.5").is_int_or_float
>> True
```

```python
# 时间字符串
xstring.check("1988-07-20").is_datetime_string
>> True
```

```python
# URL地址
xstring.check("https://wwww.baidu.com").is_url
>> True
```

```python
# 手机号
xstring.check("15172383635").is_phone
>> True
```

```python
# 银行卡
xstring.check("6222600260001072444").is_bank_number
>> True
```

```python
# 用户姓名
# 姓名要求为2-4个中文
xstring.check("熊利宏").is_user_name
>> True
```

```python
# 密码
# 包含6-18位字符,必须包含字母与数字,可以包含特殊字符
xstring.check("xlh123456").is_user_password
>> True
```

```python
# 邮箱
# 第一种:只允许英文字母、数字、下划线、英文句号、以及中划线组成
# 第二种:名称允许汉字、字母、数字,域名只允许英文域名
xstring.check("xionglihong@163.com").is_mailbox
>> True
```

```python
# 工号
# 工号格式为 4个大写字母+8位数字
xstring.check("HBBZ00000001").is_job
>> True
```

### 3.2.2 字符串处理

##### 3.2.2.1 身份证号码处理

进行字符串处理,比如从身份证提取生日号码,性别等操作

```python
xstring.dispose("11010119900307053X").get_identity_card(True)
>> {'code': '0000', 'msg': '身份证格式正确', 'data': {'age': '31', 'birthday': '1990-03-07', 'gender': '男'}}
```

##### 3.2.2.2 split 多标签分割

```python
# 主要解决了系统模块split只能用一个分隔符
xstring.dispose("abc,我的-他的,1245*ss").split([",", "-", "*"])
>> ['abc', '我的', '他的', '1245', 'ss']
```

##### 3.2.2.3 strip多字符串过滤

```python
# 如果不传过滤参数,默认去掉所有空格
xstring.dispose("          鄂 A9 62 --8 8---__  ").strip()
>> 鄂A962 - -88 - --__
```

```python
xstring.dispose("          鄂 A9 62 --8 8---__  ").strip([" ", "-", "_"])
>> 鄂A96288
```

##### 3.2.2.4 把字符串转换为emoji表情

```python
xstring.dispose('Python is :thumbs_up:').string_to_emoji()
>> Python is 👍
```

##### 3.2.2.5 emoji表情转字符串

```python
xstring.dispose('Python is 👍').emoji_to_string()
>> Python is: thumbs_up:
```

##### 3.2.2.6 中文分词

```python
# 分词对象 中国人民解放军海军工程大学

# 全模式:把文本中所有可能的词语都扫描出来,有冗余 cut_all=True
# ['中国', '中国人民解放军', '中国人民解放军海军', '国人', '人民', '人民解放军', '解放', '解放军', '海军', '海军工程大学', '军工', '工程', '大学']
# 精确模式:把文本精确的切分开,不存在冗余单词 cut_all=False
# ['中国人民解放军', '海军工程大学']
# 默认为精确模式

# 精确模式
xstring.dispose('中国人民解放军海军工程大学').part(cut_all=False)
>> ['中国人民解放军', '海军工程大学']

# 全模式
xstring.dispose('中国人民解放军海军工程大学').part(cut_all=True)
>> ['中国', '中国人民解放军', '中国人民解放军海军', '国人', '人民', '人民解放军', '解放', '解放军', '海军', '海军工程大学', '军工', '工程', '大学']
```

##### 3.2.2.7 金额人性化

```python
# 金额人性化,保留二位小数

xstring.dispose(3.0).humanized_amount()
xstring.dispose("3.0").humanized_amount()
xstring.dispose(37787841.902).humanized_amount()
xstring.dispose("37787841.9882").humanized_amount()
xstring.dispose(378978989).humanized_amount()
xstring.dispose("378978989").humanized_amount()

>> 3.00
>> 3.00
>> 37, 787, 841.90
>> 37, 787, 841.99
>> 378, 978, 989.00
>> 378, 978, 989.00
```

### 3.2.3 字符串高级格式校验

本模块主要用于项目中入参模块对用户输入的参数进行校验,校验成功返回用户输入的值,校验失败返回Flash

```python
# 参数校验
class ParameterVerifyData(object):
    """
    参数校验
    """

    def __call__(self, request, parameter, **kwargs):
        """
        is_blank 如果为True代表如果用户传值,就进行校验,如果传空,值就为空
        """
        method = kwargs["method"] if kwargs.get("method") else "POST"

        # 参数
        if method == "POST":
            parameter = request.POST.get(parameter, None)
        else:
            parameter = request.GET.get(parameter, None)

        return xstring.formative(parameter, **kwargs)


# 参数校验
ParameterVerify = ParameterVerifyData()
```

ParameterVerify从本质上调用xstring.formative(parameter, **kwargs)

```python
    # 查询订单列表
@staticmethod
def select_order_list(request):
    """
    查询订单列表
    """
    # 参数校验
    parameter = {
        "rests_license": ParameterVerify(request, "rests_license", rule="is_url_list"),
        "limit": ParameterVerify(request, "limit", rule="is_int"),
        "shopping_sign": ParameterVerify(request, "shopping_sign", rule="casual"),  # 商店标识
        "title": ParameterVerify(request, "title", rule="casual"),
        "distribution": ParameterVerify(request, "distribution", rule="is_choices", choices=["快递", "线下取货"]),
        "phoenix": ParameterVerify(request, "cn123451", regular="cn\d{6}(?!\d)"),  # 微鳯号
    }

    for key, item in parameter.items():
        if item is False:
            return GlobalReturn(code=10001, msg="{}为{},格式错误".format(key, item))

    return GlobalReturn(**OperationOrderForm().select_order_list(request=request, **parameter))
```

支持的校验类型为:

| 校验类型           | 关键字           | 说明                                           |
| -------------- | ---------------- | ---------------------------------------------- |
| is_car_number  | 车牌号           |                                                |
| is_identity_card | 身份证           |                                                |
| is_int_or_float | 整形或浮点型     |                                                |
| is_int         | 整形             |                                                |
| is_datetime_string | 时间字符串       |                                                |
| is_url         | url地址          |                                                |
| is_phone       | 手机号           |                                                |
| is_bank_number | 银行卡           |                                                |
| is_user_name   | 用户姓名         |                                                |
| is_user_password | 密码             |                                                |
| is_mailbox     | 邮箱             |                                                |
| is_json        | json             |                                                |
| is_choices     | 枚举格式         |                                                |
| is_job         | 工号             |                                                |
| is_ip_address  | ip地址           |                                                |
| is_phoenix     | 微鳯号           |                                                |
| is_verification_code | 验证码           |                                                |
| is_version     | 版本号           |                                                |
| is_contact_information | 电话号码         | 包括中国大陆的手机号码和固定电话号码           |
| is_longitude | 经度 | 经度的范围在-180到180之间 |
| is_latitude | 纬度 | 纬度的范围在-90到90之间 |
| is_longitude_latitude | 经纬度 | 经度的范围在-180到180之间,其中纬度的范围在-90到90之间 |
| is_latitude_longitude | 纬经度 | 其中纬度的范围在-90到90之间,经度的范围在-180到180之间 |
| is_car_number_list | 车牌号列表       | 列表的每一个值为车牌号,以下同理 |
| is_identity_card_list | 身份证列表       |                                                |
| is_int_or_float_list | 整形或浮点型列表 |                                                |
| is_int_list    | 整形列表         |                                                |
| is_datetime_string_list | 时间字符串列表   |                                                |
| is_url_list    | url地址列表      |                                                |
| is_phone_list  | 手机号列表       |                                                |
| is_bank_number_list | 银行卡列表       |                                                |
| is_user_name_list | 用户姓名列表     |                                                |
| is_user_password_list | 密码列表         |                                                |
| is_mailbox_list | 邮箱列表         |                                                |
| is_json_list   | json列表         |                                                |
| is_ip_address_list | ip地址列表       |                                                |
| is_longitude_latitude_list | 经纬度列表       |                                                |
| is_phoenix_list    | 微鳯号列表       |                                                |
| is_verification_code_list | 验证码列表       |                                                |
| is_version_list    | 版本号列表       |                                                |
| is_contact_information_list | 电话号码列表     |                                                |
| is_casual_list | 任意列表         | 列表里面的值不进行校验,只能确保整体是一个列表 |

参数说明 xstring.formative(parameter, **kwargs):

- parameter 为需要校验的参数名称
- is_blank 是否可以为空,如果可以为空,不进行规则校验,直接返回空字符串,如果用户传了,就进行规则校验
- rule 为正则标识,如果rule为is_choices,必须传choices,choices为枚举值,choices的类型为列表
- regular 为自定义正则表达式,如果传入自定义正则表达式就使用用户的正则表达式

## 3.3 多线程模块xthread

### 3.3.1 多线程模块

把多个函数放入多线程模块

```python
# 函数一
def function_1(a, b, c):
    time.sleep(1)
    return a * 2, b * 2, c * 2


# 函数二
def function_2(a, b):
    time.sleep(1)
    return a * 2, b * 2


# 函数三
def function_3(a):
    time.sleep(1)
    return a * 2


# 函数四
def function_4():
    time.sleep(1)
    return 0


st = time.time()
result = xthreading([function_1, 1, 1, 1], [function_2, 2, 2], [function_3, 2], [function_4])
print(result[0])
print(result[1])
print(result[2])
print(result[3])
et = time.time()
print("运行时间:{}".format(et - st))

>> (2, 2, 2)
>> (4, 4)
>> 4
>> 0
>> 运行时间:1.0010571479797363

# 从上面的运行时间可以看出,如果单线程执行应该是4秒以上,结果为1秒,说明运行时是多线程运行
```

## 3.4 列表模块xlist

### 3.4.1 值的频率

```python
# 计算列表中值的频率
xlise.basics(["武汉", "武昌", "武汉", "无聊", "五菱", "武昌"]).values_count()
>> {'武昌': 2, '武汉': 2, '五菱': 1, '无聊': 1}
```

### 3.4.2 字典列表值替换

```python
# 1.字典型列表的值整体替换
# 2.要求传入参数格式为 [{"id": None, "name": "wuhan"}, {"id": 5, "name": "中国"}, {"id": 25, "name": "上号"}, {"id": 5, "name": "测试"}]
# 3.这种形状的参数即可,比如可以传入 django 的 QuerySet 等
# 4.参数:
#    1.需要替换的对象
#    2.kwargs["rules"] 要求元祖,比如 ((None, ''), (45, 47)))

value = [{"id": None, "name": "wuhan"}, {"id": 5, "name": "中国"}, {"id": 25, "name": "上号"}, {"id": 5, "name": "测试"}]
xlise.basics(value).dict_to_value(rules=((None, ''), ("中国", "china")))
>> [{'id': '', 'name': 'wuhan'}, {'id': 5.0, 'name': 'china'}, {'id': 25.0, 'name': '上号'}, {'id': 5.0, 'name': '测试'}]
```

## 3.5 文件模块xfile

### 3.5.1 excel转dict

导入的excel表格的格式是这样的:

![excel表格格式](https://img-blog.csdnimg.cn/20200917213012349.png#pic_center)

#### 3.5.1.1 基本用法

```python
# excel转dict

# 1.传来的文件可以是文件路径,也可以是二进制文件
# 2.传来的可以是二进制文件,这里以django接收前端传来文件为例:
#     接收用 request.FILES.get("fileName", None) 传入 my_file 即可

# kwargs接收的参数有:
# sheet索引,0代表第一个表,1代表第二个表,默认0
# max表格最大的行数,默认2000行
# min表格最小的行数,默认1行
# title 表头(用于表头校验)

# 表头为选填,如果不填,不进行表头校验
xfile.read("./result/t_excel.xls").excel_to_dict()
>> [{'编号': 1, '时间': '1988-07-21 00:00:00', '年龄': 1, '分数': 63.2, '总分': 1},
    {'编号': 2, '时间': '1988-07-21 00:00:00', '年龄': 1, '分数': 63.2, '总分': 1},
    {'编号': 3, '时间': '1988-07-21 00:00:00', '年龄': 1, '分数': 63.2, '总分': 1},
    {'编号': 4, '时间': '1988-07-21 00:00:00', '年龄': 1, '分数': 63.2, '总分': 1},
    {'编号': 5, '时间': '1988-07-21 00:00:00', '年龄': 1, '分数': 63.2, '总分': 1},
    {'编号': 6, '时间': '1988-07-21 00:00:00', '年龄': 1, '分数': 63.2, '总分': 1}
    ]
```

#### 3.5.1.2 校验表头再进行读取

错误的表头是这样的:

![excel表格格式(错误的表头)](https://img-blog.csdnimg.cn/20200930112459173.png#pic_center)

```python
xfile.read("./result/t_excel.xls").excel_to_dict(title=["编号", "时间", "年龄", "分数", "总分"])
>> {'code': '0001', 'data': {'data': None}, 'msg': '表头第 3 列错误,错误值为 年龄1 应该为 年龄'}
```

## 3.6 大杂烩模块xfile

### 3.6.1 经纬度计算二点距离

```python
# 参数格式:(纬度,经度),(3.6546879, 4.5879546), (6.5879546, 5.1123654)
xhotchpotch.distance_hav((3.6546879, 4.5879546), (6.5879546, 5.1123654))
>> 331293.8566141046
```

# 4 升级日志

2019年05年10日 V0.0.10

- xToolkit 上线啦
- 新增获取当前时间功能

2019年05年16日 V0.0.12

- 新增格式化时间format功能,更人性化的输出时间格式
- 新增推移时间功能
- 新增替换时间功能
- 新增判断时间格式是否正确功能
- 新增获取时间区间功能

2019年06月11日 V0.0.21

- 新增字符串效验功能

2019年08月20日 v0.0.25

- 新增中国居民身份证效验功能
- 新增中国大陆手机号码效验功能
- 新增数字效验功能

2019年09月02日 v0.0.30

- 新增浮点数,银行卡效验

2020年05月28日 v0.0.43

- 新增字符串 split多分割标识

2020年06月06日 v0.0.46

- 修护获取指定月最后一天,输入整数型字符串报错的BUG
- 新增判断整数,扩充了string.isdigit()

2020年06月22日 v0.0.47

- 新增字符串 strip多过滤标识

2020年06月28日 v0.0.48

- 修改了手机号格式判断如果为纯数字报错的BUG
- 新增多线程模块

2020年06月28日 v0.0.49

- 新增 指定时间中,年,月,周的开始时间和结束时间
- 获取时间元素中,新增 获取星期和周
- 新增 字符串转emoji表情
- 新增 emoji表情转字符串
- 新增 中文分词(精确模式,全模式)
- 新增列表模块
- 新增列表模块 计算值的频率功能

2020年06月28日 v0.0.50

- 新增 字符串格式校验加入工号格式校验

2020年09月10日 v0.0.62

- 修护 第三依赖库不自动安装的BUG

2020年09月16日 v0.0.63

- 新增文件模块
- 新增文件模块读取功能
- 新增excel转dict功能

2020年09月19日 V0.0.64

- 新增数字人性化

2020年09月20日 V0.0.65

- xdatetime 返回当前季度(1-4季度)
- 输入年,季度,返回季度的开始日期和结束日期
- 数字人性化格式小数部分换成Decimal库实现

2020年09月21日 V0.0.66

- 文件读取功能,新增文件校验,在读取之前校验文件是否存在,和格式是否正确

2020年09月22日 V0.0.67

- 解决xdatetime.shape()传入None保存的BUG
- excel转dict加入表头校验功能
- 解决xdatetime.shape()传入date类型报错的bug

2020年09月30日 V0.0.68

- excel转dict表头校验功能描述错误,错误值与实际值反了
- 新增 字典型列表值整体替换功能

2021年03月08日 V0.0.71

- 修改numpy依赖库的最低版为1.20.3,因为1.19.4在windows平台上运行会报错

2021年04月15日 V0.0.72

- 身份证详情返回字段中,返回年龄字段

2021年06月09日 V0.0.73

- 新增 对象字符串转对象 功能
- 新增 对象转对象字符串 功能
- 新增 字节串和字符串 功能
- 新增 字符串和字节串 功能

2021年06月21日 V0.0.74

- 修改第三方库numpy为1.19.5,因为linux里面numpy最高版本为1.19.5
- 时间类新增高级时间戳功能,支持输出 秒级时间戳,毫秒级时间戳,微秒级时间戳

2022年07月06日 V0.0.75

- 去掉demjson第三方库,因为他不支持python >= 3.5,改用系统的ast
- 修改时间模块,计算开始时间与结束时间,输入参数为年,计算错误的BUG

2022年07月07日 V0.0.76

- 新增大杂烩模块
- 大杂烩模块新增计算经纬度二点距离功能

2022年08月16日 V0.0.77

- 新增字符串复合校验模块

2022年08月24日 V0.0.78

- 正则校验模块改为match

2022年08月24日 V0.0.83

- 复合参数校验添加ip地址校验

2023年05月17日 V0.0.84

- 复合参数校验添加自定义正则表达式校验

2023年05月17日 V0.0.85

- 加入微鳯号校验,经纬度格式校验,版本号,大陆联系号码正则表达式校验
- 密码校验改为必须包含数字和字母,可以包含字符,6到18位

2023年07月07日 V0.0.86

- 修改了邮箱的校验规则,邮箱前缀可以包含数字,大小写字母,+,-,_,汉字等
- 字符串校验解决传入None引起的报错

2023年07月28日 V0.0.87

- 修改经纬度校验的bug
- 新增 经度,维度,经纬度,纬经度 校验

2023年11月22日 V0.0.88

- 参数校验加入,为空校验并设置默认值

2023年11月22日 V0.0.89

- 加入复核校验里面的一些特殊情况

开发计划:

- 无
            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/xionglihong/xToolkit",
    "name": "xToolkit",
    "maintainer": "",
    "docs_url": null,
    "requires_python": "",
    "maintainer_email": "",
    "keywords": "",
    "author": "xionglihong",
    "author_email": "xionglihong@163.com",
    "download_url": "https://files.pythonhosted.org/packages/46/3a/cb6066748333ef187671d23bebc2b9c8e14d1230a66fe018140c6ccffb66/xToolkit-0.0.89.tar.gz",
    "platform": null,
    "description": "# 1 \u4ec0\u4e48\u662fxToolkit\u5e93\n\n\u5e93xToolkit\u7684\u4e2d\u6587\u540d\u5b57\u53eb\uff38\u5de5\u5177\u96c6\uff0e\u662fpython\u5185\u7f6e\u5e93\u7684\u4e00\u4e2a\u6269\u5c55\u5e93.\u628apython\u7684datetime,string,list,dist\uff0cxthread\u7b49\u6570\u636e\u7ed3\u6784\u8fdb\u884c\u4e86\u7cfb\u7edf\u5e93\u529f\u80fd\u7684\u6269\u5c55\u3002\n\n\u5b89\u88c5\u65b9\u6cd5(\u5229\u7528\u963f\u91cc\u4e91\u7684pypi\u6e90\u5b89\u88c5\u4f1a\u6bd4\u9ed8\u8ba4\u7684pypi\u5feb\u5f88\u591a)\uff1a\n\n```shell\npip install xToolkit -i https://mirrors.aliyun.com/pypi/simple/\n```\n\n\u5907\u7528\u5b89\u88c5\u65b9\u6cd5(\u7531\u4e8e\u56fd\u5185\u51e0\u4e2a\u6e90\u540c\u6b65pypi\u6e90\u7684\u9891\u7387\u90fd\u4e0d\u540c,\u5982\u679c\u8fd9\u4e2a\u9891\u7387\u6162\u4e86\uff0c\u5c31\u6362\u5176\u4ed6\u7684):\n\n```shell\n# \u8c46\u74e3\u6e90\npip install xToolkit  -i  http://pypi.douban.com/simple --trusted-host pypi.douban.com\n```\n\n\u5347\u7ea7\u65b9\u6cd5\uff08\u5229\u7528\u963f\u91cc\u4e91\u7684pypi\u6e90\u5b89\u88c5\u4f1a\u6bd4\u9ed8\u8ba4\u7684pypi\u5feb\u5f88\uff09\n\n```\npip install --upgrade xToolkit -i https://mirrors.aliyun.com/pypi/simple/\n```\n\n\u5bfc\u5165\u65b9\u6cd5\uff1a\n\n```shell\nfrom xToolkit import xstring, xdatetime, xthreading, xlise, xfile\n```\n\n\u672c\u5e93\u4f7f\u7528\u5230\u4e86\u7b2c\u4e09\u5e93 python-dateutil\uff0cjieba\uff0cnumpy\uff0cpandas\uff0cemoji\uff0c\u5728\u5b89\u88c5\u672c\u5e93\u7684\u65f6\u5019\u4f1a\u81ea\u52a8\u5b89\u88c5\uff0c\u4e0d\u8fc7\u5176\u4e2d\u6709\u51e0\u4e2a\u5e93\u6bd4\u8f83\u5927\uff0c\u53ef\u4ee5\u63d0\u524d\u5b89\u88c5\u597d\uff0c\u8fd9\u6837\u53ef\u4ee5\u907f\u514d\u5b89\u88c5\u7b2c\u4e09\u65b9\u5e93\u7684\u65f6\u5019\u5b89\u88c5\u51fa\u9519\u3002\n\n# 2 \u9002\u7528\u5bf9\u8c61\n\n- \u9002\u7528\u5bf9\u8c61\uff1apython\u5de5\u7a0b\u5e08\n- \u4f5c\u8005\uff1a\u718a\u5229\u5b8f\n- \u90ae\u7bb1\uff1axionglihong@163.com\n- \u6709\u4efb\u4f55\u610f\u89c1\u6b22\u8fce\u53d1\u9001\u90ae\u4ef6\uff0c\u6211\u4eec\u4e00\u8d77\u6253\u9020\u4e00\u4e2a\u597d\u7528\u7684python\u5185\u7f6e\u5e93\u7684\u6269\u5c55\u5e93\n- [\u64cd\u4f5c\u6587\u6863CSDN\u5730\u5740\uff1ahttps://blog.csdn.net/qq_22409661/article/details/108531485](https://blog.csdn.net/qq_22409661/article/details/108531485)\n\n# 3 \u600e\u4e48\u4f7f\u7528xToolkit\u5462\uff1f\n\n## 3.1 \u65f6\u95f4\u6a21\u5757 xdatetime\u6a21\u5757\n\n### 3.1.1 \u5224\u65ad\u65f6\u95f4\u683c\u5f0f\u65f6\u5206\u662f\u5426\u6b63\u786e\n\n\u652f\u6301\u5224\u65ad\u7684\u7c7b\u578b\u5305\u62ec date,datetime,time,int,float,str \u5176\u4ed6\u7c7b\u578b\u9ed8\u8ba4\u4e3aFalse\n\n```python\nxdatetime.shape(\"2020-03-23 00:00:00\")\n>> True\n\nxdatetime.shape(25251425)\n>> True\n\nxdatetime.shape(253698.25)\n>> True\n\nxdatetime.shape(\"2020-03-\")\n>> False\n\nxdatetime.shape(\"english\")\n>> False\n\nxdatetime.shape(\"\u6211\u662f\u4e00\u4e2a\u5175\")\n>> False\n\nxdatetime.shape(\"258741\")\n>> True\n\nxdatetime.shape(\"2020/03/20T10:09:06.252525+0800\")\n>> True\n\nxdatetime.shape(datetime.datetime(2020, 9, 29, 8, 12))\n>> True\n\nxdatetime.shape(datetime.date(2020, 9, 29))\n>> True\n\nxdatetime.shape(datetime.time(8, 9, 29))\n>> True\n```\n\n### 3.1.2 get\u65b9\u6cd5\u521b\u5efa\u5bf9\u8c61\n\n\u5229\u7528get\u65b9\u6cd5\u53ef\u4ee5\u521b\u5efa\u65f6\u95f4\u5bf9\u8c61\uff0c\u5e76\u4e14\u521b\u5efa\u7684\u65b9\u6cd5\u8fd8\u6bd4\u8f83\u591a\uff0c\u53ef\u4ee5\u4f20\u5165\u65f6\u95f4\u6233\uff0c\u65f6\u95f4\u5b57\u7b26\u4e32\uff0cdatetime\u5bf9\u8c61\uff0cdate\u5bf9\u8c61\u7b49\n\n```python\n# \u65f6\u95f4\u6233\u65b9\u6cd5\nxdatetime.get(98787987)\n>> 1973 - 02 - 17\nT17: 06:27 + 0\n8: 00\n```\n\n```python\n# \u5b57\u7b26\u4e32\u65b9\u5f0f\nxdatetime.get(\"1988-07-20\")\n>> 1988 - 07 - 20\nT00: 00:00\n\nxdatetime.get(\"2020-09-22-10-06-14\")\n>> 2020 - 0\n9 - 22\nT10: 06:14\n```\n\n```python\n# datetime\u5bf9\u8c61\nxdatetime.get((datetime(2020, 3, 23, 21, 56, 12))\n              >> 2020 - 03 - 23\nT21: 56:12\n```\n\n```python\n# date\u5bf9\u8c61\u7b49\nxdatetime.get(date(2020, 3, 23))\n>> 2020 - 03 - 23\nT00: 00:00\n```\n\n### 3.1.3 \u83b7\u53d6\u65f6\u95f4\u6233\n\n\u83b7\u53d6\u5f53\u524d\u65f6\u95f4\u6233\n\n```python\n# \u6b64\u65b9\u6cd5\u83b7\u53d6\u7684\u65f6\u95f4\u6233\u6ca1\u6709\u5fae\u5999\u90e8\u5206\uff0c\u5982\u679c\u9700\u8981\u83b7\u53d6\u5fae\u5999\u90e8\u5206\uff0c\u7528time.time()\nxdatetime.get().timestamp\n>> 1585833834.0\n```\n\n\u83b7\u53d6\u6307\u5b9a\u65f6\u95f4\u7684\u65f6\u95f4\u6233\n\n```python\nxdatetime.get(\"2020-04-02 21:26:54\").timestamp\n>> 1585834014.0\n```\n\n### 3.1.4 \u83b7\u53d6\u5e74\u6708\u65e5\u65f6\u5206\u79d2\n\n\u83b7\u53d6\u65e5\u671f\u65f6\u95f4\u5143\u7d20\uff0c\u5e74\u6708\u65e5\u65f6\u5206\u79d2\uff0c\u5fae\u5999\n\n```python\n# \u5e74\nxdatetime.get().year\n>> 2020\n```\n\n```python\n# \u6708\nxdatetime.get().month\n>> 4\n```\n\n```python\n# \u65e5\nxdatetime.get().day\n>> 2\n```\n\n```python\n# \u65f6\nxdatetime.get().hour\n>> 21\n```\n\n```python\n# \u5206\nxdatetime.get().minute\n>> 37\n```\n\n```python\n# \u79d2\nxdatetime.get().second\n>> 48\n```\n\n```python\n# \u5fae\u5999\nxdatetime.get().microsecond\n>> 70815\n```\n\n```python\n# \u661f\u671f\nxdatetime.get().weekday\n# \u8fd4\u56de\u6570\u5b57 1-7\u4ee3\u8868\u5468\u4e00\u5230\u5468\u65e5\n>> 5\n```\n\n```python\n# \u5468\nxdatetime.get().weed\n# \u8fd4\u56de\u6574\u6570\u4ee3\u8868\u5f53\u524d\u662f\u672c\u5e74\u7b2c\u591a\u5c11\u4e2a\u5468\n>> 35\n```\n\n```python\n# \u5b63\nxdatetime.get().quarter\n# \u8fd4\u56de\u6574\u6570\u4ee3\u8868\u5f53\u524d\u662f\u672c\u5e74\u7b2c\u51e0\u4e2a\u5b63\u5ea6\n>> 3\n```\n\n### 3.1.5 \u65f6\u95f4\u63a8\u79fb\n\nshift\u65b9\u6cd5\u83b7\u53d6\u67d0\u4e2a\u65f6\u95f4\u4e4b\u524d\u6216\u4e4b\u540e\u7684\u65f6\u95f4,\u5173\u952e\u5b57\u53c2\u6570\uff1ayears, months, days, hours\uff0cminutes\uff0cseconds\uff0cmicroseconds\uff0c weeks\n\n```python\n# \u4e00\u5e74\u4ee5\u524d\nxdatetime.get().shift(years=-1)\n>> 2019 - 04 - 03\nT21: 10:49.095790 + 0\n8: 00\n```\n\n```python\n# \u4e00\u5e74\u4ee5\u540e\nxdatetime.get().shift(years=1)\n>> 2021 - 04 - 03\nT21: 10:49.095790 + 0\n8: 00\n```\n\n```python\n# \u4e00\u4e2a\u6708\u4e4b\u540e\nxdatetime.get().shift(months=1)\n>> 2020 - 05 - 03\nT21: 12:17.332790 + 0\n8: 00\n```\n\n```python\n# \u4e00\u5929\u4ee5\u540e\nxdatetime.get().shift(days=1)\n>> 2020 - 04 - 04\nT21: 14:30.914443 + 0\n8: 00\n```\n\n```python\n#\u4e00\u4e2a\u5c0f\u65f6\u4ee5\u540e\nxdatetime.get().shift(hours=1)\n>> 2020 - 04 - 03\nT22: 14:08.301192 + 0\n8: 00\n```\n\n```python\n# \u4e00\u5206\u949f\u4ee5\u540e\nxdatetime.get().shift(minutes=1)\n>> 2020 - 04 - 03\nT21: 17:27.956196 + 0\n8: 00\n```\n\n```python\n#\u4e00\u79d2\u949f\u4ee5\u540e\nxdatetime.get().shift(seconds=1)\n>> 2020 - 04 - 03\nT21: 16:45.380686 + 0\n8: 00\n```\n\n```python\n#\u4e00\u6beb\u79d2\u4ee5\u540e\nxdatetime.get().shift(microseconds=1)\n>> 2020 - 04 - 03\nT21: 16:58.252929 + 0\n8: 00\n```\n\n```python\n#\u4e00\u5468\u4ee5\u540e\nxdatetime.get().shift(weeks=1)\n>> 2020 - 04 - 10\nT21: 17:11.827210 + 0\n8: 00\n```\n\n### 3.1.6 \u65f6\u95f4\u66ff\u6362\n\n\u66ff\u6362datetime\u5bf9\u8c61\uff0c\u5e74\u6708\u65e5\u65f6\u5206\u79d2\u67d0\u4e00\u90e8\u5206\uff0c\u8fd4\u56de\u4e00\u4e2a\u88ab\u66ff\u6362\u540e\u7684datetime\u5bf9\u8c61\uff0c\u539f\u5bf9\u8c61\u4e0d\u53d8\u5173\u952e\u5b57\u53c2\u6570\uff1ayear, month, day, hour\uff0cminute\uff0csecond\uff0cmicrosecond\n\n```python\n# \u628a\u5e74\u66ff\u6362\u4f1a\u62102018\nxdatetime.get().replace(year=2018)\n>> 2018 - 04 - 03\nT21: 23:42.819295 + 0\n8: 00\n```\n\n```python\n# \u628a\u6708\u66ff\u6362\u4f1a\u621010\nxdatetime.get().replace(month=10)\n>> 2018 - 10 - 03\nT21: 23:42.819295 + 0\n8: 00\n```\n\n```python\n# \u628a\u65e5\u66ff\u6362\u4f1a\u62107\nxdatetime.get().replace(day=7)\n>> 2018 - 04 - 07\nT21: 23:42.819295 + 0\n8: 00\n```\n\n```python\n# \u628a\u65f6\u66ff\u6362\u4f1a\u621022\nxdatetime.get().replace(hour=22)\n>> 2018 - 04 - 03\nT22: 23:42.819295 + 0\n8: 00\n```\n\n```python\n# \u628a\u5206\u66ff\u6362\u4f1a\u621021\nxdatetime.get().replace(minute=21)\n>> 2018 - 04 - 03\nT21: 21:42.819295 + 0\n8: 00\n```\n\n```python\n# \u628a\u79d2\u66ff\u6362\u4f1a\u621021\nxdatetime.get().replace(second=21)\n>> 2018 - 04 - 03\nT21: 23:21.819295 + 0\n8: 00\n```\n\n### 3.1.7 \u65f6\u95f4\u6269\u5c55\u90e8\u5206\n\n#### 3.1.7.1 \u4e8c\u4e2a\u65f6\u95f4\u7684\u5dee\u503c\n\n\u8ba1\u7b97\u4e8c\u4e2a\u65f6\u95f4\u7684\u5dee\u503c\uff0c\u8fd4\u56de\u503c\u4e3a\u79d2\u6570,\u4f20\u5165\u7684\u4e8c\u4e2a\u65f6\u95f4\u683c\u5f0f\u5305\u62ec\uff0c\u65f6\u95f4\u5b57\u7b26\u4e32\uff0cdatetime\uff0c\u65f6\u95f4\u6233\u7b49\n\n```python\nxdatetime.get(\"2020-04-28 10:52:52\", \"1988-07-20 17:31:12\").how\n>> 1002648100\n```\n\n```python\nxdatetime.get(\"2020-04-28\", \"1988-07-20 17:31:12\").how\n>> 1002608928\n```\n\n```python\nxdatetime.get(\"1975-04-28 14:14:55\", \"1988-07-20 17:31:12\").how\n>> -417496577\n```\n\n#### 3.1.7.2 \u5f00\u59cb\u4e0e\u7ed3\u675f\u65f6\u95f4\n\n- \u8fd4\u56de \u6307\u5b9a\u65f6\u95f4\u4e2d\uff0c\u5e74\uff0c\u6708\uff0c\u5468\u7684\u5f00\u59cb\u65f6\u95f4\u548c\u7ed3\u675f\u65f6\u95f4\n- \u7c7b\u578bgenre Y->\u5e74\uff0cM->\u6708\uff0cW->\u5468\n- \u7b2c\u4e00\u4e2a\u53c2\u6570\uff1a\u5e74\n- \u7b2c\u4e8c\u4e2a\u53c2\u6570\uff1a\u5e74\u6708\u7c7b\u578b\u4e2d\uff0c\u4ee3\u8868\u6708\uff0c\u5468\u7c7b\u578b\u4ee3\u8868\u5468\u6570\n\n```python\n# \u5e74(\u5f53genre\u4e3a\u5e74\u65f6\uff0c\u6708\u5931\u6548)\nxdatetime.get(2020, 0, genre=\"Y\").begin_end\n>> ['2020-01-01', '2020-12-01']\n\nxdatetime.get(2021, 0, genre=\"Y\").begin_end\n>> ['2021-01-01', '2021-12-01']\n```\n\n```python\n# \u6708\nxdatetime.get(2020, 8, genre=\"M\").begin_end\n>> ['2020-08-01', '2020-08-31']\n\nxdatetime.get(2021, 5, genre=\"M\").begin_end\n>> ['2021-05-01', '2021-05-31']\n```\n\n```python\n# \u5468\nxdatetime.get(2020, 35, genre=\"W\").begin_end\n>> ['2020-08-24', '2020-08-30']\n\nxdatetime.get(2021, 45, genre=\"W\").begin_end\n>> ['2021-11-08', '2021-11-14']\n```\n\n```python\n# \u5b63\nxdatetime.get(2020, 1, genre=\"Q\").begin_end\n>> ['2020-01-01', '2020-03-31']\n\nxdatetime.get(2021, 2, genre=\"Q\").begin_end\n>> ['2021-04-01', '2021-06-30']\n\nxdatetime.get(2020, 3, genre=\"Q\").begin_end\n>> ['2020-07-01', '2020-09-30']\n\nxdatetime.get(2021, 4, genre=\"Q\").begin_end\n>> ['2021-10-01', '2021-12-31']\n```\n\n#### 3.1.7.3 \u65f6\u95f4\u662f\u5426\u5728\u6307\u5b9a\u65f6\u95f4\u533a\u95f4\u4e2d\n\n- \u8ba1\u7b97\u65f6\u95f4\u662f\u5426\u5728\u6307\u5b9a\u7684\u65f6\u95f4\u533a\u95f4\u5185\uff0c\u8fd4\u56de\u503c\u4e3abool\u578b\n- \u9700\u8981\u4f20\u5165\u4e8c\u4e2a\u53c2\u6570\uff0c\u7b2c\u4e00\u4e2a\u4e3a\u9700\u8981\u9a8c\u8bc1\u7684\u5b57\u7b26\u4e32\uff0c\u7b2c\u4e8c\u4e2a\u662f\u4e00\u4e2a\u65f6\u95f4\u5217\u8868\uff0c\u91cc\u9762\u5305\u542b\u4e8c\u4e2a\u65f6\u95f4\uff0c\u5f00\u59cb\u65f6\u95f4\u548c\u7ed3\u675f\u65f6\u95f4\n\n```python\nxdatetime.get(\"2027-04-01\", [\"1988-04-14\", \"2020-05-14\"]).middle\n>> False\n```\n\n```python\nxdatetime.get(\"2020-04-15\", [\"2020-04-14\", \"2020-05-14 12:12:14\"]).middle\n>> True\n```\n\n## 3.2 \u5b57\u7b26\u4e32\u6a21\u5757xstring\n\n### 3.2.1 \u5b57\u7b26\u4e32\u683c\u5f0f\u6548\u9a8c\n\n\u8fdb\u884c\u5b57\u7b26\u4e32\u683c\u5f0f\u6548\u9a8c\uff0c\u5305\u62ec\u8f66\u724c\u683c\u5f0f\uff0c\u8eab\u4efd\u8bc1\u53f7\u7801\uff0c\u6574\u5f62\u6216\u6d6e\u70b9\u578b\uff0c\u65f6\u95f4\u5b57\u7b26\u4e32\uff0cURL\u5730\u5740\uff0c\u624b\u673a\u53f7\uff0c\u94f6\u884c\u5361\uff0c\u7528\u6237\u59d3\u540d\uff0c\u5bc6\u7801\uff0c\u90ae\u7bb1\uff0c\u5de5\u53f7\u3002\n\n```python\n# \u8f66\u724c\u53f7\nxstring.check(\"\u9102A96288\").is_car_number\n>> True\n```\n\n```python\n# \u8eab\u4efd\u8bc1\u53f7\u7801\n# \u63d0\u4f9b\u4e2d\u56fd\u5927\u9646\u8eab\u4efd\u8bc1\u9a8c\u8bc1\uff0c\u6682\u65f6\u53ea\u652f\u6301\u6548\u9a8c18\u4f4d\u8eab\u4efd\u8bc1\nxstring.check(\"110101199003072316\").is_identity_card\n>> True\n```\n\n```python\n# \u6574\u5f62\u6216\u6d6e\u70b9\u578b\nxstring.check(\"12.5\").is_int_or_float\n>> True\n```\n\n```python\n# \u65f6\u95f4\u5b57\u7b26\u4e32\nxstring.check(\"1988-07-20\").is_datetime_string\n>> True\n```\n\n```python\n# URL\u5730\u5740\nxstring.check(\"https://wwww.baidu.com\").is_url\n>> True\n```\n\n```python\n# \u624b\u673a\u53f7\nxstring.check(\"15172383635\").is_phone\n>> True\n```\n\n```python\n# \u94f6\u884c\u5361\nxstring.check(\"6222600260001072444\").is_bank_number\n>> True\n```\n\n```python\n# \u7528\u6237\u59d3\u540d\n# \u59d3\u540d\u8981\u6c42\u4e3a2-4\u4e2a\u4e2d\u6587\nxstring.check(\"\u718a\u5229\u5b8f\").is_user_name\n>> True\n```\n\n```python\n# \u5bc6\u7801\n# \u5305\u542b6-18\u4f4d\u5b57\u7b26\uff0c\u5fc5\u987b\u5305\u542b\u5b57\u6bcd\u4e0e\u6570\u5b57\uff0c\u53ef\u4ee5\u5305\u542b\u7279\u6b8a\u5b57\u7b26\nxstring.check(\"xlh123456\").is_user_password\n>> True\n```\n\n```python\n# \u90ae\u7bb1\n# \u7b2c\u4e00\u79cd\uff1a\u53ea\u5141\u8bb8\u82f1\u6587\u5b57\u6bcd\u3001\u6570\u5b57\u3001\u4e0b\u5212\u7ebf\u3001\u82f1\u6587\u53e5\u53f7\u3001\u4ee5\u53ca\u4e2d\u5212\u7ebf\u7ec4\u6210\n# \u7b2c\u4e8c\u79cd\uff1a\u540d\u79f0\u5141\u8bb8\u6c49\u5b57\u3001\u5b57\u6bcd\u3001\u6570\u5b57\uff0c\u57df\u540d\u53ea\u5141\u8bb8\u82f1\u6587\u57df\u540d\nxstring.check(\"xionglihong@163.com\").is_mailbox\n>> True\n```\n\n```python\n# \u5de5\u53f7\n# \u5de5\u53f7\u683c\u5f0f\u4e3a 4\u4e2a\u5927\u5199\u5b57\u6bcd+8\u4f4d\u6570\u5b57\nxstring.check(\"HBBZ00000001\").is_job\n>> True\n```\n\n### 3.2.2 \u5b57\u7b26\u4e32\u5904\u7406\n\n##### 3.2.2.1 \u8eab\u4efd\u8bc1\u53f7\u7801\u5904\u7406\n\n\u8fdb\u884c\u5b57\u7b26\u4e32\u5904\u7406\uff0c\u6bd4\u5982\u4ece\u8eab\u4efd\u8bc1\u63d0\u53d6\u751f\u65e5\u53f7\u7801\uff0c\u6027\u522b\u7b49\u64cd\u4f5c\n\n```python\nxstring.dispose(\"11010119900307053X\").get_identity_card(True)\n>> {'code': '0000', 'msg': '\u8eab\u4efd\u8bc1\u683c\u5f0f\u6b63\u786e', 'data': {'age': '31', 'birthday': '1990-03-07', 'gender': '\u7537'}}\n```\n\n##### 3.2.2.2 split \u591a\u6807\u7b7e\u5206\u5272\n\n```python\n# \u4e3b\u8981\u89e3\u51b3\u4e86\u7cfb\u7edf\u6a21\u5757split\u53ea\u80fd\u7528\u4e00\u4e2a\u5206\u9694\u7b26\nxstring.dispose(\"abc,\u6211\u7684-\u4ed6\u7684,1245*ss\").split([\",\", \"-\", \"*\"])\n>> ['abc', '\u6211\u7684', '\u4ed6\u7684', '1245', 'ss']\n```\n\n##### 3.2.2.3 strip\u591a\u5b57\u7b26\u4e32\u8fc7\u6ee4\n\n```python\n# \u5982\u679c\u4e0d\u4f20\u8fc7\u6ee4\u53c2\u6570\uff0c\u9ed8\u8ba4\u53bb\u6389\u6240\u6709\u7a7a\u683c\nxstring.dispose(\"          \u9102 A9 62 --8 8---__  \").strip()\n>> \u9102A962 - -88 - --__\n```\n\n```python\nxstring.dispose(\"          \u9102 A9 62 --8 8---__  \").strip([\" \", \"-\", \"_\"])\n>> \u9102A96288\n```\n\n##### 3.2.2.4 \u628a\u5b57\u7b26\u4e32\u8f6c\u6362\u4e3aemoji\u8868\u60c5\n\n```python\nxstring.dispose('Python is :thumbs_up:').string_to_emoji()\n>> Python is \ud83d\udc4d\n```\n\n##### 3.2.2.5 emoji\u8868\u60c5\u8f6c\u5b57\u7b26\u4e32\n\n```python\nxstring.dispose('Python is \ud83d\udc4d').emoji_to_string()\n>> Python is: thumbs_up:\n```\n\n##### 3.2.2.6 \u4e2d\u6587\u5206\u8bcd\n\n```python\n# \u5206\u8bcd\u5bf9\u8c61 \u4e2d\u56fd\u4eba\u6c11\u89e3\u653e\u519b\u6d77\u519b\u5de5\u7a0b\u5927\u5b66\n\n# \u5168\u6a21\u5f0f\uff1a\u628a\u6587\u672c\u4e2d\u6240\u6709\u53ef\u80fd\u7684\u8bcd\u8bed\u90fd\u626b\u63cf\u51fa\u6765\uff0c\u6709\u5197\u4f59 cut_all=True\n# ['\u4e2d\u56fd', '\u4e2d\u56fd\u4eba\u6c11\u89e3\u653e\u519b', '\u4e2d\u56fd\u4eba\u6c11\u89e3\u653e\u519b\u6d77\u519b', '\u56fd\u4eba', '\u4eba\u6c11', '\u4eba\u6c11\u89e3\u653e\u519b', '\u89e3\u653e', '\u89e3\u653e\u519b', '\u6d77\u519b', '\u6d77\u519b\u5de5\u7a0b\u5927\u5b66', '\u519b\u5de5', '\u5de5\u7a0b', '\u5927\u5b66']\n# \u7cbe\u786e\u6a21\u5f0f\uff1a\u628a\u6587\u672c\u7cbe\u786e\u7684\u5207\u5206\u5f00\uff0c\u4e0d\u5b58\u5728\u5197\u4f59\u5355\u8bcd cut_all=False\n# ['\u4e2d\u56fd\u4eba\u6c11\u89e3\u653e\u519b', '\u6d77\u519b\u5de5\u7a0b\u5927\u5b66']\n# \u9ed8\u8ba4\u4e3a\u7cbe\u786e\u6a21\u5f0f\n\n# \u7cbe\u786e\u6a21\u5f0f\nxstring.dispose('\u4e2d\u56fd\u4eba\u6c11\u89e3\u653e\u519b\u6d77\u519b\u5de5\u7a0b\u5927\u5b66').part(cut_all=False)\n>> ['\u4e2d\u56fd\u4eba\u6c11\u89e3\u653e\u519b', '\u6d77\u519b\u5de5\u7a0b\u5927\u5b66']\n\n# \u5168\u6a21\u5f0f\nxstring.dispose('\u4e2d\u56fd\u4eba\u6c11\u89e3\u653e\u519b\u6d77\u519b\u5de5\u7a0b\u5927\u5b66').part(cut_all=True)\n>> ['\u4e2d\u56fd', '\u4e2d\u56fd\u4eba\u6c11\u89e3\u653e\u519b', '\u4e2d\u56fd\u4eba\u6c11\u89e3\u653e\u519b\u6d77\u519b', '\u56fd\u4eba', '\u4eba\u6c11', '\u4eba\u6c11\u89e3\u653e\u519b', '\u89e3\u653e', '\u89e3\u653e\u519b', '\u6d77\u519b', '\u6d77\u519b\u5de5\u7a0b\u5927\u5b66', '\u519b\u5de5', '\u5de5\u7a0b', '\u5927\u5b66']\n```\n\n##### 3.2.2.7 \u91d1\u989d\u4eba\u6027\u5316\n\n```python\n# \u91d1\u989d\u4eba\u6027\u5316,\u4fdd\u7559\u4e8c\u4f4d\u5c0f\u6570\n\nxstring.dispose(3.0).humanized_amount()\nxstring.dispose(\"3.0\").humanized_amount()\nxstring.dispose(37787841.902).humanized_amount()\nxstring.dispose(\"37787841.9882\").humanized_amount()\nxstring.dispose(378978989).humanized_amount()\nxstring.dispose(\"378978989\").humanized_amount()\n\n>> 3.00\n>> 3.00\n>> 37, 787, 841.90\n>> 37, 787, 841.99\n>> 378, 978, 989.00\n>> 378, 978, 989.00\n```\n\n### 3.2.3 \u5b57\u7b26\u4e32\u9ad8\u7ea7\u683c\u5f0f\u6821\u9a8c\n\n\u672c\u6a21\u5757\u4e3b\u8981\u7528\u4e8e\u9879\u76ee\u4e2d\u5165\u53c2\u6a21\u5757\u5bf9\u7528\u6237\u8f93\u5165\u7684\u53c2\u6570\u8fdb\u884c\u6821\u9a8c\uff0c\u6821\u9a8c\u6210\u529f\u8fd4\u56de\u7528\u6237\u8f93\u5165\u7684\u503c\uff0c\u6821\u9a8c\u5931\u8d25\u8fd4\u56deFlash\n\n```python\n# \u53c2\u6570\u6821\u9a8c\nclass ParameterVerifyData(object):\n    \"\"\"\n    \u53c2\u6570\u6821\u9a8c\n    \"\"\"\n\n    def __call__(self, request, parameter, **kwargs):\n        \"\"\"\n        is_blank \u5982\u679c\u4e3aTrue\u4ee3\u8868\u5982\u679c\u7528\u6237\u4f20\u503c\uff0c\u5c31\u8fdb\u884c\u6821\u9a8c\uff0c\u5982\u679c\u4f20\u7a7a\uff0c\u503c\u5c31\u4e3a\u7a7a\n        \"\"\"\n        method = kwargs[\"method\"] if kwargs.get(\"method\") else \"POST\"\n\n        # \u53c2\u6570\n        if method == \"POST\":\n            parameter = request.POST.get(parameter, None)\n        else:\n            parameter = request.GET.get(parameter, None)\n\n        return xstring.formative(parameter, **kwargs)\n\n\n# \u53c2\u6570\u6821\u9a8c\nParameterVerify = ParameterVerifyData()\n```\n\nParameterVerify\u4ece\u672c\u8d28\u4e0a\u8c03\u7528xstring.formative(parameter, **kwargs)\n\n```python\n    # \u67e5\u8be2\u8ba2\u5355\u5217\u8868\n@staticmethod\ndef select_order_list(request):\n    \"\"\"\n    \u67e5\u8be2\u8ba2\u5355\u5217\u8868\n    \"\"\"\n    # \u53c2\u6570\u6821\u9a8c\n    parameter = {\n        \"rests_license\": ParameterVerify(request, \"rests_license\", rule=\"is_url_list\"),\n        \"limit\": ParameterVerify(request, \"limit\", rule=\"is_int\"),\n        \"shopping_sign\": ParameterVerify(request, \"shopping_sign\", rule=\"casual\"),  # \u5546\u5e97\u6807\u8bc6\n        \"title\": ParameterVerify(request, \"title\", rule=\"casual\"),\n        \"distribution\": ParameterVerify(request, \"distribution\", rule=\"is_choices\", choices=[\"\u5feb\u9012\", \"\u7ebf\u4e0b\u53d6\u8d27\"]),\n        \"phoenix\": ParameterVerify(request, \"cn123451\", regular=\"cn\\d{6}(?!\\d)\"),  # \u5fae\u9cef\u53f7\n    }\n\n    for key, item in parameter.items():\n        if item is False:\n            return GlobalReturn(code=10001, msg=\"{}\u4e3a{}\uff0c\u683c\u5f0f\u9519\u8bef\".format(key, item))\n\n    return GlobalReturn(**OperationOrderForm().select_order_list(request=request, **parameter))\n```\n\n\u652f\u6301\u7684\u6821\u9a8c\u7c7b\u578b\u4e3a\uff1a\n\n| \u6821\u9a8c\u7c7b\u578b           | \u5173\u952e\u5b57           | \u8bf4\u660e                                           |\n| -------------- | ---------------- | ---------------------------------------------- |\n| is_car_number  | \u8f66\u724c\u53f7           |                                                |\n| is_identity_card | \u8eab\u4efd\u8bc1           |                                                |\n| is_int_or_float | \u6574\u5f62\u6216\u6d6e\u70b9\u578b     |                                                |\n| is_int         | \u6574\u5f62             |                                                |\n| is_datetime_string | \u65f6\u95f4\u5b57\u7b26\u4e32       |                                                |\n| is_url         | url\u5730\u5740          |                                                |\n| is_phone       | \u624b\u673a\u53f7           |                                                |\n| is_bank_number | \u94f6\u884c\u5361           |                                                |\n| is_user_name   | \u7528\u6237\u59d3\u540d         |                                                |\n| is_user_password | \u5bc6\u7801             |                                                |\n| is_mailbox     | \u90ae\u7bb1             |                                                |\n| is_json        | json             |                                                |\n| is_choices     | \u679a\u4e3e\u683c\u5f0f         |                                                |\n| is_job         | \u5de5\u53f7             |                                                |\n| is_ip_address  | ip\u5730\u5740           |                                                |\n| is_phoenix     | \u5fae\u9cef\u53f7           |                                                |\n| is_verification_code | \u9a8c\u8bc1\u7801           |                                                |\n| is_version     | \u7248\u672c\u53f7           |                                                |\n| is_contact_information | \u7535\u8bdd\u53f7\u7801         | \u5305\u62ec\u4e2d\u56fd\u5927\u9646\u7684\u624b\u673a\u53f7\u7801\u548c\u56fa\u5b9a\u7535\u8bdd\u53f7\u7801           |\n| is_longitude | \u7ecf\u5ea6 | \u7ecf\u5ea6\u7684\u8303\u56f4\u5728-180\u5230180\u4e4b\u95f4 |\n| is_latitude | \u7eac\u5ea6 | \u7eac\u5ea6\u7684\u8303\u56f4\u5728-90\u523090\u4e4b\u95f4 |\n| is_longitude_latitude | \u7ecf\u7eac\u5ea6 | \u7ecf\u5ea6\u7684\u8303\u56f4\u5728-180\u5230180\u4e4b\u95f4\uff0c\u5176\u4e2d\u7eac\u5ea6\u7684\u8303\u56f4\u5728-90\u523090\u4e4b\u95f4 |\n| is_latitude_longitude | \u7eac\u7ecf\u5ea6 | \u5176\u4e2d\u7eac\u5ea6\u7684\u8303\u56f4\u5728-90\u523090\u4e4b\u95f4\uff0c\u7ecf\u5ea6\u7684\u8303\u56f4\u5728-180\u5230180\u4e4b\u95f4 |\n| is_car_number_list | \u8f66\u724c\u53f7\u5217\u8868       | \u5217\u8868\u7684\u6bcf\u4e00\u4e2a\u503c\u4e3a\u8f66\u724c\u53f7\uff0c\u4ee5\u4e0b\u540c\u7406 |\n| is_identity_card_list | \u8eab\u4efd\u8bc1\u5217\u8868       |                                                |\n| is_int_or_float_list | \u6574\u5f62\u6216\u6d6e\u70b9\u578b\u5217\u8868 |                                                |\n| is_int_list    | \u6574\u5f62\u5217\u8868         |                                                |\n| is_datetime_string_list | \u65f6\u95f4\u5b57\u7b26\u4e32\u5217\u8868   |                                                |\n| is_url_list    | url\u5730\u5740\u5217\u8868      |                                                |\n| is_phone_list  | \u624b\u673a\u53f7\u5217\u8868       |                                                |\n| is_bank_number_list | \u94f6\u884c\u5361\u5217\u8868       |                                                |\n| is_user_name_list | \u7528\u6237\u59d3\u540d\u5217\u8868     |                                                |\n| is_user_password_list | \u5bc6\u7801\u5217\u8868         |                                                |\n| is_mailbox_list | \u90ae\u7bb1\u5217\u8868         |                                                |\n| is_json_list   | json\u5217\u8868         |                                                |\n| is_ip_address_list | ip\u5730\u5740\u5217\u8868       |                                                |\n| is_longitude_latitude_list | \u7ecf\u7eac\u5ea6\u5217\u8868       |                                                |\n| is_phoenix_list    | \u5fae\u9cef\u53f7\u5217\u8868       |                                                |\n| is_verification_code_list | \u9a8c\u8bc1\u7801\u5217\u8868       |                                                |\n| is_version_list    | \u7248\u672c\u53f7\u5217\u8868       |                                                |\n| is_contact_information_list | \u7535\u8bdd\u53f7\u7801\u5217\u8868     |                                                |\n| is_casual_list | \u4efb\u610f\u5217\u8868         | \u5217\u8868\u91cc\u9762\u7684\u503c\u4e0d\u8fdb\u884c\u6821\u9a8c\uff0c\u53ea\u80fd\u786e\u4fdd\u6574\u4f53\u662f\u4e00\u4e2a\u5217\u8868 |\n\n\u53c2\u6570\u8bf4\u660e xstring.formative(parameter, **kwargs)\uff1a\n\n- parameter \u4e3a\u9700\u8981\u6821\u9a8c\u7684\u53c2\u6570\u540d\u79f0\n- is_blank \u662f\u5426\u53ef\u4ee5\u4e3a\u7a7a\uff0c\u5982\u679c\u53ef\u4ee5\u4e3a\u7a7a\uff0c\u4e0d\u8fdb\u884c\u89c4\u5219\u6821\u9a8c\uff0c\u76f4\u63a5\u8fd4\u56de\u7a7a\u5b57\u7b26\u4e32\uff0c\u5982\u679c\u7528\u6237\u4f20\u4e86\uff0c\u5c31\u8fdb\u884c\u89c4\u5219\u6821\u9a8c\n- rule \u4e3a\u6b63\u5219\u6807\u8bc6\uff0c\u5982\u679crule\u4e3ais_choices\uff0c\u5fc5\u987b\u4f20choices\uff0cchoices\u4e3a\u679a\u4e3e\u503c\uff0cchoices\u7684\u7c7b\u578b\u4e3a\u5217\u8868\n- regular \u4e3a\u81ea\u5b9a\u4e49\u6b63\u5219\u8868\u8fbe\u5f0f\uff0c\u5982\u679c\u4f20\u5165\u81ea\u5b9a\u4e49\u6b63\u5219\u8868\u8fbe\u5f0f\u5c31\u4f7f\u7528\u7528\u6237\u7684\u6b63\u5219\u8868\u8fbe\u5f0f\n\n## 3.3 \u591a\u7ebf\u7a0b\u6a21\u5757xthread\n\n### 3.3.1 \u591a\u7ebf\u7a0b\u6a21\u5757\n\n\u628a\u591a\u4e2a\u51fd\u6570\u653e\u5165\u591a\u7ebf\u7a0b\u6a21\u5757\n\n```python\n# \u51fd\u6570\u4e00\ndef function_1(a, b, c):\n    time.sleep(1)\n    return a * 2, b * 2, c * 2\n\n\n# \u51fd\u6570\u4e8c\ndef function_2(a, b):\n    time.sleep(1)\n    return a * 2, b * 2\n\n\n# \u51fd\u6570\u4e09\ndef function_3(a):\n    time.sleep(1)\n    return a * 2\n\n\n# \u51fd\u6570\u56db\ndef function_4():\n    time.sleep(1)\n    return 0\n\n\nst = time.time()\nresult = xthreading([function_1, 1, 1, 1], [function_2, 2, 2], [function_3, 2], [function_4])\nprint(result[0])\nprint(result[1])\nprint(result[2])\nprint(result[3])\net = time.time()\nprint(\"\u8fd0\u884c\u65f6\u95f4\uff1a{}\".format(et - st))\n\n>> (2, 2, 2)\n>> (4, 4)\n>> 4\n>> 0\n>> \u8fd0\u884c\u65f6\u95f4\uff1a1.0010571479797363\n\n# \u4ece\u4e0a\u9762\u7684\u8fd0\u884c\u65f6\u95f4\u53ef\u4ee5\u770b\u51fa\uff0c\u5982\u679c\u5355\u7ebf\u7a0b\u6267\u884c\u5e94\u8be5\u662f4\u79d2\u4ee5\u4e0a\uff0c\u7ed3\u679c\u4e3a1\u79d2,\u8bf4\u660e\u8fd0\u884c\u65f6\u662f\u591a\u7ebf\u7a0b\u8fd0\u884c\n```\n\n## 3.4 \u5217\u8868\u6a21\u5757xlist\n\n### 3.4.1 \u503c\u7684\u9891\u7387\n\n```python\n# \u8ba1\u7b97\u5217\u8868\u4e2d\u503c\u7684\u9891\u7387\nxlise.basics([\"\u6b66\u6c49\", \"\u6b66\u660c\", \"\u6b66\u6c49\", \"\u65e0\u804a\", \"\u4e94\u83f1\", \"\u6b66\u660c\"]).values_count()\n>> {'\u6b66\u660c': 2, '\u6b66\u6c49': 2, '\u4e94\u83f1': 1, '\u65e0\u804a': 1}\n```\n\n### 3.4.2 \u5b57\u5178\u5217\u8868\u503c\u66ff\u6362\n\n```python\n# 1.\u5b57\u5178\u578b\u5217\u8868\u7684\u503c\u6574\u4f53\u66ff\u6362\n# 2.\u8981\u6c42\u4f20\u5165\u53c2\u6570\u683c\u5f0f\u4e3a [{\"id\": None, \"name\": \"wuhan\"}, {\"id\": 5, \"name\": \"\u4e2d\u56fd\"}, {\"id\": 25, \"name\": \"\u4e0a\u53f7\"}, {\"id\": 5, \"name\": \"\u6d4b\u8bd5\"}]\n# 3.\u8fd9\u79cd\u5f62\u72b6\u7684\u53c2\u6570\u5373\u53ef\uff0c\u6bd4\u5982\u53ef\u4ee5\u4f20\u5165 django \u7684 QuerySet \u7b49\n# 4.\u53c2\u6570\uff1a\n#    1.\u9700\u8981\u66ff\u6362\u7684\u5bf9\u8c61\n#    2.kwargs[\"rules\"] \u8981\u6c42\u5143\u7956\uff0c\u6bd4\u5982 ((None, ''), (45, 47)))\n\nvalue = [{\"id\": None, \"name\": \"wuhan\"}, {\"id\": 5, \"name\": \"\u4e2d\u56fd\"}, {\"id\": 25, \"name\": \"\u4e0a\u53f7\"}, {\"id\": 5, \"name\": \"\u6d4b\u8bd5\"}]\nxlise.basics(value).dict_to_value(rules=((None, ''), (\"\u4e2d\u56fd\", \"china\")))\n>> [{'id': '', 'name': 'wuhan'}, {'id': 5.0, 'name': 'china'}, {'id': 25.0, 'name': '\u4e0a\u53f7'}, {'id': 5.0, 'name': '\u6d4b\u8bd5'}]\n```\n\n## 3.5 \u6587\u4ef6\u6a21\u5757xfile\n\n### 3.5.1 excel\u8f6cdict\n\n\u5bfc\u5165\u7684excel\u8868\u683c\u7684\u683c\u5f0f\u662f\u8fd9\u6837\u7684\uff1a\n\n![excel\u8868\u683c\u683c\u5f0f](https://img-blog.csdnimg.cn/20200917213012349.png#pic_center)\n\n#### 3.5.1.1 \u57fa\u672c\u7528\u6cd5\n\n```python\n# excel\u8f6cdict\n\n# 1.\u4f20\u6765\u7684\u6587\u4ef6\u53ef\u4ee5\u662f\u6587\u4ef6\u8def\u5f84\uff0c\u4e5f\u53ef\u4ee5\u662f\u4e8c\u8fdb\u5236\u6587\u4ef6\n# 2.\u4f20\u6765\u7684\u53ef\u4ee5\u662f\u4e8c\u8fdb\u5236\u6587\u4ef6\uff0c\u8fd9\u91cc\u4ee5django\u63a5\u6536\u524d\u7aef\u4f20\u6765\u6587\u4ef6\u4e3a\u4f8b\uff1a\n#     \u63a5\u6536\u7528 request.FILES.get(\"fileName\", None) \u4f20\u5165 my_file \u5373\u53ef\n\n# kwargs\u63a5\u6536\u7684\u53c2\u6570\u6709:\n# sheet\u7d22\u5f15\uff0c0\u4ee3\u8868\u7b2c\u4e00\u4e2a\u8868\uff0c1\u4ee3\u8868\u7b2c\u4e8c\u4e2a\u8868\uff0c\u9ed8\u8ba40\n# max\u8868\u683c\u6700\u5927\u7684\u884c\u6570\uff0c\u9ed8\u8ba42000\u884c\n# min\u8868\u683c\u6700\u5c0f\u7684\u884c\u6570\uff0c\u9ed8\u8ba41\u884c\n# title \u8868\u5934(\u7528\u4e8e\u8868\u5934\u6821\u9a8c)\n\n# \u8868\u5934\u4e3a\u9009\u586b,\u5982\u679c\u4e0d\u586b\uff0c\u4e0d\u8fdb\u884c\u8868\u5934\u6821\u9a8c\nxfile.read(\"./result/t_excel.xls\").excel_to_dict()\n>> [{'\u7f16\u53f7': 1, '\u65f6\u95f4': '1988-07-21 00:00:00', '\u5e74\u9f84': 1, '\u5206\u6570': 63.2, '\u603b\u5206': 1},\n    {'\u7f16\u53f7': 2, '\u65f6\u95f4': '1988-07-21 00:00:00', '\u5e74\u9f84': 1, '\u5206\u6570': 63.2, '\u603b\u5206': 1},\n    {'\u7f16\u53f7': 3, '\u65f6\u95f4': '1988-07-21 00:00:00', '\u5e74\u9f84': 1, '\u5206\u6570': 63.2, '\u603b\u5206': 1},\n    {'\u7f16\u53f7': 4, '\u65f6\u95f4': '1988-07-21 00:00:00', '\u5e74\u9f84': 1, '\u5206\u6570': 63.2, '\u603b\u5206': 1},\n    {'\u7f16\u53f7': 5, '\u65f6\u95f4': '1988-07-21 00:00:00', '\u5e74\u9f84': 1, '\u5206\u6570': 63.2, '\u603b\u5206': 1},\n    {'\u7f16\u53f7': 6, '\u65f6\u95f4': '1988-07-21 00:00:00', '\u5e74\u9f84': 1, '\u5206\u6570': 63.2, '\u603b\u5206': 1}\n    ]\n```\n\n#### 3.5.1.2 \u6821\u9a8c\u8868\u5934\u518d\u8fdb\u884c\u8bfb\u53d6\n\n\u9519\u8bef\u7684\u8868\u5934\u662f\u8fd9\u6837\u7684\uff1a\n\n![excel\u8868\u683c\u683c\u5f0f(\u9519\u8bef\u7684\u8868\u5934)](https://img-blog.csdnimg.cn/20200930112459173.png#pic_center)\n\n```python\nxfile.read(\"./result/t_excel.xls\").excel_to_dict(title=[\"\u7f16\u53f7\", \"\u65f6\u95f4\", \"\u5e74\u9f84\", \"\u5206\u6570\", \"\u603b\u5206\"])\n>> {'code': '0001', 'data': {'data': None}, 'msg': '\u8868\u5934\u7b2c 3 \u5217\u9519\u8bef\uff0c\u9519\u8bef\u503c\u4e3a \u5e74\u9f841 \u5e94\u8be5\u4e3a \u5e74\u9f84'}\n```\n\n## 3.6 \u5927\u6742\u70e9\u6a21\u5757xfile\n\n### 3.6.1 \u7ecf\u7eac\u5ea6\u8ba1\u7b97\u4e8c\u70b9\u8ddd\u79bb\n\n```python\n# \u53c2\u6570\u683c\u5f0f\uff1a\uff08\u7eac\u5ea6\uff0c\u7ecf\u5ea6\uff09,(3.6546879, 4.5879546), (6.5879546, 5.1123654)\nxhotchpotch.distance_hav((3.6546879, 4.5879546), (6.5879546, 5.1123654))\n>> 331293.8566141046\n```\n\n# 4 \u5347\u7ea7\u65e5\u5fd7\n\n2019\u5e7405\u5e7410\u65e5 V0.0.10\n\n- xToolkit \u4e0a\u7ebf\u5566\n- \u65b0\u589e\u83b7\u53d6\u5f53\u524d\u65f6\u95f4\u529f\u80fd\n\n2019\u5e7405\u5e7416\u65e5 V0.0.12\n\n- \u65b0\u589e\u683c\u5f0f\u5316\u65f6\u95f4format\u529f\u80fd\uff0c\u66f4\u4eba\u6027\u5316\u7684\u8f93\u51fa\u65f6\u95f4\u683c\u5f0f\n- \u65b0\u589e\u63a8\u79fb\u65f6\u95f4\u529f\u80fd\n- \u65b0\u589e\u66ff\u6362\u65f6\u95f4\u529f\u80fd\n- \u65b0\u589e\u5224\u65ad\u65f6\u95f4\u683c\u5f0f\u662f\u5426\u6b63\u786e\u529f\u80fd\n- \u65b0\u589e\u83b7\u53d6\u65f6\u95f4\u533a\u95f4\u529f\u80fd\n\n2019\u5e7406\u670811\u65e5 V0.0.21\n\n- \u65b0\u589e\u5b57\u7b26\u4e32\u6548\u9a8c\u529f\u80fd\n\n2019\u5e7408\u670820\u65e5 v0.0.25\n\n- \u65b0\u589e\u4e2d\u56fd\u5c45\u6c11\u8eab\u4efd\u8bc1\u6548\u9a8c\u529f\u80fd\n- \u65b0\u589e\u4e2d\u56fd\u5927\u9646\u624b\u673a\u53f7\u7801\u6548\u9a8c\u529f\u80fd\n- \u65b0\u589e\u6570\u5b57\u6548\u9a8c\u529f\u80fd\n\n2019\u5e7409\u670802\u65e5 v0.0.30\n\n- \u65b0\u589e\u6d6e\u70b9\u6570\uff0c\u94f6\u884c\u5361\u6548\u9a8c\n\n2020\u5e7405\u670828\u65e5 v0.0.43\n\n- \u65b0\u589e\u5b57\u7b26\u4e32 split\u591a\u5206\u5272\u6807\u8bc6\n\n2020\u5e7406\u670806\u65e5 v0.0.46\n\n- \u4fee\u62a4\u83b7\u53d6\u6307\u5b9a\u6708\u6700\u540e\u4e00\u5929\uff0c\u8f93\u5165\u6574\u6570\u578b\u5b57\u7b26\u4e32\u62a5\u9519\u7684BUG\n- \u65b0\u589e\u5224\u65ad\u6574\u6570\uff0c\u6269\u5145\u4e86string.isdigit()\n\n2020\u5e7406\u670822\u65e5 v0.0.47\n\n- \u65b0\u589e\u5b57\u7b26\u4e32 strip\u591a\u8fc7\u6ee4\u6807\u8bc6\n\n2020\u5e7406\u670828\u65e5 v0.0.48\n\n- \u4fee\u6539\u4e86\u624b\u673a\u53f7\u683c\u5f0f\u5224\u65ad\u5982\u679c\u4e3a\u7eaf\u6570\u5b57\u62a5\u9519\u7684BUG\n- \u65b0\u589e\u591a\u7ebf\u7a0b\u6a21\u5757\n\n2020\u5e7406\u670828\u65e5 v0.0.49\n\n- \u65b0\u589e \u6307\u5b9a\u65f6\u95f4\u4e2d\uff0c\u5e74\uff0c\u6708\uff0c\u5468\u7684\u5f00\u59cb\u65f6\u95f4\u548c\u7ed3\u675f\u65f6\u95f4\n- \u83b7\u53d6\u65f6\u95f4\u5143\u7d20\u4e2d\uff0c\u65b0\u589e \u83b7\u53d6\u661f\u671f\u548c\u5468\n- \u65b0\u589e \u5b57\u7b26\u4e32\u8f6cemoji\u8868\u60c5\n- \u65b0\u589e emoji\u8868\u60c5\u8f6c\u5b57\u7b26\u4e32\n- \u65b0\u589e \u4e2d\u6587\u5206\u8bcd\uff08\u7cbe\u786e\u6a21\u5f0f\uff0c\u5168\u6a21\u5f0f\uff09\n- \u65b0\u589e\u5217\u8868\u6a21\u5757\n- \u65b0\u589e\u5217\u8868\u6a21\u5757 \u8ba1\u7b97\u503c\u7684\u9891\u7387\u529f\u80fd\n\n2020\u5e7406\u670828\u65e5 v0.0.50\n\n- \u65b0\u589e \u5b57\u7b26\u4e32\u683c\u5f0f\u6821\u9a8c\u52a0\u5165\u5de5\u53f7\u683c\u5f0f\u6821\u9a8c\n\n2020\u5e7409\u670810\u65e5 v0.0.62\n\n- \u4fee\u62a4 \u7b2c\u4e09\u4f9d\u8d56\u5e93\u4e0d\u81ea\u52a8\u5b89\u88c5\u7684BUG\n\n2020\u5e7409\u670816\u65e5 v0.0.63\n\n- \u65b0\u589e\u6587\u4ef6\u6a21\u5757\n- \u65b0\u589e\u6587\u4ef6\u6a21\u5757\u8bfb\u53d6\u529f\u80fd\n- \u65b0\u589eexcel\u8f6cdict\u529f\u80fd\n\n2020\u5e7409\u670819\u65e5 V0.0.64\n\n- \u65b0\u589e\u6570\u5b57\u4eba\u6027\u5316\n\n2020\u5e7409\u670820\u65e5 V0.0.65\n\n- xdatetime \u8fd4\u56de\u5f53\u524d\u5b63\u5ea6\uff081-4\u5b63\u5ea6\uff09\n- \u8f93\u5165\u5e74\uff0c\u5b63\u5ea6\uff0c\u8fd4\u56de\u5b63\u5ea6\u7684\u5f00\u59cb\u65e5\u671f\u548c\u7ed3\u675f\u65e5\u671f\n- \u6570\u5b57\u4eba\u6027\u5316\u683c\u5f0f\u5c0f\u6570\u90e8\u5206\u6362\u6210Decimal\u5e93\u5b9e\u73b0\n\n2020\u5e7409\u670821\u65e5 V0.0.66\n\n- \u6587\u4ef6\u8bfb\u53d6\u529f\u80fd,\u65b0\u589e\u6587\u4ef6\u6821\u9a8c\uff0c\u5728\u8bfb\u53d6\u4e4b\u524d\u6821\u9a8c\u6587\u4ef6\u662f\u5426\u5b58\u5728\uff0c\u548c\u683c\u5f0f\u662f\u5426\u6b63\u786e\n\n2020\u5e7409\u670822\u65e5 V0.0.67\n\n- \u89e3\u51b3xdatetime.shape()\u4f20\u5165None\u4fdd\u5b58\u7684BUG\n- excel\u8f6cdict\u52a0\u5165\u8868\u5934\u6821\u9a8c\u529f\u80fd\n- \u89e3\u51b3xdatetime.shape()\u4f20\u5165date\u7c7b\u578b\u62a5\u9519\u7684bug\n\n2020\u5e7409\u670830\u65e5 V0.0.68\n\n- excel\u8f6cdict\u8868\u5934\u6821\u9a8c\u529f\u80fd\u63cf\u8ff0\u9519\u8bef\uff0c\u9519\u8bef\u503c\u4e0e\u5b9e\u9645\u503c\u53cd\u4e86\n- \u65b0\u589e \u5b57\u5178\u578b\u5217\u8868\u503c\u6574\u4f53\u66ff\u6362\u529f\u80fd\n\n2021\u5e7403\u670808\u65e5 V0.0.71\n\n- \u4fee\u6539numpy\u4f9d\u8d56\u5e93\u7684\u6700\u4f4e\u7248\u4e3a1.20.3\uff0c\u56e0\u4e3a1.19.4\u5728windows\u5e73\u53f0\u4e0a\u8fd0\u884c\u4f1a\u62a5\u9519\n\n2021\u5e7404\u670815\u65e5 V0.0.72\n\n- \u8eab\u4efd\u8bc1\u8be6\u60c5\u8fd4\u56de\u5b57\u6bb5\u4e2d\uff0c\u8fd4\u56de\u5e74\u9f84\u5b57\u6bb5\n\n2021\u5e7406\u670809\u65e5 V0.0.73\n\n- \u65b0\u589e \u5bf9\u8c61\u5b57\u7b26\u4e32\u8f6c\u5bf9\u8c61 \u529f\u80fd\n- \u65b0\u589e \u5bf9\u8c61\u8f6c\u5bf9\u8c61\u5b57\u7b26\u4e32 \u529f\u80fd\n- \u65b0\u589e \u5b57\u8282\u4e32\u548c\u5b57\u7b26\u4e32 \u529f\u80fd\n- \u65b0\u589e \u5b57\u7b26\u4e32\u548c\u5b57\u8282\u4e32 \u529f\u80fd\n\n2021\u5e7406\u670821\u65e5 V0.0.74\n\n- \u4fee\u6539\u7b2c\u4e09\u65b9\u5e93numpy\u4e3a1.19.5\uff0c\u56e0\u4e3alinux\u91cc\u9762numpy\u6700\u9ad8\u7248\u672c\u4e3a1.19.5\n- \u65f6\u95f4\u7c7b\u65b0\u589e\u9ad8\u7ea7\u65f6\u95f4\u6233\u529f\u80fd\uff0c\u652f\u6301\u8f93\u51fa \u79d2\u7ea7\u65f6\u95f4\u6233\uff0c\u6beb\u79d2\u7ea7\u65f6\u95f4\u6233\uff0c\u5fae\u79d2\u7ea7\u65f6\u95f4\u6233\n\n2022\u5e7407\u670806\u65e5 V0.0.75\n\n- \u53bb\u6389demjson\u7b2c\u4e09\u65b9\u5e93\uff0c\u56e0\u4e3a\u4ed6\u4e0d\u652f\u6301python >= 3.5\uff0c\u6539\u7528\u7cfb\u7edf\u7684ast\n- \u4fee\u6539\u65f6\u95f4\u6a21\u5757\uff0c\u8ba1\u7b97\u5f00\u59cb\u65f6\u95f4\u4e0e\u7ed3\u675f\u65f6\u95f4\uff0c\u8f93\u5165\u53c2\u6570\u4e3a\u5e74\uff0c\u8ba1\u7b97\u9519\u8bef\u7684BUG\n\n2022\u5e7407\u670807\u65e5 V0.0.76\n\n- \u65b0\u589e\u5927\u6742\u70e9\u6a21\u5757\n- \u5927\u6742\u70e9\u6a21\u5757\u65b0\u589e\u8ba1\u7b97\u7ecf\u7eac\u5ea6\u4e8c\u70b9\u8ddd\u79bb\u529f\u80fd\n\n2022\u5e7408\u670816\u65e5 V0.0.77\n\n- \u65b0\u589e\u5b57\u7b26\u4e32\u590d\u5408\u6821\u9a8c\u6a21\u5757\n\n2022\u5e7408\u670824\u65e5 V0.0.78\n\n- \u6b63\u5219\u6821\u9a8c\u6a21\u5757\u6539\u4e3amatch\n\n2022\u5e7408\u670824\u65e5 V0.0.83\n\n- \u590d\u5408\u53c2\u6570\u6821\u9a8c\u6dfb\u52a0ip\u5730\u5740\u6821\u9a8c\n\n2023\u5e7405\u670817\u65e5 V0.0.84\n\n- \u590d\u5408\u53c2\u6570\u6821\u9a8c\u6dfb\u52a0\u81ea\u5b9a\u4e49\u6b63\u5219\u8868\u8fbe\u5f0f\u6821\u9a8c\n\n2023\u5e7405\u670817\u65e5 V0.0.85\n\n- \u52a0\u5165\u5fae\u9cef\u53f7\u6821\u9a8c\uff0c\u7ecf\u7eac\u5ea6\u683c\u5f0f\u6821\u9a8c\uff0c\u7248\u672c\u53f7\uff0c\u5927\u9646\u8054\u7cfb\u53f7\u7801\u6b63\u5219\u8868\u8fbe\u5f0f\u6821\u9a8c\n- \u5bc6\u7801\u6821\u9a8c\u6539\u4e3a\u5fc5\u987b\u5305\u542b\u6570\u5b57\u548c\u5b57\u6bcd\uff0c\u53ef\u4ee5\u5305\u542b\u5b57\u7b26\uff0c6\u523018\u4f4d\n\n2023\u5e7407\u670807\u65e5 V0.0.86\n\n- \u4fee\u6539\u4e86\u90ae\u7bb1\u7684\u6821\u9a8c\u89c4\u5219\uff0c\u90ae\u7bb1\u524d\u7f00\u53ef\u4ee5\u5305\u542b\u6570\u5b57,\u5927\u5c0f\u5199\u5b57\u6bcd,+,-,_,\u6c49\u5b57\u7b49\n- \u5b57\u7b26\u4e32\u6821\u9a8c\u89e3\u51b3\u4f20\u5165None\u5f15\u8d77\u7684\u62a5\u9519\n\n2023\u5e7407\u670828\u65e5 V0.0.87\n\n- \u4fee\u6539\u7ecf\u7eac\u5ea6\u6821\u9a8c\u7684bug\n- \u65b0\u589e \u7ecf\u5ea6\uff0c\u7ef4\u5ea6\uff0c\u7ecf\u7eac\u5ea6\uff0c\u7eac\u7ecf\u5ea6 \u6821\u9a8c\n\n2023\u5e7411\u670822\u65e5 V0.0.88\n\n- \u53c2\u6570\u6821\u9a8c\u52a0\u5165\uff0c\u4e3a\u7a7a\u6821\u9a8c\u5e76\u8bbe\u7f6e\u9ed8\u8ba4\u503c\n\n2023\u5e7411\u670822\u65e5 V0.0.89\n\n- \u52a0\u5165\u590d\u6838\u6821\u9a8c\u91cc\u9762\u7684\u4e00\u4e9b\u7279\u6b8a\u60c5\u51b5\n\n\u5f00\u53d1\u8ba1\u5212\uff1a\n\n- \u65e0",
    "bugtrack_url": null,
    "license": "GNU General Public License v3.0",
    "summary": "",
    "version": "0.0.89",
    "project_urls": {
        "Homepage": "https://github.com/xionglihong/xToolkit"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "463acb6066748333ef187671d23bebc2b9c8e14d1230a66fe018140c6ccffb66",
                "md5": "17d097c598582801055a1b6ef1530ce2",
                "sha256": "879c5abc9916456411c72699df962b85beae9e09a5ba84d53053ea043b925859"
            },
            "downloads": -1,
            "filename": "xToolkit-0.0.89.tar.gz",
            "has_sig": false,
            "md5_digest": "17d097c598582801055a1b6ef1530ce2",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 42062,
            "upload_time": "2023-11-22T09:23:08",
            "upload_time_iso_8601": "2023-11-22T09:23:08.994336Z",
            "url": "https://files.pythonhosted.org/packages/46/3a/cb6066748333ef187671d23bebc2b9c8e14d1230a66fe018140c6ccffb66/xToolkit-0.0.89.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-11-22 09:23:08",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "xionglihong",
    "github_project": "xToolkit",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "xtoolkit"
}
        
Elapsed time: 0.16306s