re-common 10.0.39__py3-none-any.whl → 10.0.41__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 (221) hide show
  1. re_common/baselibrary/__init__.py +4 -4
  2. re_common/baselibrary/baseabs/__init__.py +6 -6
  3. re_common/baselibrary/baseabs/baseabs.py +26 -26
  4. re_common/baselibrary/database/mbuilder.py +132 -132
  5. re_common/baselibrary/database/moudle.py +93 -93
  6. re_common/baselibrary/database/msqlite3.py +194 -194
  7. re_common/baselibrary/database/mysql.py +169 -169
  8. re_common/baselibrary/database/sql_factory.py +26 -26
  9. re_common/baselibrary/mthread/MThreadingRun.py +486 -486
  10. re_common/baselibrary/mthread/MThreadingRunEvent.py +349 -349
  11. re_common/baselibrary/mthread/__init__.py +2 -2
  12. re_common/baselibrary/mthread/mythreading.py +695 -695
  13. re_common/baselibrary/pakge_other/socks.py +404 -404
  14. re_common/baselibrary/readconfig/config_factory.py +18 -18
  15. re_common/baselibrary/readconfig/ini_config.py +317 -317
  16. re_common/baselibrary/readconfig/toml_config.py +49 -49
  17. re_common/baselibrary/temporary/envdata.py +36 -36
  18. re_common/baselibrary/tools/all_requests/aiohttp_request.py +118 -118
  19. re_common/baselibrary/tools/all_requests/httpx_requet.py +102 -102
  20. re_common/baselibrary/tools/all_requests/mrequest.py +412 -412
  21. re_common/baselibrary/tools/all_requests/requests_request.py +81 -81
  22. re_common/baselibrary/tools/batch_compre/bijiao_batch.py +31 -31
  23. re_common/baselibrary/tools/contrast_db3.py +123 -123
  24. re_common/baselibrary/tools/copy_file.py +39 -39
  25. re_common/baselibrary/tools/db3_2_sizedb3.py +102 -102
  26. re_common/baselibrary/tools/foreachgz.py +39 -39
  27. re_common/baselibrary/tools/get_attr.py +10 -10
  28. re_common/baselibrary/tools/image_to_pdf.py +61 -61
  29. re_common/baselibrary/tools/java_code_deal.py +139 -139
  30. re_common/baselibrary/tools/javacode.py +79 -79
  31. re_common/baselibrary/tools/mdb_db3.py +48 -48
  32. re_common/baselibrary/tools/merge_file.py +171 -171
  33. re_common/baselibrary/tools/merge_gz_file.py +165 -165
  34. re_common/baselibrary/tools/mhdfstools/down_hdfs_files.py +42 -42
  35. re_common/baselibrary/tools/mhdfstools/hdfst.py +42 -42
  36. re_common/baselibrary/tools/mhdfstools/up_hdfs_files.py +38 -38
  37. re_common/baselibrary/tools/mongo_tools.py +50 -50
  38. re_common/baselibrary/tools/move_file.py +170 -170
  39. re_common/baselibrary/tools/move_mongo/mongo_table_to_file.py +63 -63
  40. re_common/baselibrary/tools/move_mongo/move_mongo_table.py +354 -354
  41. re_common/baselibrary/tools/move_mongo/use_mttf.py +18 -18
  42. re_common/baselibrary/tools/move_mongo/use_mv.py +93 -93
  43. re_common/baselibrary/tools/mpandas/mpandasreadexcel.py +125 -125
  44. re_common/baselibrary/tools/mpandas/pandas_visualization.py +7 -7
  45. re_common/baselibrary/tools/myparsel.py +104 -104
  46. re_common/baselibrary/tools/rename_dir_file.py +37 -37
  47. re_common/baselibrary/tools/sequoiadb_utils.py +398 -398
  48. re_common/baselibrary/tools/split_line_to_many.py +25 -25
  49. re_common/baselibrary/tools/stringtodicts.py +33 -33
  50. re_common/baselibrary/tools/workwechant_bot.py +84 -84
  51. re_common/baselibrary/utils/baseaiohttp.py +296 -296
  52. re_common/baselibrary/utils/baseaiomysql.py +87 -87
  53. re_common/baselibrary/utils/baseallstep.py +191 -191
  54. re_common/baselibrary/utils/baseavro.py +19 -19
  55. re_common/baselibrary/utils/baseboto3.py +291 -291
  56. re_common/baselibrary/utils/basecsv.py +32 -32
  57. re_common/baselibrary/utils/basedict.py +133 -133
  58. re_common/baselibrary/utils/basedir.py +241 -241
  59. re_common/baselibrary/utils/baseencode.py +351 -351
  60. re_common/baselibrary/utils/baseencoding.py +28 -28
  61. re_common/baselibrary/utils/baseesdsl.py +86 -86
  62. re_common/baselibrary/utils/baseexcel.py +264 -264
  63. re_common/baselibrary/utils/baseexcept.py +109 -109
  64. re_common/baselibrary/utils/basefile.py +654 -654
  65. re_common/baselibrary/utils/baseftp.py +214 -214
  66. re_common/baselibrary/utils/basegzip.py +60 -60
  67. re_common/baselibrary/utils/basehdfs.py +135 -135
  68. re_common/baselibrary/utils/basehttpx.py +268 -268
  69. re_common/baselibrary/utils/baseip.py +87 -87
  70. re_common/baselibrary/utils/basejson.py +2 -2
  71. re_common/baselibrary/utils/baselist.py +32 -32
  72. re_common/baselibrary/utils/basemotor.py +190 -190
  73. re_common/baselibrary/utils/basemssql.py +98 -98
  74. re_common/baselibrary/utils/baseodbc.py +113 -113
  75. re_common/baselibrary/utils/basepandas.py +302 -302
  76. re_common/baselibrary/utils/basepeewee.py +11 -11
  77. re_common/baselibrary/utils/basepika.py +180 -180
  78. re_common/baselibrary/utils/basepydash.py +143 -143
  79. re_common/baselibrary/utils/basepymongo.py +230 -230
  80. re_common/baselibrary/utils/basequeue.py +22 -22
  81. re_common/baselibrary/utils/baserar.py +57 -57
  82. re_common/baselibrary/utils/baserequest.py +279 -279
  83. re_common/baselibrary/utils/baseset.py +8 -8
  84. re_common/baselibrary/utils/basesmb.py +403 -403
  85. re_common/baselibrary/utils/basestring.py +382 -382
  86. re_common/baselibrary/utils/basetime.py +320 -320
  87. re_common/baselibrary/utils/baseurl.py +121 -121
  88. re_common/baselibrary/utils/basezip.py +57 -57
  89. re_common/baselibrary/utils/core/__init__.py +7 -7
  90. re_common/baselibrary/utils/core/bottomutils.py +18 -18
  91. re_common/baselibrary/utils/core/mdeprecated.py +327 -327
  92. re_common/baselibrary/utils/core/mlamada.py +16 -16
  93. re_common/baselibrary/utils/core/msginfo.py +25 -25
  94. re_common/baselibrary/utils/core/requests_core.py +103 -103
  95. re_common/baselibrary/utils/fateadm.py +429 -429
  96. re_common/baselibrary/utils/importfun.py +123 -123
  97. re_common/baselibrary/utils/mfaker.py +57 -57
  98. re_common/baselibrary/utils/my_abc/__init__.py +3 -3
  99. re_common/baselibrary/utils/my_abc/better_abc.py +32 -32
  100. re_common/baselibrary/utils/mylogger.py +414 -414
  101. re_common/baselibrary/utils/myredisclient.py +861 -861
  102. re_common/baselibrary/utils/pipupgrade.py +21 -21
  103. re_common/baselibrary/utils/ringlist.py +85 -85
  104. re_common/baselibrary/utils/version_compare.py +36 -36
  105. re_common/baselibrary/utils/ydmhttp.py +126 -126
  106. re_common/facade/lazy_import.py +11 -11
  107. re_common/facade/loggerfacade.py +25 -25
  108. re_common/facade/mysqlfacade.py +467 -467
  109. re_common/facade/now.py +31 -31
  110. re_common/facade/sqlite3facade.py +257 -257
  111. re_common/facade/use/mq_use_facade.py +83 -83
  112. re_common/facade/use/proxy_use_facade.py +19 -19
  113. re_common/libtest/base_dict_test.py +19 -19
  114. re_common/libtest/baseavro_test.py +13 -13
  115. re_common/libtest/basefile_test.py +14 -14
  116. re_common/libtest/basemssql_test.py +77 -77
  117. re_common/libtest/baseodbc_test.py +7 -7
  118. re_common/libtest/basepandas_test.py +38 -38
  119. re_common/libtest/get_attr_test/get_attr_test_settings.py +14 -14
  120. re_common/libtest/get_attr_test/settings.py +54 -54
  121. re_common/libtest/idencode_test.py +53 -53
  122. re_common/libtest/iniconfig_test.py +35 -35
  123. re_common/libtest/ip_test.py +34 -34
  124. re_common/libtest/merge_file_test.py +20 -20
  125. re_common/libtest/mfaker_test.py +8 -8
  126. re_common/libtest/mm3_test.py +31 -31
  127. re_common/libtest/mylogger_test.py +88 -88
  128. re_common/libtest/myparsel_test.py +27 -27
  129. re_common/libtest/mysql_test.py +151 -151
  130. re_common/libtest/pymongo_test.py +21 -21
  131. re_common/libtest/split_test.py +11 -11
  132. re_common/libtest/sqlite3_merge_test.py +5 -5
  133. re_common/libtest/sqlite3_test.py +34 -34
  134. re_common/libtest/tomlconfig_test.py +30 -30
  135. re_common/libtest/use_tools_test/__init__.py +2 -2
  136. re_common/libtest/user/__init__.py +4 -4
  137. re_common/studio/__init__.py +4 -4
  138. re_common/studio/assignment_expressions.py +36 -36
  139. re_common/studio/mydash/test1.py +18 -18
  140. re_common/studio/pydashstudio/first.py +9 -9
  141. re_common/studio/streamlitstudio/first_app.py +65 -65
  142. re_common/studio/streamlitstudio/uber_pickups.py +23 -23
  143. re_common/studio/test.py +18 -18
  144. re_common/v2/baselibrary/business_utils/BusinessStringUtil.py +235 -220
  145. re_common/v2/baselibrary/business_utils/baseencodeid.py +100 -100
  146. re_common/v2/baselibrary/business_utils/full_doi_path.py +116 -116
  147. re_common/v2/baselibrary/business_utils/rel_tools.py +6 -6
  148. re_common/v2/baselibrary/decorators/utils.py +59 -59
  149. re_common/v2/baselibrary/helpers/search_packge/NearestNeighbors_test.py +105 -105
  150. re_common/v2/baselibrary/helpers/search_packge/fit_text_match.py +253 -253
  151. re_common/v2/baselibrary/helpers/search_packge/scikit_learn_text_matcher.py +260 -260
  152. re_common/v2/baselibrary/helpers/search_packge/test.py +1 -1
  153. re_common/v2/baselibrary/s3object/baseboto3.py +230 -230
  154. re_common/v2/baselibrary/tools/WeChatRobot.py +95 -95
  155. re_common/v2/baselibrary/tools/ac_ahocorasick.py +75 -75
  156. re_common/v2/baselibrary/tools/concurrency.py +35 -35
  157. re_common/v2/baselibrary/tools/data_processer/base.py +53 -53
  158. re_common/v2/baselibrary/tools/data_processer/data_processer.py +497 -508
  159. re_common/v2/baselibrary/tools/data_processer/data_reader.py +187 -187
  160. re_common/v2/baselibrary/tools/data_processer/data_writer.py +38 -38
  161. re_common/v2/baselibrary/tools/dict_tools.py +44 -44
  162. re_common/v2/baselibrary/tools/dolphinscheduler.py +187 -187
  163. re_common/v2/baselibrary/tools/hdfs_base_processor.py +204 -204
  164. re_common/v2/baselibrary/tools/hdfs_bulk_processor.py +67 -67
  165. re_common/v2/baselibrary/tools/hdfs_data_processer.py +338 -338
  166. re_common/v2/baselibrary/tools/hdfs_line_processor.py +74 -74
  167. re_common/v2/baselibrary/tools/list_tools.py +69 -69
  168. re_common/v2/baselibrary/tools/resume_tracker.py +94 -94
  169. re_common/v2/baselibrary/tools/search_hash_tools.py +54 -54
  170. re_common/v2/baselibrary/tools/text_matcher.py +326 -326
  171. re_common/v2/baselibrary/tools/tree_processor/__init__.py +0 -0
  172. re_common/v2/baselibrary/tools/tree_processor/builder.py +25 -0
  173. re_common/v2/baselibrary/tools/tree_processor/node.py +13 -0
  174. re_common/v2/baselibrary/tools/unionfind_tools.py +60 -60
  175. re_common/v2/baselibrary/utils/BusinessStringUtil.py +196 -196
  176. re_common/v2/baselibrary/utils/api_net_utils.py +270 -270
  177. re_common/v2/baselibrary/utils/author_smi.py +361 -361
  178. re_common/v2/baselibrary/utils/base_string_similarity.py +158 -158
  179. re_common/v2/baselibrary/utils/basedict.py +37 -37
  180. re_common/v2/baselibrary/utils/basehdfs.py +163 -163
  181. re_common/v2/baselibrary/utils/basepika.py +180 -180
  182. re_common/v2/baselibrary/utils/basetime.py +94 -77
  183. re_common/v2/baselibrary/utils/db.py +174 -156
  184. re_common/v2/baselibrary/utils/elasticsearch.py +46 -0
  185. re_common/v2/baselibrary/utils/json_cls.py +16 -16
  186. re_common/v2/baselibrary/utils/mq.py +83 -83
  187. re_common/v2/baselibrary/utils/n_ary_expression_tree.py +243 -243
  188. re_common/v2/baselibrary/utils/string_bool.py +187 -186
  189. re_common/v2/baselibrary/utils/string_clear.py +246 -246
  190. re_common/v2/baselibrary/utils/string_smi.py +18 -18
  191. re_common/v2/baselibrary/utils/stringutils.py +312 -271
  192. re_common/vip/base_step_process.py +11 -11
  193. re_common/vip/baseencodeid.py +90 -90
  194. re_common/vip/changetaskname.py +28 -28
  195. re_common/vip/core_var.py +24 -24
  196. re_common/vip/mmh3Hash.py +89 -89
  197. re_common/vip/proxy/allproxys.py +127 -127
  198. re_common/vip/proxy/allproxys_thread.py +159 -159
  199. re_common/vip/proxy/cnki_proxy.py +153 -153
  200. re_common/vip/proxy/kuaidaili.py +87 -87
  201. re_common/vip/proxy/proxy_all.py +113 -113
  202. re_common/vip/proxy/update_kuaidaili_0.py +42 -42
  203. re_common/vip/proxy/wanfang_proxy.py +152 -152
  204. re_common/vip/proxy/wp_proxy_all.py +181 -181
  205. re_common/vip/read_rawid_to_txt.py +91 -91
  206. re_common/vip/title/__init__.py +5 -5
  207. re_common/vip/title/transform/TransformBookTitleToZt.py +125 -125
  208. re_common/vip/title/transform/TransformConferenceTitleToZt.py +139 -139
  209. re_common/vip/title/transform/TransformCstadTitleToZt.py +195 -195
  210. re_common/vip/title/transform/TransformJournalTitleToZt.py +203 -203
  211. re_common/vip/title/transform/TransformPatentTitleToZt.py +132 -132
  212. re_common/vip/title/transform/TransformRegulationTitleToZt.py +114 -114
  213. re_common/vip/title/transform/TransformStandardTitleToZt.py +135 -135
  214. re_common/vip/title/transform/TransformThesisTitleToZt.py +135 -135
  215. re_common/vip/title/transform/__init__.py +10 -10
  216. {re_common-10.0.39.dist-info → re_common-10.0.41.dist-info}/LICENSE +201 -201
  217. {re_common-10.0.39.dist-info → re_common-10.0.41.dist-info}/METADATA +16 -16
  218. re_common-10.0.41.dist-info/RECORD +252 -0
  219. {re_common-10.0.39.dist-info → re_common-10.0.41.dist-info}/WHEEL +1 -1
  220. re_common-10.0.39.dist-info/RECORD +0 -248
  221. {re_common-10.0.39.dist-info → re_common-10.0.41.dist-info}/top_level.txt +0 -0
@@ -1,241 +1,241 @@
1
- import os
2
- import shutil
3
- import warnings
4
-
5
- from re_common.baselibrary.utils.basefile import BaseFile
6
-
7
-
8
- class BaseDir(object):
9
-
10
- @classmethod
11
- def get_dir_all_files(cls, path):
12
- """
13
- 返回所有的文件 不会返回目录 目的是得到一个文件列表
14
- # 这里注意topdown参数。
15
- # topdown决定遍历的顺序,
16
- # 如果topdown为True,则先列举top下的目录,然后是目录的目录,依次类推;
17
- # 反之,则先递归列举出最深层的子目录,然后是其兄弟目录,然后父目录。
18
- # 我们需要先修改深层的子目录
19
- :param path: 给定一个路径 如 C:/Users/XD/Pictures/所有视频/
20
- :return:
21
- """
22
- # 遍历子目录
23
- assert cls.is_dir(path), NotADirectoryError(path + " not is a dir please check")
24
- for path, dirNames, fileNames in os.walk(path, topdown=True):
25
- # 获取当前目录的所有文件
26
- for fileName in fileNames:
27
- yield os.path.join(path, fileName)
28
-
29
- @classmethod
30
- def get_dir_all_dir(cls, s_path):
31
- """
32
- 获取目录下的最深子目录
33
- # 这里注意topdown参数。
34
- # topdown决定遍历的顺序,
35
- # 如果topdown为True,则先列举top下的目录,然后是目录的目录,依次类推;
36
- # 反之,则先递归列举出最深层的子目录,然后是其兄弟目录,然后父目录。
37
- # 我们需要先修改深层的子目录
38
- :param path: 给定一个路径 如 C:/Users/XD/Pictures/所有视频/
39
- :return:
40
- """
41
- # 遍历子目录
42
- assert cls.is_dir(s_path), NotADirectoryError(s_path + " not is a dir please check")
43
- for path, dirNames, fileNames in os.walk(s_path, topdown=False):
44
- # 获取当前目录的所有文件
45
- for one_dir in dirNames:
46
- f_path = os.path.join(path, one_dir)
47
- for path1, dirNames1, fileNames1 in os.walk(f_path):
48
- if len(dirNames1) == 0:
49
- yield f_path
50
- # break 原因是当一个目录有子目录时 会循环子目录,所以一次判断就可以了
51
- break
52
-
53
- @classmethod
54
- def is_dir_exists(cls, pathdir):
55
- """
56
- 目录是否存在
57
- :param sPth:
58
- :return:
59
- """
60
- return os.path.exists(pathdir)
61
-
62
- @classmethod
63
- def create_dir(cls, pathdir):
64
- """
65
- 创建目录 该方法可以创建多级目录
66
- os.mkdir(pathdir)是创建一级目录 该目录的上级目录必须存在
67
- :param pathdir:
68
- :return:
69
- """
70
- if not cls.is_dir_exists(pathdir):
71
- os.makedirs(pathdir)
72
-
73
- @classmethod
74
- def get_upper_dir(cls, curPath: str, num: int) -> str:
75
- """
76
- 获取上几层的目录,如果包含文件名 -1 代表着这个文件的目录
77
- :param curPath:
78
- :param num:
79
- :return:
80
- """
81
- # 如果不是个整数
82
- if not isinstance(num, int) or num > 0:
83
- warnings.warn("this not int or num > 0 , The path is not processed, return curPath")
84
- return curPath
85
- pathlist = curPath.split(os.sep)
86
- if abs(num) > (len(pathlist) - 1):
87
- warnings.warn("this path length < num ,will return root dir ")
88
- num = (len(pathlist) - 1) * (-1)
89
- pathlist = pathlist[:num]
90
- TopPath = os.sep.join(pathlist)
91
- return TopPath
92
-
93
- @classmethod
94
- def get_file_dir_absolute(cls, file):
95
- """
96
- 请传入 __file__ 作为参数
97
- 获取一个文件的绝对路径
98
- :param __file__:
99
- :return:
100
- """
101
- curPath = os.path.dirname(os.path.abspath(file))
102
- return curPath
103
-
104
- @classmethod
105
- def is_dir(cls, spath):
106
- if os.path.isdir(spath):
107
- return True
108
- return False
109
-
110
- @classmethod
111
- def get_dir_size(cls, dirpath):
112
- """
113
- 1eb = 1024pb
114
- 1pb = 1024tb
115
- 1tb = 1024gb
116
- 1gb = 1024mb
117
- 1mb = 1024kb
118
- 1kb = 1024b
119
- 上面的b是Byte
120
- 1Byte = 8bit
121
- :param dirpath:
122
- :return: 这里返回的是Byte大小
123
- """
124
- size = 0
125
- for filepath in cls.get_dir_all_files(dirpath):
126
- size += sum(BaseFile.get_file_size(filepath))
127
- return size
128
-
129
- @classmethod
130
- def copy_file_to_dir(cls, filePath, tarDirPath):
131
- """
132
-
133
- :param filePath: 文件路径
134
- :param tarDirPath: 目录或文件路径
135
- :return:
136
- """
137
- assert BaseFile.is_file_exists(filePath), FileNotFoundError("需要copy的文件不存在")
138
- assert BaseFile.is_file(filePath), FileNotFoundError("需要copy的不是一个文件")
139
- cls.create_dir(tarDirPath)
140
- shutil.copy(filePath, tarDirPath)
141
-
142
- @classmethod
143
- def copy_dir_to_dir(cls, oldDir, newDir, moudle=0):
144
- """
145
- olddir和newdir都只能是目录,且newdir必须不存在
146
- :param oldDir:
147
- :param newDir:
148
- :return:
149
- """
150
- assert cls.is_dir(oldDir), IsADirectoryError(oldDir + "目录不存在")
151
- if moudle == 0:
152
- # 该模式下新目录必须不存在
153
- assert not cls.is_dir(newDir), IsADirectoryError(newDir + "目录存在,不能使用该模式,推荐使用模式2")
154
- shutil.copytree(oldDir, newDir)
155
- elif moudle == 1:
156
- # 该模式下如果新目录存在先删除新目录
157
- if cls.is_dir(newDir):
158
- cls.delete_dir(newDir)
159
- shutil.copytree(oldDir, newDir)
160
- elif moudle == 3:
161
- # 该模式下通过替换进行copy
162
- pass
163
- elif moudle == 4:
164
- # 该模式会跳过已存在的文件 只将新文件放入其中
165
- pass
166
-
167
- @classmethod
168
- def delete_dir(cls, dirpath):
169
- """
170
- os.rmdir(dirpath) 只能删除空目录
171
- os.removedirs(path) 递归的删除目录
172
- :param dirpath:
173
- :return:
174
- """
175
- shutil.rmtree(dirpath)
176
-
177
- @classmethod
178
- def replace_dir_special_string(cls, strings):
179
- """
180
- windows 目录非法字符
181
- :param strings:
182
- :return:
183
- """
184
- strings1 = strings.replace("/", "").replace("\\", "") \
185
- .replace(":", "").replace("*", "").replace("\"", "") \
186
- .replace("<", "").replace(">", "").replace("|", "") \
187
- .replace("?", "")
188
- return strings1
189
-
190
- @classmethod
191
- def remove_file_suf(cls, dirpath, suf):
192
- for file in cls.get_dir_all_files(dirpath):
193
- if file.endswith(suf):
194
- BaseFile.remove_file(file)
195
-
196
- @classmethod
197
- def is_null_dir(cls, dirpath):
198
- """
199
- 是否为空目录
200
- :param dirpath:
201
- :return:
202
- """
203
- if not os.listdir(dirpath):
204
- return True
205
- return False
206
-
207
- @classmethod
208
- def get_dir_file_num(cls, dirpath):
209
- return len([name for name in os.listdir(dirpath) if os.path.isfile(os.path.join(dirpath, name))])
210
-
211
- @classmethod
212
- def get_dir_all_file_num(cls, dirpath, ext=None):
213
- """
214
- 获取目录下所有文件个数,包含目录下目录的个数
215
- :return:
216
- """
217
- count = 0
218
- for path in cls.get_dir_all_files(dirpath):
219
- if BaseFile.is_file(path):
220
- if ext is not None:
221
- if path.endswith(ext):
222
- count += 1
223
- elif cls.is_dir(path):
224
- count = count + cls.get_dir_all_file_num(path, ext)
225
- return count
226
-
227
- @classmethod
228
- def get_dir_all_file_size(cls, dirpath, ext=None):
229
- """
230
- 获取目录下所有文件的总大小
231
- :return:
232
- """
233
- count = 0
234
- for path in cls.get_dir_all_files(dirpath):
235
- if BaseFile.is_file(path):
236
- if ext is not None:
237
- if path.endswith(ext):
238
- count = count + BaseFile.get_file_size(path)
239
- elif cls.is_dir(path):
240
- count = count + cls.get_dir_all_file_num(path, ext)
241
- return count
1
+ import os
2
+ import shutil
3
+ import warnings
4
+
5
+ from re_common.baselibrary.utils.basefile import BaseFile
6
+
7
+
8
+ class BaseDir(object):
9
+
10
+ @classmethod
11
+ def get_dir_all_files(cls, path):
12
+ """
13
+ 返回所有的文件 不会返回目录 目的是得到一个文件列表
14
+ # 这里注意topdown参数。
15
+ # topdown决定遍历的顺序,
16
+ # 如果topdown为True,则先列举top下的目录,然后是目录的目录,依次类推;
17
+ # 反之,则先递归列举出最深层的子目录,然后是其兄弟目录,然后父目录。
18
+ # 我们需要先修改深层的子目录
19
+ :param path: 给定一个路径 如 C:/Users/XD/Pictures/所有视频/
20
+ :return:
21
+ """
22
+ # 遍历子目录
23
+ assert cls.is_dir(path), NotADirectoryError(path + " not is a dir please check")
24
+ for path, dirNames, fileNames in os.walk(path, topdown=True):
25
+ # 获取当前目录的所有文件
26
+ for fileName in fileNames:
27
+ yield os.path.join(path, fileName)
28
+
29
+ @classmethod
30
+ def get_dir_all_dir(cls, s_path):
31
+ """
32
+ 获取目录下的最深子目录
33
+ # 这里注意topdown参数。
34
+ # topdown决定遍历的顺序,
35
+ # 如果topdown为True,则先列举top下的目录,然后是目录的目录,依次类推;
36
+ # 反之,则先递归列举出最深层的子目录,然后是其兄弟目录,然后父目录。
37
+ # 我们需要先修改深层的子目录
38
+ :param path: 给定一个路径 如 C:/Users/XD/Pictures/所有视频/
39
+ :return:
40
+ """
41
+ # 遍历子目录
42
+ assert cls.is_dir(s_path), NotADirectoryError(s_path + " not is a dir please check")
43
+ for path, dirNames, fileNames in os.walk(s_path, topdown=False):
44
+ # 获取当前目录的所有文件
45
+ for one_dir in dirNames:
46
+ f_path = os.path.join(path, one_dir)
47
+ for path1, dirNames1, fileNames1 in os.walk(f_path):
48
+ if len(dirNames1) == 0:
49
+ yield f_path
50
+ # break 原因是当一个目录有子目录时 会循环子目录,所以一次判断就可以了
51
+ break
52
+
53
+ @classmethod
54
+ def is_dir_exists(cls, pathdir):
55
+ """
56
+ 目录是否存在
57
+ :param sPth:
58
+ :return:
59
+ """
60
+ return os.path.exists(pathdir)
61
+
62
+ @classmethod
63
+ def create_dir(cls, pathdir):
64
+ """
65
+ 创建目录 该方法可以创建多级目录
66
+ os.mkdir(pathdir)是创建一级目录 该目录的上级目录必须存在
67
+ :param pathdir:
68
+ :return:
69
+ """
70
+ if not cls.is_dir_exists(pathdir):
71
+ os.makedirs(pathdir)
72
+
73
+ @classmethod
74
+ def get_upper_dir(cls, curPath: str, num: int) -> str:
75
+ """
76
+ 获取上几层的目录,如果包含文件名 -1 代表着这个文件的目录
77
+ :param curPath:
78
+ :param num:
79
+ :return:
80
+ """
81
+ # 如果不是个整数
82
+ if not isinstance(num, int) or num > 0:
83
+ warnings.warn("this not int or num > 0 , The path is not processed, return curPath")
84
+ return curPath
85
+ pathlist = curPath.split(os.sep)
86
+ if abs(num) > (len(pathlist) - 1):
87
+ warnings.warn("this path length < num ,will return root dir ")
88
+ num = (len(pathlist) - 1) * (-1)
89
+ pathlist = pathlist[:num]
90
+ TopPath = os.sep.join(pathlist)
91
+ return TopPath
92
+
93
+ @classmethod
94
+ def get_file_dir_absolute(cls, file):
95
+ """
96
+ 请传入 __file__ 作为参数
97
+ 获取一个文件的绝对路径
98
+ :param __file__:
99
+ :return:
100
+ """
101
+ curPath = os.path.dirname(os.path.abspath(file))
102
+ return curPath
103
+
104
+ @classmethod
105
+ def is_dir(cls, spath):
106
+ if os.path.isdir(spath):
107
+ return True
108
+ return False
109
+
110
+ @classmethod
111
+ def get_dir_size(cls, dirpath):
112
+ """
113
+ 1eb = 1024pb
114
+ 1pb = 1024tb
115
+ 1tb = 1024gb
116
+ 1gb = 1024mb
117
+ 1mb = 1024kb
118
+ 1kb = 1024b
119
+ 上面的b是Byte
120
+ 1Byte = 8bit
121
+ :param dirpath:
122
+ :return: 这里返回的是Byte大小
123
+ """
124
+ size = 0
125
+ for filepath in cls.get_dir_all_files(dirpath):
126
+ size += sum(BaseFile.get_file_size(filepath))
127
+ return size
128
+
129
+ @classmethod
130
+ def copy_file_to_dir(cls, filePath, tarDirPath):
131
+ """
132
+
133
+ :param filePath: 文件路径
134
+ :param tarDirPath: 目录或文件路径
135
+ :return:
136
+ """
137
+ assert BaseFile.is_file_exists(filePath), FileNotFoundError("需要copy的文件不存在")
138
+ assert BaseFile.is_file(filePath), FileNotFoundError("需要copy的不是一个文件")
139
+ cls.create_dir(tarDirPath)
140
+ shutil.copy(filePath, tarDirPath)
141
+
142
+ @classmethod
143
+ def copy_dir_to_dir(cls, oldDir, newDir, moudle=0):
144
+ """
145
+ olddir和newdir都只能是目录,且newdir必须不存在
146
+ :param oldDir:
147
+ :param newDir:
148
+ :return:
149
+ """
150
+ assert cls.is_dir(oldDir), IsADirectoryError(oldDir + "目录不存在")
151
+ if moudle == 0:
152
+ # 该模式下新目录必须不存在
153
+ assert not cls.is_dir(newDir), IsADirectoryError(newDir + "目录存在,不能使用该模式,推荐使用模式2")
154
+ shutil.copytree(oldDir, newDir)
155
+ elif moudle == 1:
156
+ # 该模式下如果新目录存在先删除新目录
157
+ if cls.is_dir(newDir):
158
+ cls.delete_dir(newDir)
159
+ shutil.copytree(oldDir, newDir)
160
+ elif moudle == 3:
161
+ # 该模式下通过替换进行copy
162
+ pass
163
+ elif moudle == 4:
164
+ # 该模式会跳过已存在的文件 只将新文件放入其中
165
+ pass
166
+
167
+ @classmethod
168
+ def delete_dir(cls, dirpath):
169
+ """
170
+ os.rmdir(dirpath) 只能删除空目录
171
+ os.removedirs(path) 递归的删除目录
172
+ :param dirpath:
173
+ :return:
174
+ """
175
+ shutil.rmtree(dirpath)
176
+
177
+ @classmethod
178
+ def replace_dir_special_string(cls, strings):
179
+ """
180
+ windows 目录非法字符
181
+ :param strings:
182
+ :return:
183
+ """
184
+ strings1 = strings.replace("/", "").replace("\\", "") \
185
+ .replace(":", "").replace("*", "").replace("\"", "") \
186
+ .replace("<", "").replace(">", "").replace("|", "") \
187
+ .replace("?", "")
188
+ return strings1
189
+
190
+ @classmethod
191
+ def remove_file_suf(cls, dirpath, suf):
192
+ for file in cls.get_dir_all_files(dirpath):
193
+ if file.endswith(suf):
194
+ BaseFile.remove_file(file)
195
+
196
+ @classmethod
197
+ def is_null_dir(cls, dirpath):
198
+ """
199
+ 是否为空目录
200
+ :param dirpath:
201
+ :return:
202
+ """
203
+ if not os.listdir(dirpath):
204
+ return True
205
+ return False
206
+
207
+ @classmethod
208
+ def get_dir_file_num(cls, dirpath):
209
+ return len([name for name in os.listdir(dirpath) if os.path.isfile(os.path.join(dirpath, name))])
210
+
211
+ @classmethod
212
+ def get_dir_all_file_num(cls, dirpath, ext=None):
213
+ """
214
+ 获取目录下所有文件个数,包含目录下目录的个数
215
+ :return:
216
+ """
217
+ count = 0
218
+ for path in cls.get_dir_all_files(dirpath):
219
+ if BaseFile.is_file(path):
220
+ if ext is not None:
221
+ if path.endswith(ext):
222
+ count += 1
223
+ elif cls.is_dir(path):
224
+ count = count + cls.get_dir_all_file_num(path, ext)
225
+ return count
226
+
227
+ @classmethod
228
+ def get_dir_all_file_size(cls, dirpath, ext=None):
229
+ """
230
+ 获取目录下所有文件的总大小
231
+ :return:
232
+ """
233
+ count = 0
234
+ for path in cls.get_dir_all_files(dirpath):
235
+ if BaseFile.is_file(path):
236
+ if ext is not None:
237
+ if path.endswith(ext):
238
+ count = count + BaseFile.get_file_size(path)
239
+ elif cls.is_dir(path):
240
+ count = count + cls.get_dir_all_file_num(path, ext)
241
+ return count