oafuncs 0.0.76__py2.py3-none-any.whl → 0.0.78__py2.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.
- oafuncs/oa_cmap.py +73 -24
- oafuncs/oa_down/User_Agent-list.txt +59 -12
- oafuncs/oa_down/__init__.py +2 -3
- oafuncs/oa_down/hycom_3hourly.py +322 -281
- oafuncs/oa_down/test.py +24 -1
- oafuncs/oa_file.py +40 -4
- oafuncs/oa_nc.py +79 -73
- {oafuncs-0.0.76.dist-info → oafuncs-0.0.78.dist-info}/METADATA +9 -6
- {oafuncs-0.0.76.dist-info → oafuncs-0.0.78.dist-info}/RECORD +12 -13
- oafuncs/oa_down/refs_pdf.py +0 -338
- {oafuncs-0.0.76.dist-info → oafuncs-0.0.78.dist-info}/LICENSE.txt +0 -0
- {oafuncs-0.0.76.dist-info → oafuncs-0.0.78.dist-info}/WHEEL +0 -0
- {oafuncs-0.0.76.dist-info → oafuncs-0.0.78.dist-info}/top_level.txt +0 -0
oafuncs/oa_down/test.py
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
Author: Liu Kun && 16031215@qq.com
|
5
5
|
Date: 2024-12-01 19:32:25
|
6
6
|
LastEditors: Liu Kun && 16031215@qq.com
|
7
|
-
LastEditTime: 2024-12-01 19:
|
7
|
+
LastEditTime: 2024-12-01 19:50:32
|
8
8
|
FilePath: \\Python\\My_Funcs\\OAFuncs\\oafuncs\\oa_down\\test.py
|
9
9
|
Description:
|
10
10
|
EditPlatform: vscode
|
@@ -16,6 +16,24 @@ Python Version: 3.12
|
|
16
16
|
import os
|
17
17
|
import random
|
18
18
|
|
19
|
+
txtfile = r'E:\Code\Python\My_Funcs\OAFuncs\oafuncs\oa_down\User_Agent-list.txt'
|
20
|
+
|
21
|
+
with open(txtfile, 'r') as f:
|
22
|
+
lines = f.readlines()
|
23
|
+
# 去掉换行符和空行
|
24
|
+
lines = [line.strip() for line in lines if line.strip()]
|
25
|
+
new_line = []
|
26
|
+
for i in range(len(lines)):
|
27
|
+
if '/' in lines[i]:
|
28
|
+
new_line.append(lines[i])
|
29
|
+
else:
|
30
|
+
print(lines[i])
|
31
|
+
|
32
|
+
newtxtfile = r'E:\Code\Python\My_Funcs\OAFuncs\oafuncs\oa_down\ua_list_new.txt'
|
33
|
+
""" with open(newtxtfile, 'w') as f:
|
34
|
+
for line in new_line:
|
35
|
+
f.write(line + '\n') """
|
36
|
+
|
19
37
|
|
20
38
|
def get_ua():
|
21
39
|
current_dir = os.path.dirname(os.path.abspath(__file__))
|
@@ -99,6 +117,11 @@ def get_ua_org():
|
|
99
117
|
"Openwave/UCWEB7.0.2.37/28/999",
|
100
118
|
|
101
119
|
]
|
120
|
+
with open(newtxtfile, 'w') as f:
|
121
|
+
for line in ua_list:
|
122
|
+
f.write(line + '\n')
|
102
123
|
# print(f'Using User-Agent: {ua}')
|
103
124
|
ua = random.choice(ua_list)
|
104
125
|
return ua
|
126
|
+
|
127
|
+
# get_ua_org()
|
oafuncs/oa_file.py
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
Author: Liu Kun && 16031215@qq.com
|
5
5
|
Date: 2024-09-17 15:07:13
|
6
6
|
LastEditors: Liu Kun && 16031215@qq.com
|
7
|
-
LastEditTime: 2024-
|
7
|
+
LastEditTime: 2024-12-02 10:33:19
|
8
8
|
FilePath: \\Python\\My_Funcs\\OAFuncs\\oafuncs\\oa_file.py
|
9
9
|
Description:
|
10
10
|
EditPlatform: vscode
|
@@ -19,7 +19,43 @@ import os
|
|
19
19
|
import re
|
20
20
|
import shutil
|
21
21
|
|
22
|
-
__all__ = ['link_file', 'copy_file', '
|
22
|
+
__all__ = ['find_file', 'link_file', 'copy_file', 'rename_file', 'make_folder', 'clear_folder', 'remove_empty_folders', 'remove', 'file_size']
|
23
|
+
|
24
|
+
|
25
|
+
def find_file(parent_path, fname, mode='path'):
|
26
|
+
'''
|
27
|
+
description:
|
28
|
+
param {*} parent_path: The parent path where the files are located
|
29
|
+
param {*} fname: The file name pattern to search for
|
30
|
+
param {*} mode: 'path' to return the full path of the files, 'file' to return only the file names
|
31
|
+
return {*} A list of file paths or file names if files are found, None otherwise
|
32
|
+
'''
|
33
|
+
def natural_sort_key(s):
|
34
|
+
"""生成一个用于自然排序的键"""
|
35
|
+
return [int(text) if text.isdigit() else text.lower() for text in re.split('([0-9]+)', s)]
|
36
|
+
|
37
|
+
# 将parent_path和fname结合成完整的搜索路径
|
38
|
+
search_pattern = os.path.join(str(parent_path), fname)
|
39
|
+
|
40
|
+
# 使用glob模块查找所有匹配的文件
|
41
|
+
matched_files = glob.glob(search_pattern)
|
42
|
+
|
43
|
+
# 如果没有找到任何文件,则返回False
|
44
|
+
if not matched_files:
|
45
|
+
return None
|
46
|
+
|
47
|
+
# 在find_files函数中替换natsorted调用
|
48
|
+
matched_files = sorted(matched_files, key=natural_sort_key)
|
49
|
+
|
50
|
+
# 根据mode参数决定返回的内容
|
51
|
+
if mode == 'file':
|
52
|
+
# 只返回文件名
|
53
|
+
result = [os.path.basename(file) for file in matched_files]
|
54
|
+
else: # 默认为'path'
|
55
|
+
# 返回文件的绝对路径
|
56
|
+
result = [os.path.abspath(file) for file in matched_files]
|
57
|
+
|
58
|
+
return result
|
23
59
|
|
24
60
|
|
25
61
|
def link_file(src_pattern, dst):
|
@@ -113,14 +149,14 @@ def copy_file(src_pattern, dst):
|
|
113
149
|
print(f'复制文件或目录并重命名: {src_file} -> {dst_file}')
|
114
150
|
|
115
151
|
|
116
|
-
def
|
152
|
+
def rename_file(directory, old_str, new_str):
|
117
153
|
'''
|
118
154
|
# 描述:重命名目录下的文件,支持通配符
|
119
155
|
# 使用示例
|
120
156
|
directory_path = r"E:\windfarm\CROCO_FILES"
|
121
157
|
old_str = "croco"
|
122
158
|
new_str = "roms"
|
123
|
-
|
159
|
+
rename_file(directory_path, old_str, new_str)
|
124
160
|
param {*} directory # 目录
|
125
161
|
param {*} old_str # 要替换的字符串
|
126
162
|
param {*} new_str # 新字符串
|
oafuncs/oa_nc.py
CHANGED
@@ -1,18 +1,17 @@
|
|
1
1
|
#!/usr/bin/env python
|
2
2
|
# coding=utf-8
|
3
|
-
|
3
|
+
"""
|
4
4
|
Author: Liu Kun && 16031215@qq.com
|
5
5
|
Date: 2024-09-17 14:58:50
|
6
6
|
LastEditors: Liu Kun && 16031215@qq.com
|
7
|
-
LastEditTime: 2024-
|
7
|
+
LastEditTime: 2024-12-06 14:16:56
|
8
8
|
FilePath: \\Python\\My_Funcs\\OAFuncs\\oafuncs\\oa_nc.py
|
9
|
-
Description:
|
9
|
+
Description:
|
10
10
|
EditPlatform: vscode
|
11
11
|
ComputerInfo: XPS 15 9510
|
12
12
|
SystemInfo: Windows 11
|
13
13
|
Python Version: 3.11
|
14
|
-
|
15
|
-
|
14
|
+
"""
|
16
15
|
|
17
16
|
import os
|
18
17
|
|
@@ -20,16 +19,16 @@ import netCDF4 as nc
|
|
20
19
|
import numpy as np
|
21
20
|
import xarray as xr
|
22
21
|
|
23
|
-
__all__ = [
|
22
|
+
__all__ = ["get_var", "extract5nc", "write2nc", "merge5nc", "modify_var_value", "modify_var_attr", "rename_var_or_dim", "check_ncfile"]
|
24
23
|
|
25
24
|
|
26
25
|
def get_var(file, *vars):
|
27
|
-
|
26
|
+
"""
|
28
27
|
description: 读取nc文件中的变量
|
29
28
|
param {file: 文件路径, *vars: 变量名}
|
30
29
|
example: datas = get_var(file_ecm, 'h', 't', 'u', 'v')
|
31
30
|
return {datas: 变量数据}
|
32
|
-
|
31
|
+
"""
|
33
32
|
ds = xr.open_dataset(file)
|
34
33
|
datas = []
|
35
34
|
for var in vars:
|
@@ -40,7 +39,7 @@ def get_var(file, *vars):
|
|
40
39
|
|
41
40
|
|
42
41
|
def extract5nc(file, varname):
|
43
|
-
|
42
|
+
"""
|
44
43
|
描述:
|
45
44
|
1、提取nc文件中的变量
|
46
45
|
2、将相应维度提取,建立字典
|
@@ -49,7 +48,7 @@ def extract5nc(file, varname):
|
|
49
48
|
file: 文件路径
|
50
49
|
varname: 变量名
|
51
50
|
example: data, dimdict = extract5nc(file_ecm, 'h')
|
52
|
-
|
51
|
+
"""
|
53
52
|
ds = xr.open_dataset(file)
|
54
53
|
vardata = ds[varname]
|
55
54
|
dims = vardata.dims
|
@@ -63,22 +62,22 @@ def extract5nc(file, varname):
|
|
63
62
|
def _numpy_to_nc_type(numpy_type):
|
64
63
|
"""将NumPy数据类型映射到NetCDF数据类型"""
|
65
64
|
numpy_to_nc = {
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
65
|
+
"float32": "f4",
|
66
|
+
"float64": "f8",
|
67
|
+
"int8": "i1",
|
68
|
+
"int16": "i2",
|
69
|
+
"int32": "i4",
|
70
|
+
"int64": "i8",
|
71
|
+
"uint8": "u1",
|
72
|
+
"uint16": "u2",
|
73
|
+
"uint32": "u4",
|
74
|
+
"uint64": "u8",
|
76
75
|
}
|
77
|
-
return numpy_to_nc.get(str(numpy_type),
|
76
|
+
return numpy_to_nc.get(str(numpy_type), "f4") # 默认使用 'float32'
|
78
77
|
|
79
78
|
|
80
79
|
def write2nc(file, data, varname, coords, mode):
|
81
|
-
|
80
|
+
"""
|
82
81
|
description: 写入数据到nc文件
|
83
82
|
参数:
|
84
83
|
file: 文件路径
|
@@ -87,16 +86,16 @@ def write2nc(file, data, varname, coords, mode):
|
|
87
86
|
coords: 坐标,字典,键为维度名称,值为坐标数据
|
88
87
|
mode: 写入模式,'w'为写入,'a'为追加
|
89
88
|
example: write2nc(r'test.nc', data, 'data', {'time': np.linspace(0, 120, 100), 'lev': np.linspace(0, 120, 50)}, 'a')
|
90
|
-
|
89
|
+
"""
|
91
90
|
# 判断mode是写入还是追加
|
92
|
-
if mode ==
|
91
|
+
if mode == "w":
|
93
92
|
if os.path.exists(file):
|
94
93
|
os.remove(file)
|
95
94
|
print("Warning: File already exists. Deleting it.")
|
96
|
-
elif mode ==
|
95
|
+
elif mode == "a":
|
97
96
|
if not os.path.exists(file):
|
98
97
|
print("Warning: File doesn't exist. Creating a new file.")
|
99
|
-
mode =
|
98
|
+
mode = "w"
|
100
99
|
|
101
100
|
# 打开 NetCDF 文件
|
102
101
|
with nc.Dataset(file, mode, format="NETCDF4") as ncfile:
|
@@ -146,65 +145,74 @@ def write2nc(file, data, varname, coords, mode):
|
|
146
145
|
raise ValueError("Number of dimensions does not match the data shape.")
|
147
146
|
|
148
147
|
|
149
|
-
def merge5nc(file_list, var_name, dim_name, target_filename):
|
148
|
+
def merge5nc(file_list, var_name=None, dim_name=None, target_filename=None):
|
150
149
|
"""
|
151
|
-
批量提取 nc
|
150
|
+
批量提取 nc 文件中的变量,按照某一维度合并后写入新的 nc 文件。
|
151
|
+
如果 var_name 是字符串,则认为是单变量;如果是列表,且只有一个元素,也是单变量;
|
152
|
+
如果列表元素大于1,则是多变量;如果 var_name 是 None,则合并所有变量。
|
152
153
|
|
153
154
|
参数:
|
154
155
|
file_list:nc 文件路径列表
|
155
|
-
var_name
|
156
|
+
var_name:要提取的变量名或变量名列表,默认为 None,表示提取所有变量
|
156
157
|
dim_name:用于合并的维度名
|
157
158
|
target_filename:合并后的目标文件名
|
158
|
-
|
159
|
+
|
160
|
+
example:
|
161
|
+
merge5nc(file_list, var_name='data', dim_name='time', target_filename='merged.nc')
|
162
|
+
merge5nc(file_list, var_name=['data1', 'data2'], dim_name='time', target_filename='merged.nc')
|
163
|
+
merge5nc(file_list, var_name=None, dim_name='time', target_filename='merged.nc')
|
159
164
|
"""
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
165
|
+
# 初始化变量名列表
|
166
|
+
var_names = None
|
167
|
+
|
168
|
+
# 判断 var_name 是单变量、多变量还是合并所有变量
|
169
|
+
if var_name is None:
|
170
|
+
# 获取第一个文件中的所有变量名
|
171
|
+
ds = xr.open_dataset(file_list[0])
|
172
|
+
var_names = list(ds.variables.keys())
|
166
173
|
ds.close()
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
def merge5nc_vars(file_list, var_names, dim_name, target_filename):
|
178
|
-
"""
|
179
|
-
批量提取 nc 文件中的两个变量,按照某一维度合并后写入新的 nc 文件。
|
180
|
-
|
181
|
-
参数:
|
182
|
-
file_list:nc 文件路径列表
|
183
|
-
var_names:要提取的变量名列表,例如 ['u', 'v']
|
184
|
-
dim_name:用于合并的维度名
|
185
|
-
target_filename:合并后的目标文件名
|
174
|
+
elif isinstance(var_name, str):
|
175
|
+
var_names = [var_name]
|
176
|
+
elif isinstance(var_name, list):
|
177
|
+
var_names = var_name
|
178
|
+
else:
|
179
|
+
raise ValueError("var_name must be a string, a list of strings, or None")
|
180
|
+
|
181
|
+
# 初始化合并数据字典
|
182
|
+
merged_data = {}
|
186
183
|
|
187
|
-
|
188
|
-
"""
|
189
|
-
data_lists = [[] for _ in var_names]
|
184
|
+
# 遍历文件列表
|
190
185
|
for i, file in enumerate(file_list):
|
191
186
|
print(f"\rReading file {i + 1}/{len(file_list)}...", end="")
|
192
187
|
ds = xr.open_dataset(file)
|
193
|
-
for
|
188
|
+
for var_name in var_names:
|
194
189
|
var = ds[var_name]
|
195
|
-
|
190
|
+
# 如果变量包含合并维度,则合并它们
|
191
|
+
if dim_name in var.dims:
|
192
|
+
if var_name not in merged_data:
|
193
|
+
merged_data[var_name] = [var]
|
194
|
+
else:
|
195
|
+
merged_data[var_name].append(var)
|
196
|
+
# 如果变量不包含合并维度,则仅保留第一个文件中的值
|
197
|
+
else:
|
198
|
+
if var_name not in merged_data:
|
199
|
+
merged_data[var_name] = var
|
196
200
|
ds.close()
|
201
|
+
|
197
202
|
print("\nMerging data...")
|
198
|
-
|
199
|
-
|
200
|
-
|
203
|
+
for var_name in merged_data:
|
204
|
+
if isinstance(merged_data[var_name], list):
|
205
|
+
merged_data[var_name] = xr.concat(merged_data[var_name], dim=dim_name)
|
206
|
+
|
207
|
+
merged_data = xr.Dataset(merged_data)
|
208
|
+
|
201
209
|
print("Writing data to file...")
|
202
|
-
ds_merged = xr.Dataset(merged_data)
|
203
210
|
if os.path.exists(target_filename):
|
204
211
|
print("Warning: The target file already exists.")
|
205
212
|
print("Removing existing file...")
|
206
213
|
os.remove(target_filename)
|
207
|
-
|
214
|
+
merged_data.to_netcdf(target_filename)
|
215
|
+
print(f'File "{target_filename}" has been created.')
|
208
216
|
|
209
217
|
|
210
218
|
def modify_var_value(nc_file_path, variable_name, new_value):
|
@@ -220,7 +228,7 @@ def modify_var_value(nc_file_path, variable_name, new_value):
|
|
220
228
|
"""
|
221
229
|
try:
|
222
230
|
# Open the NetCDF file
|
223
|
-
dataset = nc.Dataset(nc_file_path,
|
231
|
+
dataset = nc.Dataset(nc_file_path, "r+")
|
224
232
|
# Get the variable to be modified
|
225
233
|
variable = dataset.variables[variable_name]
|
226
234
|
# Modify the value of the variable
|
@@ -243,7 +251,7 @@ def modify_var_attr(nc_file_path, variable_name, attribute_name, attribute_value
|
|
243
251
|
example: modify_var_attr('test.nc', 'data', 'long_name', 'This is a test variable.')
|
244
252
|
"""
|
245
253
|
try:
|
246
|
-
ds = nc.Dataset(nc_file_path,
|
254
|
+
ds = nc.Dataset(nc_file_path, "r+")
|
247
255
|
if variable_name not in ds.variables:
|
248
256
|
raise ValueError(f"Variable '{variable_name}' not found in the NetCDF file.")
|
249
257
|
|
@@ -272,7 +280,7 @@ def rename_var_or_dim(ncfile_path, old_name, new_name):
|
|
272
280
|
example: rename_var_or_dim('test.nc', 'time', 'ocean_time')
|
273
281
|
"""
|
274
282
|
try:
|
275
|
-
with nc.Dataset(ncfile_path,
|
283
|
+
with nc.Dataset(ncfile_path, "r+") as dataset:
|
276
284
|
# If the old name is not found as a variable or dimension, print a message
|
277
285
|
if old_name not in dataset.variables and old_name not in dataset.dimensions:
|
278
286
|
print(f"Variable or dimension {old_name} not found in the file.")
|
@@ -299,7 +307,7 @@ def check_ncfile(ncfile, if_delete=False):
|
|
299
307
|
return False
|
300
308
|
|
301
309
|
try:
|
302
|
-
with nc.Dataset(ncfile,
|
310
|
+
with nc.Dataset(ncfile, "r") as f:
|
303
311
|
# 确保f被使用,这里我们检查文件中变量的数量
|
304
312
|
if len(f.variables) > 0:
|
305
313
|
return True
|
@@ -322,8 +330,6 @@ def check_ncfile(ncfile, if_delete=False):
|
|
322
330
|
return False
|
323
331
|
|
324
332
|
|
325
|
-
if __name__ ==
|
326
|
-
|
333
|
+
if __name__ == "__main__":
|
327
334
|
data = np.random.rand(100, 50)
|
328
|
-
write2nc(r
|
329
|
-
'data', {'time': np.linspace(0, 120, 100), 'lev': np.linspace(0, 120, 50)}, 'a')
|
335
|
+
write2nc(r"test.nc", data, "data", {"time": np.linspace(0, 120, 100), "lev": np.linspace(0, 120, 50)}, "a")
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: oafuncs
|
3
|
-
Version: 0.0.
|
3
|
+
Version: 0.0.78
|
4
4
|
Summary: My short description for my project.
|
5
5
|
Home-page: https://github.com/Industry-Pays/OAFuncs
|
6
6
|
Author: Kun Liu
|
@@ -9,9 +9,6 @@ License: MIT
|
|
9
9
|
Classifier: License :: OSI Approved :: MIT License
|
10
10
|
Classifier: Programming Language :: Python
|
11
11
|
Classifier: Programming Language :: Python :: 3
|
12
|
-
Classifier: Programming Language :: Python :: 3.6
|
13
|
-
Classifier: Programming Language :: Python :: 3.7
|
14
|
-
Classifier: Programming Language :: Python :: 3.8
|
15
12
|
Classifier: Programming Language :: Python :: 3.9
|
16
13
|
Classifier: Programming Language :: Python :: 3.10
|
17
14
|
Classifier: Programming Language :: Python :: 3.11
|
@@ -267,6 +264,12 @@ oafuncs.oa_nc.write2nc(r'I:\test.nc', data,
|
|
267
264
|
|
268
265
|
- oa_file
|
269
266
|
|
267
|
+
- find_file
|
268
|
+
|
269
|
+
2024/12/02更新
|
270
|
+
|
271
|
+
查找满足条件的所有文件
|
272
|
+
|
270
273
|
- link_file
|
271
274
|
|
272
275
|
2024/10/28更新
|
@@ -279,9 +282,9 @@ oafuncs.oa_nc.write2nc(r'I:\test.nc', data,
|
|
279
282
|
|
280
283
|
复制文件
|
281
284
|
|
282
|
-
-
|
285
|
+
- rename_file
|
283
286
|
|
284
|
-
2024/
|
287
|
+
2024/12/02更新
|
285
288
|
|
286
289
|
按一定规则重命名文件(可多个)
|
287
290
|
|
@@ -1,25 +1,24 @@
|
|
1
1
|
oafuncs/__init__.py,sha256=2QiNjIIMtstD8y9HWlu23yiZGmmljkNUQknHEbnRwYI,673
|
2
|
-
oafuncs/oa_cmap.py,sha256=
|
2
|
+
oafuncs/oa_cmap.py,sha256=LnHI6vMCoFFkMq4P3RgItmJ01Kx5MjjwwlhnaqhRLKI,7242
|
3
3
|
oafuncs/oa_data.py,sha256=H9qZrUziOpc456iIL-1lBwSkBPApl2rlR-ajZg-mDMs,8119
|
4
4
|
oafuncs/oa_draw.py,sha256=K5B_otgx7Bu5P6ZYipNt9C-uRI1w9oxwY1M1F0-kGuM,17329
|
5
|
-
oafuncs/oa_file.py,sha256=
|
5
|
+
oafuncs/oa_file.py,sha256=iHgv0CTH4k_7YUnQ8-qQbLoz_f2lUmVhzGWQ2LkPFP8,11624
|
6
6
|
oafuncs/oa_help.py,sha256=ppNktmtNzs15R20MD1bM7yImlTQ_ngMwvoIglePOKXA,1000
|
7
|
-
oafuncs/oa_nc.py,sha256=
|
7
|
+
oafuncs/oa_nc.py,sha256=7Fp65BJF_PtyaaxS5PS2apA-KkkQLhqh19Xlw__8XMo,12656
|
8
8
|
oafuncs/oa_python.py,sha256=XPTP3o7zTFzfJR_YhsKfQksa3bSYwXsne9YxlJplCEA,3994
|
9
|
-
oafuncs/oa_down/User_Agent-list.txt,sha256=
|
10
|
-
oafuncs/oa_down/__init__.py,sha256=
|
11
|
-
oafuncs/oa_down/hycom_3hourly.py,sha256=
|
9
|
+
oafuncs/oa_down/User_Agent-list.txt,sha256=j88ML0zwVibNj484ehurfZMX-PZ7G_1TwhwpcJZMIB0,884393
|
10
|
+
oafuncs/oa_down/__init__.py,sha256=nY5X7gM1jw7DJxyooR2UJSq4difkw-flz2Ucr_OuDbA,540
|
11
|
+
oafuncs/oa_down/hycom_3hourly.py,sha256=YcLBysnU1y-qEyNLn93KoeUvjmrfe31ViDSKURilr98,52365
|
12
12
|
oafuncs/oa_down/literature.py,sha256=dT3-7-beEzQ9mTP8LNV9Gf3q5Z1Pqqjc6FOS010HZeQ,17833
|
13
|
-
oafuncs/oa_down/
|
14
|
-
oafuncs/oa_down/test.py,sha256=9HTGKrQ8V2YVKsvBoVsuG7W-z8BurLGFBKUuf_LP94o,8256
|
13
|
+
oafuncs/oa_down/test.py,sha256=5sm73uduL0WO1GFv66ONIDLDAFavGz5qFoQpah5PbW8,8934
|
15
14
|
oafuncs/oa_sign/__init__.py,sha256=QKqTFrJDFK40C5uvk48GlRRbGFzO40rgkYwu6dYxatM,563
|
16
15
|
oafuncs/oa_sign/meteorological.py,sha256=mLbupsZSq427HTfVbZMvIlFzDHwSzQAbK3X19o8anFY,6525
|
17
16
|
oafuncs/oa_sign/ocean.py,sha256=xrW-rWD7xBWsB5PuCyEwQ1Q_RDKq2KCLz-LOONHgldU,5932
|
18
17
|
oafuncs/oa_sign/scientific.py,sha256=a4JxOBgm9vzNZKpJ_GQIQf7cokkraV5nh23HGbmTYKw,5064
|
19
18
|
oafuncs/oa_tool/__init__.py,sha256=IKOlqpWlb4cMDCtq2VKR_RTxQHDNqR_vfqqsOsp_lKQ,466
|
20
19
|
oafuncs/oa_tool/email.py,sha256=4lJxV_KUzhxgLYfVwYTqp0qxRugD7fvsZkXDe5WkUKo,3052
|
21
|
-
oafuncs-0.0.
|
22
|
-
oafuncs-0.0.
|
23
|
-
oafuncs-0.0.
|
24
|
-
oafuncs-0.0.
|
25
|
-
oafuncs-0.0.
|
20
|
+
oafuncs-0.0.78.dist-info/LICENSE.txt,sha256=rMtLpVg8sKiSlwClfR9w_Dd_5WubTQgoOzE2PDFxzs4,1074
|
21
|
+
oafuncs-0.0.78.dist-info/METADATA,sha256=FIrrAy9-BXd05CDev0zlo6FtEiy3WZFYCn58hSBWiyE,22481
|
22
|
+
oafuncs-0.0.78.dist-info/WHEEL,sha256=pxeNX5JdtCe58PUSYP9upmc7jdRPgvT0Gm9kb1SHlVw,109
|
23
|
+
oafuncs-0.0.78.dist-info/top_level.txt,sha256=bgC35QkXbN4EmPHEveg_xGIZ5i9NNPYWqtJqaKqTPsQ,8
|
24
|
+
oafuncs-0.0.78.dist-info/RECORD,,
|