pyxllib 0.3.197__py3-none-any.whl → 0.3.200__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. pyxllib/__init__.py +21 -21
  2. pyxllib/algo/__init__.py +8 -8
  3. pyxllib/algo/disjoint.py +54 -54
  4. pyxllib/algo/geo.py +541 -541
  5. pyxllib/algo/intervals.py +964 -964
  6. pyxllib/algo/matcher.py +389 -389
  7. pyxllib/algo/newbie.py +166 -166
  8. pyxllib/algo/pupil.py +629 -629
  9. pyxllib/algo/shapelylib.py +67 -67
  10. pyxllib/algo/specialist.py +241 -241
  11. pyxllib/algo/stat.py +494 -494
  12. pyxllib/algo/treelib.py +149 -149
  13. pyxllib/algo/unitlib.py +66 -66
  14. pyxllib/autogui/__init__.py +5 -5
  15. pyxllib/autogui/activewin.py +246 -246
  16. pyxllib/autogui/all.py +9 -9
  17. pyxllib/autogui/autogui.py +852 -852
  18. pyxllib/autogui/uiautolib.py +362 -362
  19. pyxllib/autogui/virtualkey.py +102 -102
  20. pyxllib/autogui/wechat.py +827 -827
  21. pyxllib/autogui/wechat_msg.py +421 -421
  22. pyxllib/autogui/wxautolib.py +84 -84
  23. pyxllib/cv/__init__.py +5 -5
  24. pyxllib/cv/expert.py +267 -267
  25. pyxllib/cv/imfile.py +159 -159
  26. pyxllib/cv/imhash.py +39 -39
  27. pyxllib/cv/pupil.py +9 -9
  28. pyxllib/cv/rgbfmt.py +1525 -1525
  29. pyxllib/cv/slidercaptcha.py +137 -137
  30. pyxllib/cv/trackbartools.py +251 -251
  31. pyxllib/cv/xlcvlib.py +1040 -1040
  32. pyxllib/cv/xlpillib.py +423 -423
  33. pyxllib/data/echarts.py +240 -240
  34. pyxllib/data/jsonlib.py +89 -89
  35. pyxllib/data/oss.py +72 -72
  36. pyxllib/data/pglib.py +1127 -1127
  37. pyxllib/data/sqlite.py +568 -568
  38. pyxllib/data/sqllib.py +297 -297
  39. pyxllib/ext/JLineViewer.py +505 -505
  40. pyxllib/ext/__init__.py +6 -6
  41. pyxllib/ext/demolib.py +246 -246
  42. pyxllib/ext/drissionlib.py +277 -277
  43. pyxllib/ext/kq5034lib.py +12 -12
  44. pyxllib/ext/old.py +663 -663
  45. pyxllib/ext/qt.py +449 -449
  46. pyxllib/ext/robustprocfile.py +497 -497
  47. pyxllib/ext/seleniumlib.py +76 -76
  48. pyxllib/ext/tk.py +173 -173
  49. pyxllib/ext/unixlib.py +827 -827
  50. pyxllib/ext/utools.py +351 -351
  51. pyxllib/ext/webhook.py +124 -119
  52. pyxllib/ext/win32lib.py +40 -40
  53. pyxllib/ext/wjxlib.py +88 -88
  54. pyxllib/ext/wpsapi.py +124 -124
  55. pyxllib/ext/xlwork.py +9 -9
  56. pyxllib/ext/yuquelib.py +1105 -1105
  57. pyxllib/file/__init__.py +17 -17
  58. pyxllib/file/docxlib.py +761 -761
  59. pyxllib/file/gitlib.py +309 -309
  60. pyxllib/file/libreoffice.py +165 -165
  61. pyxllib/file/movielib.py +148 -148
  62. pyxllib/file/newbie.py +10 -10
  63. pyxllib/file/onenotelib.py +1469 -1469
  64. pyxllib/file/packlib/__init__.py +330 -330
  65. pyxllib/file/packlib/zipfile.py +2441 -2441
  66. pyxllib/file/pdflib.py +426 -426
  67. pyxllib/file/pupil.py +185 -185
  68. pyxllib/file/specialist/__init__.py +685 -685
  69. pyxllib/file/specialist/dirlib.py +799 -799
  70. pyxllib/file/specialist/download.py +193 -193
  71. pyxllib/file/specialist/filelib.py +2829 -2829
  72. pyxllib/file/xlsxlib.py +3131 -3131
  73. pyxllib/file/xlsyncfile.py +341 -341
  74. pyxllib/prog/__init__.py +5 -5
  75. pyxllib/prog/cachetools.py +64 -64
  76. pyxllib/prog/deprecatedlib.py +233 -233
  77. pyxllib/prog/filelock.py +42 -42
  78. pyxllib/prog/ipyexec.py +253 -253
  79. pyxllib/prog/multiprogs.py +940 -940
  80. pyxllib/prog/newbie.py +451 -451
  81. pyxllib/prog/pupil.py +1197 -1197
  82. pyxllib/prog/sitepackages.py +33 -33
  83. pyxllib/prog/specialist/__init__.py +391 -391
  84. pyxllib/prog/specialist/bc.py +203 -203
  85. pyxllib/prog/specialist/browser.py +497 -497
  86. pyxllib/prog/specialist/common.py +347 -347
  87. pyxllib/prog/specialist/datetime.py +198 -198
  88. pyxllib/prog/specialist/tictoc.py +240 -240
  89. pyxllib/prog/specialist/xllog.py +180 -180
  90. pyxllib/prog/xlosenv.py +108 -108
  91. pyxllib/stdlib/__init__.py +17 -17
  92. pyxllib/stdlib/tablepyxl/__init__.py +10 -10
  93. pyxllib/stdlib/tablepyxl/style.py +303 -303
  94. pyxllib/stdlib/tablepyxl/tablepyxl.py +130 -130
  95. pyxllib/text/__init__.py +8 -8
  96. pyxllib/text/ahocorasick.py +39 -39
  97. pyxllib/text/airscript.js +744 -744
  98. pyxllib/text/charclasslib.py +121 -121
  99. pyxllib/text/jiebalib.py +267 -267
  100. pyxllib/text/jinjalib.py +32 -32
  101. pyxllib/text/jsa_ai_prompt.md +271 -271
  102. pyxllib/text/jscode.py +922 -922
  103. pyxllib/text/latex/__init__.py +158 -158
  104. pyxllib/text/levenshtein.py +303 -303
  105. pyxllib/text/nestenv.py +1215 -1215
  106. pyxllib/text/newbie.py +300 -300
  107. pyxllib/text/pupil/__init__.py +8 -8
  108. pyxllib/text/pupil/common.py +1121 -1121
  109. pyxllib/text/pupil/xlalign.py +326 -326
  110. pyxllib/text/pycode.py +47 -47
  111. pyxllib/text/specialist/__init__.py +8 -8
  112. pyxllib/text/specialist/common.py +112 -112
  113. pyxllib/text/specialist/ptag.py +186 -186
  114. pyxllib/text/spellchecker.py +172 -172
  115. pyxllib/text/templates/echart_base.html +10 -10
  116. pyxllib/text/templates/highlight_code.html +16 -16
  117. pyxllib/text/templates/latex_editor.html +102 -102
  118. pyxllib/text/vbacode.py +17 -17
  119. pyxllib/text/xmllib.py +747 -747
  120. pyxllib/xl.py +42 -39
  121. pyxllib/xlcv.py +17 -17
  122. {pyxllib-0.3.197.dist-info → pyxllib-0.3.200.dist-info}/METADATA +1 -1
  123. pyxllib-0.3.200.dist-info/RECORD +126 -0
  124. {pyxllib-0.3.197.dist-info → pyxllib-0.3.200.dist-info}/licenses/LICENSE +190 -190
  125. pyxllib-0.3.197.dist-info/RECORD +0 -126
  126. {pyxllib-0.3.197.dist-info → pyxllib-0.3.200.dist-info}/WHEEL +0 -0
@@ -1,199 +1,199 @@
1
- #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- # @Author : 陈坤泽
4
- # @Email : 877362867@qq.com
5
- # @Date : 2021/06/03 23:28
6
-
7
- """
8
-
9
- 旧的Datetime类已删除,原来稍微比较有用的一个功能,是
10
-
11
- 替换周几,这个算法可以参考:
12
- a = a - a.isoweekday() + kwargs['weekday'] # 先减去当前星期几,再加上1~7的一个目标星期
13
-
14
- """
15
-
16
- import datetime
17
- import re
18
-
19
- from fastcore.utils import GetAttr
20
-
21
-
22
- def parse_datetime(*argv):
23
- """ 解析字符串日期时间
24
-
25
- 解析算法偏私人应用,规则虽然多,但反而变得混乱隐晦,
26
- 实际开发能明确使用具体接口,尽量还是用具体接口。
27
-
28
- # 建议使用 Datetime.strptime
29
- >>> parse_datetime('2019年3月6日', '%Y年%m月%d日') # 指定格式
30
- datetime.datetime(2019, 3, 6, 0, 0)
31
- >>> parse_datetime('w200301周日', 'w%y%m%d周日') # 周日必须写全,有缺失会报ValueError
32
- datetime.datetime(2020, 3, 1, 0, 0)
33
-
34
- >>> parse_datetime('2019.3.6 22:30:40')
35
- datetime.datetime(2019, 3, 6, 22, 30, 40)
36
-
37
- >>> parse_datetime(180213)
38
- datetime.datetime(2018, 2, 13, 0, 0)
39
- >>> parse_datetime('180213')
40
- datetime.datetime(2018, 2, 13, 0, 0)
41
-
42
- # 以下只对2000~2099年的时间点有效
43
- >>> parse_datetime('2015-06-15_22-19-01_HDR.jpg')
44
- datetime.datetime(2015, 6, 15, 22, 19, 1)
45
- >>> parse_datetime('IMG_20150615_2219011234_HDR.jpg')
46
- datetime.datetime(2015, 6, 15, 22, 19, 1, 1234)
47
- >>> parse_datetime('_2015.6.15_22:19:02')
48
- datetime.datetime(2015, 6, 15, 22, 19, 2)
49
- """
50
-
51
- def _datetime(argv):
52
- args, n = list(argv), len(argv)
53
- if n < 3: # 若没填写月、日,默认1月、1日
54
- args = args + [1] * (3 - n)
55
- try:
56
- return datetime.datetime(*args)
57
- except (ValueError, TypeError) as e:
58
- return None
59
-
60
- def _six_digits_date(s):
61
- """主要是我个人常用的日期标注格式
62
- """
63
- s, dt = str(s), None
64
- if re.match(r'\d{6}$', s):
65
- year = int(s[:2])
66
- year = 2000 + year if year < 50 else 1900 + year # 小于50默认是20xx年,否则认为是19xx年
67
- dt = _datetime([year, int(s[2:4]), int(s[4:])])
68
- return dt
69
-
70
- def _parse_time_string(s):
71
- r"""只对2000~2099年的时间点有效
72
- """
73
- data, break_flag = [], False
74
-
75
- def parse(pattern, left=None, right=None):
76
- """通用底层解析器"""
77
- nonlocal break_flag, s
78
- if break_flag: return
79
-
80
- m = re.search(pattern, s)
81
- if m:
82
- d = int(m.group())
83
- if left and d < left:
84
- break_flag = True
85
- elif right and d > right:
86
- break_flag = True
87
- else:
88
- data.append(d)
89
- s = s[m.end():]
90
- else:
91
- break_flag = True
92
-
93
- parse(r'20\d{2}')
94
- parse(r'\d\d?', 1, 12) # 有连续两个数组就获得两个,否则获得一个也行
95
- parse(r'\d\d?', 1, 31) # 这样其实不严谨,有的月份不到31天,不过反正_datetime会返回None代表处理失败的
96
- parse(r'\d\d?', 0, 23)
97
- parse(r'\d\d?', 0, 59)
98
- parse(r'\d\d?', 0, 59)
99
- parse(r'\d{1,6}') # microsecond
100
-
101
- return _datetime(data)
102
-
103
- dt = None
104
- # 1 没有参数则默认当前运行时间
105
- if not argv:
106
- dt = datetime.datetime.now()
107
- if not dt and isinstance(argv[0], datetime.datetime):
108
- dt = argv[0]
109
- if not dt and isinstance(argv[0], datetime.date):
110
- # 要转成datetime类型,time部分默认00:00:00
111
- dt = datetime.datetime.combine(argv[0], datetime.time())
112
- if not dt and isinstance(argv[0], float):
113
- dt = datetime.datetime.fromtimestamp(argv[0])
114
- # 2 如果上述解析不了,且argv恰好为两个参数,则判断为使用strptime初始化
115
- if not dt and len(argv) == 2:
116
- dt = datetime.datetime.strptime(str(argv[0]), argv[1])
117
- # 3 判断是否我个人特用的六位日期标记
118
- if not dt:
119
- dt = _six_digits_date(argv[0])
120
- # 4 如果仍然解析不了,开始使用一个智能推导算法
121
- if not dt:
122
- dt = _parse_time_string(argv[0])
123
- # 5 最后任何解析方案都失败,则返回None
124
-
125
- return dt
126
-
127
-
128
- def parse_timedelta(s):
129
- """ 解析字符串所代表的时间差
130
-
131
- >>> parse_timedelta('38:18')
132
- datetime.timedelta(seconds=2298)
133
- >>> parse_timedelta('03:55')
134
- datetime.timedelta(seconds=235)
135
- >>> parse_timedelta('1:34:25')
136
- datetime.timedelta(seconds=5665)
137
- """
138
- parts = s.split(':')[::-1]
139
- d = {k: int(v) for k, v in zip(['seconds', 'minutes', 'hours'], parts)}
140
- td = datetime.timedelta(**d)
141
- return td
142
-
143
-
144
- class XlWeekTag(GetAttr):
145
- """ 个人周标签转换工具 """
146
- _default = 'dt'
147
-
148
- def __init__(self, dt=None):
149
- """
150
- :param datetime|其他类日期表达 dt: 可以输入一个日期,默认为今天
151
- """
152
- if dt is None:
153
- dt = datetime.date.today()
154
- self.dt = parse_datetime(dt)
155
-
156
- def __1_日期移动(self):
157
- pass
158
-
159
- def add_days(self, days):
160
- """ 增加指定天数,支持负数 """
161
- return self.__class__(self.dt + datetime.timedelta(days=days))
162
-
163
- def monday(self):
164
- """ 移动到本周周一 """
165
- return self.add_days(-self.dt.weekday())
166
-
167
- def next_week(self):
168
- """ 移动到下一周 """
169
- return self.add_days(7)
170
-
171
- def prev_week(self):
172
- """ 移动到上一周 """
173
- return self.add_days(-7)
174
-
175
- def __2_生成标签(self):
176
- pass
177
-
178
- def weektag(self):
179
- """
180
- :return: 周标签名,例如 'w250414',表示所属周的周一是2025年4月14日
181
- """
182
- monday = self.monday() # 获取本周周一
183
- tag = 'w' + monday.strftime('%y%m%d')
184
- return tag
185
-
186
- def daytag(self):
187
- """
188
- :return: 日标签名,例如 '250415周二',表示当天的日期标记,一般是语雀周报中使用
189
- """
190
- ch = '一二三四五六日'[self.dt.weekday()]
191
- tag = self.dt.strftime('%y%m%d') + '周' + ch
192
- return tag
193
-
194
- def week_daytags(self):
195
- # 循环获得本周每天的daytag
196
- monday = self.monday()
197
- tags = [monday.add_days(i).daytag() for i in range(7)]
198
- return tags
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # @Author : 陈坤泽
4
+ # @Email : 877362867@qq.com
5
+ # @Date : 2021/06/03 23:28
6
+
7
+ """
8
+
9
+ 旧的Datetime类已删除,原来稍微比较有用的一个功能,是
10
+
11
+ 替换周几,这个算法可以参考:
12
+ a = a - a.isoweekday() + kwargs['weekday'] # 先减去当前星期几,再加上1~7的一个目标星期
13
+
14
+ """
15
+
16
+ import datetime
17
+ import re
18
+
19
+ from fastcore.utils import GetAttr
20
+
21
+
22
+ def parse_datetime(*argv):
23
+ """ 解析字符串日期时间
24
+
25
+ 解析算法偏私人应用,规则虽然多,但反而变得混乱隐晦,
26
+ 实际开发能明确使用具体接口,尽量还是用具体接口。
27
+
28
+ # 建议使用 Datetime.strptime
29
+ >>> parse_datetime('2019年3月6日', '%Y年%m月%d日') # 指定格式
30
+ datetime.datetime(2019, 3, 6, 0, 0)
31
+ >>> parse_datetime('w200301周日', 'w%y%m%d周日') # 周日必须写全,有缺失会报ValueError
32
+ datetime.datetime(2020, 3, 1, 0, 0)
33
+
34
+ >>> parse_datetime('2019.3.6 22:30:40')
35
+ datetime.datetime(2019, 3, 6, 22, 30, 40)
36
+
37
+ >>> parse_datetime(180213)
38
+ datetime.datetime(2018, 2, 13, 0, 0)
39
+ >>> parse_datetime('180213')
40
+ datetime.datetime(2018, 2, 13, 0, 0)
41
+
42
+ # 以下只对2000~2099年的时间点有效
43
+ >>> parse_datetime('2015-06-15_22-19-01_HDR.jpg')
44
+ datetime.datetime(2015, 6, 15, 22, 19, 1)
45
+ >>> parse_datetime('IMG_20150615_2219011234_HDR.jpg')
46
+ datetime.datetime(2015, 6, 15, 22, 19, 1, 1234)
47
+ >>> parse_datetime('_2015.6.15_22:19:02')
48
+ datetime.datetime(2015, 6, 15, 22, 19, 2)
49
+ """
50
+
51
+ def _datetime(argv):
52
+ args, n = list(argv), len(argv)
53
+ if n < 3: # 若没填写月、日,默认1月、1日
54
+ args = args + [1] * (3 - n)
55
+ try:
56
+ return datetime.datetime(*args)
57
+ except (ValueError, TypeError) as e:
58
+ return None
59
+
60
+ def _six_digits_date(s):
61
+ """主要是我个人常用的日期标注格式
62
+ """
63
+ s, dt = str(s), None
64
+ if re.match(r'\d{6}$', s):
65
+ year = int(s[:2])
66
+ year = 2000 + year if year < 50 else 1900 + year # 小于50默认是20xx年,否则认为是19xx年
67
+ dt = _datetime([year, int(s[2:4]), int(s[4:])])
68
+ return dt
69
+
70
+ def _parse_time_string(s):
71
+ r"""只对2000~2099年的时间点有效
72
+ """
73
+ data, break_flag = [], False
74
+
75
+ def parse(pattern, left=None, right=None):
76
+ """通用底层解析器"""
77
+ nonlocal break_flag, s
78
+ if break_flag: return
79
+
80
+ m = re.search(pattern, s)
81
+ if m:
82
+ d = int(m.group())
83
+ if left and d < left:
84
+ break_flag = True
85
+ elif right and d > right:
86
+ break_flag = True
87
+ else:
88
+ data.append(d)
89
+ s = s[m.end():]
90
+ else:
91
+ break_flag = True
92
+
93
+ parse(r'20\d{2}')
94
+ parse(r'\d\d?', 1, 12) # 有连续两个数组就获得两个,否则获得一个也行
95
+ parse(r'\d\d?', 1, 31) # 这样其实不严谨,有的月份不到31天,不过反正_datetime会返回None代表处理失败的
96
+ parse(r'\d\d?', 0, 23)
97
+ parse(r'\d\d?', 0, 59)
98
+ parse(r'\d\d?', 0, 59)
99
+ parse(r'\d{1,6}') # microsecond
100
+
101
+ return _datetime(data)
102
+
103
+ dt = None
104
+ # 1 没有参数则默认当前运行时间
105
+ if not argv:
106
+ dt = datetime.datetime.now()
107
+ if not dt and isinstance(argv[0], datetime.datetime):
108
+ dt = argv[0]
109
+ if not dt and isinstance(argv[0], datetime.date):
110
+ # 要转成datetime类型,time部分默认00:00:00
111
+ dt = datetime.datetime.combine(argv[0], datetime.time())
112
+ if not dt and isinstance(argv[0], float):
113
+ dt = datetime.datetime.fromtimestamp(argv[0])
114
+ # 2 如果上述解析不了,且argv恰好为两个参数,则判断为使用strptime初始化
115
+ if not dt and len(argv) == 2:
116
+ dt = datetime.datetime.strptime(str(argv[0]), argv[1])
117
+ # 3 判断是否我个人特用的六位日期标记
118
+ if not dt:
119
+ dt = _six_digits_date(argv[0])
120
+ # 4 如果仍然解析不了,开始使用一个智能推导算法
121
+ if not dt:
122
+ dt = _parse_time_string(argv[0])
123
+ # 5 最后任何解析方案都失败,则返回None
124
+
125
+ return dt
126
+
127
+
128
+ def parse_timedelta(s):
129
+ """ 解析字符串所代表的时间差
130
+
131
+ >>> parse_timedelta('38:18')
132
+ datetime.timedelta(seconds=2298)
133
+ >>> parse_timedelta('03:55')
134
+ datetime.timedelta(seconds=235)
135
+ >>> parse_timedelta('1:34:25')
136
+ datetime.timedelta(seconds=5665)
137
+ """
138
+ parts = s.split(':')[::-1]
139
+ d = {k: int(v) for k, v in zip(['seconds', 'minutes', 'hours'], parts)}
140
+ td = datetime.timedelta(**d)
141
+ return td
142
+
143
+
144
+ class XlWeekTag(GetAttr):
145
+ """ 个人周标签转换工具 """
146
+ _default = 'dt'
147
+
148
+ def __init__(self, dt=None):
149
+ """
150
+ :param datetime|其他类日期表达 dt: 可以输入一个日期,默认为今天
151
+ """
152
+ if dt is None:
153
+ dt = datetime.date.today()
154
+ self.dt = parse_datetime(dt)
155
+
156
+ def __1_日期移动(self):
157
+ pass
158
+
159
+ def add_days(self, days):
160
+ """ 增加指定天数,支持负数 """
161
+ return self.__class__(self.dt + datetime.timedelta(days=days))
162
+
163
+ def monday(self):
164
+ """ 移动到本周周一 """
165
+ return self.add_days(-self.dt.weekday())
166
+
167
+ def next_week(self):
168
+ """ 移动到下一周 """
169
+ return self.add_days(7)
170
+
171
+ def prev_week(self):
172
+ """ 移动到上一周 """
173
+ return self.add_days(-7)
174
+
175
+ def __2_生成标签(self):
176
+ pass
177
+
178
+ def weektag(self):
179
+ """
180
+ :return: 周标签名,例如 'w250414',表示所属周的周一是2025年4月14日
181
+ """
182
+ monday = self.monday() # 获取本周周一
183
+ tag = 'w' + monday.strftime('%y%m%d')
184
+ return tag
185
+
186
+ def daytag(self):
187
+ """
188
+ :return: 日标签名,例如 '250415周二',表示当天的日期标记,一般是语雀周报中使用
189
+ """
190
+ ch = '一二三四五六日'[self.dt.weekday()]
191
+ tag = self.dt.strftime('%y%m%d') + '周' + ch
192
+ return tag
193
+
194
+ def week_daytags(self):
195
+ # 循环获得本周每天的daytag
196
+ monday = self.monday()
197
+ tags = [monday.add_days(i).daytag() for i in range(7)]
198
+ return tags
199
199