- 新增websocket客户端和服务端实现 - 添加图片压缩工具和快速压缩脚本 - 实现学生信息处理相关API - 添加MQTT客户端和消息处理功能 - 更新.gitignore忽略更多文件类型 - 添加数据库操作工具和示例 - 实现多个测试脚本和工具类
52 KiB
52 KiB
In [1]:
import pandas as pdIn [72]:
df = pd.read_excel('./在校生综合信息查询.xlsx')
In [73]:
df.shapeOut [73]:
(2982, 42)
In [81]:
tem = df['学号'].sort_values(key=lambda s: s.fillna('').astype(str).str.len())
In [82]:
tem = tem.astype(str).tolist()In [83]:
temOut [83]:
['202205270', '250802200', '250802300', '250802400', '250802500', '250802600', '250802700', '250802800', '250802900', '250803000', '250803100', '250803200', '250803300', '250803400', '250803500', '250803600', '250803700', '250803800', '250803900', '250804000', '250802100', '250900100', '250802000', '250801800', '250701900', '250702000', '250800100', '250800200', '250800300', '250800400', '250800500', '250800600', '250800700', '250800800', '250800900', '250801000', '250801100', '250801200', '250801300', '250801400', '250801500', '250801600', '250801700', '250801900', '250900200', '250900300', '250900400', '251100200', '251100300', '251100400', '251100500', '251100600', '251100700', '251100800', '251100900', '251101000', '251101100', '251101200', '251101300', '251101400', '251101500', '251101600', '251101700', '251101800', '251101900', '251102000', '251100100', '251001800', '251001700', '251001600', '250900500', '250900600', '250900700', '250900800', '250900900', '251000100', '251000200', '251000300', '251000400', '250701800', '251000500', '251000700', '251000800', '251000900', '251001000', '251001100', '251001200', '251001300', '251001400', '251001500', '251000600', '251102100', '250701700', '250701500', '250601100', '250601200', '250601300', '250601400', '250601500', '250601600', '250601700', '250601800', '250601900', '250602000', '250602100', '250602200', '250602300', '250602400', '250602500', '250602600', '250602700', '250602800', '250602900', '250601000', '250603000', '250600900', '250600700', '250503300', '250503400', '250503500', '250503600', '250503700', '250503900', '250504000', '250504100', '250504200', '250504300', '250504400', '250504500', '250504600', '250600100', '250600200', '250600300', '250600400', '250600500', '250600600', '250600800', '250603100', '250603200', '250603300', '250605900', '250606000', '250606100', '250606200', '250606300', '250606400', '250700100', '250700200', '250700300', '250700400', '250700500', '250700700', '250700800', '250700900', '250701000', '250701100', '250701200', '250701300', '250701400', '250605800', '250605700', '250605600', '250605500', '250603400', '250603600', '250603700', '250603800', '250603900', '250604000', '250604100', '250604200', '250604300', '250701600', '250604400', '250604600', '250604700', '250604800', '250604900', '250605000', '250605100', '250605200', '250605300', '250605400', '250604500', '250503200', '251102200', '251102400', '251401600', '251401700', '251401800', '251401900', '251402000', '251402100', '251402200', '251402300', '251402400', '251402500', '251402600', '251402700', '251402800', '251402900', '251403000', '251403100', '251403200', '251403300', '251403400', '251401500', '251403500', '251401400', '251401200', '251302200', '251302300', '251302400', '251302500', '251302600', '251302700', '251302800', '251302900', '251400100', '251400200', '251400300', '251400400', '251400500', '251400600', '251400700', '251400800', '251400900', '251401000', '251401100', '251401300', '251403600', '251403700', '251403800', '251500400', '251500500', '251500600', '251500700', '251500800', '251500900', '251501000', '251501100', '251501200', '251501300', '251501400', '251501500', '251501600', '251501700', '251501800', '251501900', '251502000', '251502100', '251502200', '251500300', '251500200', '251500100', '251405900', '251403900', '251404000', '251404100', '251404200', '251404300', '251404400', '251404500', '251404600', '251404700', '251302100', '251404800', '251405000', '251405100', '251405200', '251405300', '251405400', '251405500', '251405600', '251405700', '251405800', '251404900', '251102300', '251302000', '251301800', '251104800', '251104900', '251105000', '251105100', '251200100', '251200200', '251200300', '251200400', '251200500', '251200600', '251200700', '251200800', '251200900', '251201000', '251201100', '251201200', '251201300', '251201400', '251201500', '251104700', '251201600', '251104600', '251104400', '251102500', '251102600', '251102700', '251102800', '251102900', '251103000', '251103100', '251103200', '251103300', '251103400', '251103500', '251103600', '251103700', '251103800', '251103900', '251104000', '251104100', '251104200', '251104300', '251104500', '251201700', '251201800', '251201900', '251204400', '251204500', '251204600', '251300100', '251300200', '251300300', '251300400', '251300500', '251300600', '251300800', '251300900', '251301000', '251301100', '251301200', '251301300', '251301400', '251301500', '251301600', '251301700', '251204300', '251204200', '251204100', '251204000', '251202000', '251202100', '251202200', '251202300', '251202400', '251202500', '251202600', '251202700', '251202800', '251301900', '251202900', '251203100', '251203200', '251203300', '251203400', '251203500', '251203600', '251203700', '251203800', '251203900', '251203000', '250503100', '250503000', '250502900', '202422057', '202422290', '202423001', '202423003', '202423004', '202423005', '202423007', '202423008', '202423010', '202423011', '202423012', '202423013', '202423015', '202423016', '202423017', '202423018', '202423019', '202423020', '202423023', '202422056', '202423024', '202422055', '202422053', '202422034', '202422035', '202422036', '202422037', '202422038', '202422039', '202422040', '202422041', '202422042', '202422043', '202422044', '202422045', '202422046', '202422047', '202422048', '202422049', '202422050', '202422051', '202422052', '202422054', '202423025', '202423028', '202423029', '202424022', '202424023', '202424024', '202424026', '202424040', '202424042', '202424044', '202424045', '202424046', '202424047', '202424048', '202424049', '202424050', '202424051', '202424052', '202424053', '202424055', '202424056', '202425001', '202424020', '202424019', '202424017', '202424016', '202423030', '202423032', '202423034', '202423035', '202423036', '202423038', '202423039', '202423042', '202423043', '202422033', '202424001', '202424004', '202424005', '202424006', '202424007', '202424009', '202424011', '202424012', '202424013', '202424014', '202424003', '202425002', '202422032', '202422030', '202421017', '202421019', '202421020', '202421022', '202421023', '202421024', '202421025', '202421026', '202421028', '202421029', '202421030', '202421031', '202421033', '202421034', '202421036', '202421038', '202421040', '202421042', '202421044', '202421016', '202421045', '202421014', '202421011', '202420050', '202420051', '202420052', '202420053', '202420054', '202420055', '202420056', '202420057', '202420058', '202420059', '202420060', '202420061', '202420062', '202421001', '202421003', '202421005', '202421006', '202421008', '202421010', '202421012', '202421046', '202421047', '202421048', '202422011', '202422012', '202422013', '202422014', '202422015', '202422016', '202422017', '202422018', '202422019', '202422020', '202422021', '202422022', '202422023', '202422024', '202422025', '202422026', '202422027', '202422028', '202422029', '202422010', '202422009', '202422008', '202422007', '202421049', '202421050', '202421051', '202421052', '202421053', '202421054', '202421055', '202421056', '202421057', '202422031', '202421058', '202421060', '202421061', '202421062', '202422001', '202422002', '202422003', '202422004', '202422005', '202422006', '202421059', '202425003', '202425004', '202425009', '250101900', '250102000', '250102100', '250200100', '250200200', '250200300', '250200400', '250200500', '250200600', '250200700', '250200800', '250200900', '250300100', '250300200', '250300300', '250300400', '250300500', '250300600', '250300700', '250101800', '250300800', '250101700', '250101500', '240534000', '240611000', '242205800', '24JW01190', '24JW01220', '250100100', '250100200', '250100300', '250100400', '250100500', '250100600', '250100700', '250100800', '250100900', '250101000', '250101100', '250101200', '250101300', '250101400', '250101600', '250300900', '250301000', '250301100', '250500700', '250500800', '250500900', '250501100', '250501200', '250501300', '250501400', '250501600', '250501700', '250501800', '250501900', '250502000', '250502100', '250502200', '250502300', '250502400', '250502500', '250502700', '250502800', '250500600', '250500500', '250500400', '250500300', '250301200', '250301300', '250301400', '250301500', '250301600', '250301700', '250301800', '250301900', '250302000', '240526000', '250302100', '250400100', '250400200', '250400300', '250400400', '250400500', '250400600', '250400700', '250500100', '250500200', '250302200', '240518000', '240512000', '240510000', '202425042', '202425044', '202426001', '202426002', '202426003', '202426004', '202426005', '202426006', '202426007', '202426008', '202426009', '202426010', '202426011', '202426012', '202426013', '202426014', '202426015', '202426016', '202426017', '202425041', '202425040', '202425039', '202425038', '202425011', '202425012', '202425013', '202425014', '202425015', '202425016', '202425018', '202425021', '202425023', '202426018', '202425024', '202425026', '202425029', '202425031', '202425032', '202425033', '202425034', '202425035', '202425036', '202425037', '202425025', '251502300', '202426020', '202426025', '202427027', '202427028', '202427029', '202427030', '202427031', '202427032', '202427033', '202427034', '202427035', '202427036', '202427037', '202427041', '202427042', '203320000', '203520000', '230043000', '230536000', '230586000', '240291000', '202427026', '202427025', '202427022', '202427018', '202426026', '202426027', '202426028', '202426029', '202426030', '202427001', '202427002', '202427003', '202427004', '202426021', '202427005', '202427007', '202427008', '202427009', '202427010', '202427013', '202427014', '202427015', '202427016', '202427017', '202427006', '202308640', '251502400', '251600200', '252502700', '252502800', '252502900', '252503000', '252503100', '252503200', '252503300', '252503400', '252503500', '252503600', '252503700', '252503800', '252503900', '252504000', '252504100', '252504200', '252504300', '252504400', '252504500', '252502600', '252504600', '252502500', '252502300', '252500300', '252500400', '252500500', '252500600', '252500700', '252500800', '252500900', '252501000', '252501100', '252501200', '252501300', '252501400', '252501500', '252501600', '252501700', '252501800', '252502000', '252502100', '252502200', '252502400', '252504700', '252504800', '252504900', '252601200', '252601300', '252601400', '252601500', '252601600', '252601700', '252601800', '252601900', '252602000', '252602100', '252602200', '252602300', '252602400', '252602500', '252602600', '252602800', '252602900', '252603000', '252603100', '252601100', '252601000', '252600900', '252600800', '252505000', '252505100', '252505200', '252505300', '252505400', '252505500', '252505600', '252505700', '252505800', '252500200', '252505900', '252506100', '252506200', '252506300', '252600100', '252600300', '252600400', '252600500', '252600600', '252600700', '252506000', '252603200', '252500100', '252406300', '252305800', '252305900', '252306000', '252306100', '252306700', '252400100', '252400200', '252400300', '252400400', '252400500', '252400600', '252400700', '252400800', '252400900', '252401000', '252401100', '252401200', '252401300', '252401400', '252305700', '252401500', '252305600', '252305400', '252303500', '252303600', '252303700', '252303800', '252303900', '252304000', '252304100', '252304200', '252304300', '252304400', '252304500', '252304600', '252304700', '252304800', '252304900', '252305000', '252305100', '252305200', '252305300', '252305500', '252401600', '252401700', '252401800', '252404400', '252404500', '252404600', '252404700', '252404800', '252404900', '252405000', '252405100', '252405200', '252405300', '252405400', '252405500', '252405600', '252405700', '252405800', '252405900', '252406000', '252406100', '252406200', '252404300', '252404200', '252404100', '252404000', '252401900', '252402000', '252402100', '252402200', '252402300', '252402400', '252402500', '252402700', '252402800', '252406400', '252402900', '252403100', '252403200', '252403300', '252403400', '252403500', '252403600', '252403700', '252403800', '252403900', '252403000', '252303400', '252603300', '252603500', '252902500', '252902600', '252902700', '252902800', '252902900', '252903000', '252903100', '252903200', '252903300', '252903400', '252903500', '252903600', '252903700', '252903800', '252903900', '253000100', '253000200', '253000300', '253000400', '252902400', '253000500', '252902300', '252902100', '252900200', '252900300', '252900400', '252900500', '252900600', '252900700', '252900800', '252900900', '252901000', '252901100', '252901200', '252901300', '252901400', '252901500', '252901600', '252901700', '252901800', '252901900', '252902000', '252902200', '253000600', '253000700', '253000800', '253100100', '253100200', '253100300', '253100400', '253100500', '253100600', '253100700', '253100800', '253100900', '253101000', '253101100', '253101200', '253101300', '253101400', '253101500', '253101600', '253101700', '253101800', '253102000', '253003200', '253003100', '253003000', ...]
In [84]:
lens = {}
records = {}
for item in tem:
lens[f'长度为{len(item)}'] = lens.get(f'长度为{len(item)}', 0) + 1
records[f'长度为{len(item)}'] = records.get(f'长度为{len(item)}', []) + [item]In [85]:
lensOut [85]:
{'长度为9': 2974, '长度为10': 5, '长度为13': 3}In [45]:
records['长度为10']Out [45]:
['2023030432', '2024040613', '2024040128', '2023010303', '2024040152']
In [77]:
#将学号不足9位的学号后面补0,超过9位的截取前9位
df['学号'] = df['学号'].apply(lambda x: f'{str(x):0<9}')
In [78]:
df['学号'].value_counts().head(20)Out [78]:
学号 202415017 2 202322076 2 202302030 2 202314030 2 252604500 2 202415001 2 202301020 2 202415019 2 202304010 2 202301030 2 202306040 2 250803100 1 250803600 1 250803300 1 250803400 1 250803500 1 250803200 1 250803900 1 250803700 1 250803800 1 Name: count, dtype: int64
In [87]:
df.to_excel('数据整理.xlsx', index=False)In [88]:
df1 = pd.read_excel('数据整理.xlsx')
df1['学号'].value_counts().head(20)
Out [88]:
学号 202205270 1 250803300 1 250802400 1 250802500 1 250802600 1 250802700 1 250802800 1 250802900 1 250803000 1 250803100 1 250803200 1 250803400 1 250900500 1 250803500 1 250803600 1 250803700 1 250803800 1 250803900 1 250804000 1 250900100 1 Name: count, dtype: int64
In [ ]:
#取出df1中学生和学号组合成字典
student = df1[['姓名', '学号']].set_index('姓名').T.to_dict('list')C:\Users\Administrator\AppData\Local\Temp\ipykernel_34060\2571666087.py:2: UserWarning: DataFrame columns are not unique, some columns will be omitted.
student = df1[['姓名', '学号']].set_index('姓名').T.to_dict()
In [93]:
df1['姓名'].value_counts()Out [93]:
姓名
王子轩 4
洛绒丁真 4
王俊杰 4
李鑫 3
杨杰 3
..
未煜祺 1
魏颖煊 1
薛永宏 1
于伟杰 1
董芷妍 1
Name: count, Length: 2892, dtype: int64In [106]:
df2 = pd.read_excel('学生信息.xls',sheet_name='Sheet0')In [107]:
df2Out [107]:
| 学号 | 姓名 | 性别 | 年级 | 班级 | 电话 | 身份证件号 | 专业代码 | 专业名称 | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 202304009 | 韩震 | 男 | 2023 | 2328数字媒体2班 | 15883775701 | 510726200805055219 | 710204 | 数字媒体技术应用 |
| 1 | 202304023 | 胥倩文 | 女 | 2023 | 2328数字媒体2班 | 17378613606 | 510704200802282127 | 710204 | 数字媒体技术应用 |
| 2 | 202328001 | 四郎 | 男 | 2023 | 2328数字媒体2班 | 15983736073 | 513332200405011637 | 710204 | 数字媒体技术应用 |
| 3 | 202328005 | 东红丹巴达吉 | 男 | 2023 | 2328数字媒体2班 | 15708362028 | 513327200706166519 | 710204 | 数字媒体技术应用 |
| 4 | 202328006 | 尼谢交 | 男 | 2023 | 2328数字媒体2班 | 18828867303 | 513333200805241614 | 710204 | 数字媒体技术应用 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 2977 | 2530028 | 杨马浩 | 男 | 2025 | 2530智维升学 | 19114073889 | 510726201003181410 | 660201 | 智能设备运行与维护 |
| 2978 | 2530029 | 杨逸晨 | 男 | 2025 | 2530智维升学 | 18781190071 | 510724201007141616 | 660201 | 智能设备运行与维护 |
| 2979 | 2530030 | 张文博 | 男 | 2025 | 2530智维升学 | 13698138546 | 510724201005172056 | 660201 | 智能设备运行与维护 |
| 2980 | 2530031 | 张玺毓 | 男 | 2025 | 2530智维升学 | 18982542062 | 50022820100822337X | 660201 | 智能设备运行与维护 |
| 2981 | 2530032 | 张宇鹏 | 男 | 2025 | 2530智维升学 | 15328205746 | 510724201007140816 | 660201 | 智能设备运行与维护 |
2982 rows × 9 columns
In [111]:
df2.columns
Out [111]:
Index(['学号', '姓名', '性别', '年级', '班级', '电话', '身份证件号', '专业代码', '专业名称'], dtype='object')
In [118]:
df3 = df2[['专业名称','专业代码']].drop_duplicates()
In [119]:
major_map = dict(zip(df3['专业名称'], df3['专业代码']))In [120]:
major_mapOut [120]:
{'数字媒体技术应用': 710204,
'运动训练': 770303,
'智慧健康养老服务': 590302,
'旅游服务与管理': 740101,
'民族音乐与舞蹈': 750203,
'会计事务': 120100,
'建筑工程施工': 640301,
'电子信息技术': 510101,
'新能源汽车运用与维修': 700209,
'智能设备运行与维护': 660201}In [121]:
df1.columnsOut [121]:
Index(['身份证件号', '姓名', '性别', '出生日期', '民族', '籍贯', '户口性质', '学生类别', '入学年月', '学校名称',
'专业', '专业方向', '学号', '户口所在地', '户口所在地区县以下详细地址', '身份证件类型', '学籍号', '婚姻状况',
'政治面貌', '学生来源', '港澳台侨外', '国籍', '家庭现地址', '入学方式', '学制', '年级', '班级',
'家庭邮政编码', '联招合作类型', '联招合作学校机构代码', '学生联系电话', '出生地', '电子信箱', '英文姓名',
'姓名拼音', '省', '市', '县', '学习形式', '专业简称', '在校生状态', '健康状况'],
dtype='object')In [123]:
df2.columnsOut [123]:
Index(['学号', '姓名', '性别', '年级', '班级', '电话', '身份证件号', '专业代码', '专业名称'], dtype='object')
In [126]:
df5 = df1[['学号', '姓名', '性别', '年级', '班级', '学生联系电话', '身份证件号', '专业']]In [127]:
df5.rename(columns={'专业':'专业名称','学生联系电话':'电话'},inplace=True)C:\Users\Administrator\AppData\Local\Temp\ipykernel_34060\2414071842.py:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
df5.rename(columns={'专业':'专业名称','学生联系电话':'电话'},inplace=True)
In [129]:
major_mapOut [129]:
{'数字媒体技术应用': 710204,
'运动训练': 770303,
'智慧健康养老服务': 590302,
'旅游服务与管理': 740101,
'民族音乐与舞蹈': 750203,
'会计事务': 120100,
'建筑工程施工': 640301,
'电子信息技术': 510101,
'新能源汽车运用与维修': 700209,
'智能设备运行与维护': 660201}In [130]:
df5['专业代码'] = df5['专业名称'].map(major_map)C:\Users\Administrator\AppData\Local\Temp\ipykernel_34060\3695747400.py:1: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy df5['专业代码'] = df5['专业名称'].map(major_map)
In [137]:
df5 = df5.astype('str')In [138]:
df5.to_excel("学生信息_v1.xlsx",index=False)In [149]:
grademap = {}
def fun(x):
grademap[x.name] = list(x['班级'].value_counts().to_dict().keys())
df5.groupby('年级').apply(fun)
Out [149]:
C:\Users\Administrator\AppData\Local\Temp\ipykernel_34060\2087057881.py:4: DeprecationWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.
df5.groupby('年级').apply(fun)
In [150]:
grademapOut [150]:
{'2023': ['2322数字媒体',
'2317汽修2班',
'2309旅游升学',
'2312电商升学',
'2316汽修1班',
'2321建筑升学',
'2306融通1班',
'2319会计升学',
'2310融通3班',
'2314智维升学',
'2315融通5班',
'2302五年制会计',
'2311电商军事',
'2304五年制媒体',
'2318会计融通',
'2301五年制电子',
'2325体育',
'2308旅游融通',
'2303五年制建筑',
'2323舞蹈',
'2326会计2班',
'2305五年制汽修',
'2320建筑融通',
'2328数字媒体2班',
'2327汽修3班',
'2324音乐'],
'2024': ['2422汽修2班',
'2420融通7班',
'2411融通3班',
'2409会计升学',
'2418数媒1班',
'2421汽修1班',
'2414旅游升学',
'2427智维升学',
'2406融通1班',
'2408融通2班',
'2407电商升学',
'2402五年制会计',
'2417融通6班',
'2424运动训练',
'2410建筑升学',
'2423汽修3班',
'2419数媒2班',
'2413融通5班',
'2425智慧服务',
'2426融通8班',
'2415舞蹈',
'2404五年制数媒',
'2405五年制汽修',
'2403五年制建筑',
'2401五年制电子',
'2416音乐',
'2412融通4班',
'2418数字媒体1班'],
'2025': ['2506电商升学',
'2524汽修2班',
'2525汽修3班',
'2523汽修1班',
'2514旅游升学',
'2521融通9班',
'2522融通10班',
'2519数字媒体2班',
'2518数字媒体1班',
'2528智慧服务',
'2511融通4班',
'2517融通8班',
'2512融通5班',
'2516融通7班',
'2526汽修4班',
'2505融通1班',
'2508会计升学',
'2529融通11班',
'2530智维升学',
'2527运动训练',
'2513融通6班',
'2503五年制数字媒体',
'2515音乐舞蹈',
'2520数字媒体3班',
'2501五年制会计',
'2507融通2班',
'2531一年制',
'2510建筑升学',
'2502五年制建筑',
'2504五年制汽修',
'2509融通3班']}In [153]:
from requests import get,post
import pandas as pd
import time
teamId = 106
ip = "http://192.168.0.244:8101"
param = {
"username": "tangchao",
"password": "123456a",
"client_id": "client",
"grant_type": "password",
"client_secret": "123456",
}
data = get(url=f"{ip}/oauth/token",params=param).json()
token = data["access_token"]
header = {
"content-type": "application/json",
"authorization": f"Bearer {token}",
}In [157]:
for item in grademap['2023']:
post(f'{ip}/uc/class/add',headers=header,json={"gradeId":327,"teamId":teamId,"className":item,"enabled":True})In [ ]:
post(f'{ip}/uc/class/add',headers=header,json={"gradeId":322,"teamId":106,"className":"测试班","enabled":true})