首页 文章 精选 留言 我的

精选列表

搜索[自由线程],共10008篇文章
优秀的个人博客,低调大师

【实战】再见Excel,我能自由定制表格

很多开发者说自从有了 Python/Pandas,Excel 都不怎么用了,用它来处理与可视化表格非常快速。 下面我来举几个例子。 1. 删除重复行和空行 我们直接用dict.fromkeys的方法把当前的数据转为字典,默认的值为None因为用不到,也就无所谓了。然后我们再用list直接对结果进行类型转换,转换为list。 In [135]: for row in rows4: print(row) ('name', 'address') ('tom li', 'beijing') ('tom li', 'beijing') ('',) ('mary wang', 'shandong') ('mary wang', 'shandong') ('',) ('de8ug', 'guangzhou') In [148]: dict.fromkeys(rows4) Out[148]: {('name', 'address'): None, ('tom li', 'beijing'): None, ('',): None, ('mary wang', 'shandong'): None, ('de8ug', 'guangzhou'): None} In [137]: list(dict.fromkeys(rows4)) Out[137]: [('name', 'address'), ('tom li', 'beijing'), ('',), ('mary wang', 'shandong'), ('de8ug', 'guangzhou')] 这时候,重复数据直接去掉了,注意我们这里的dict是python3新版本的,所以顺序没有影响,如果你还在用python2或者python3.5以下,建议升级一下python版本。 接下来,就是空数据的处理了。观察('',)是个元组,第一个位置的数据为空字符串,那么整体长度为1,可以直接通过循环来去掉。这里的循环我们可以用Python中的语法糖写法,直接一行搞定,最后加个判断只留下长度大于1,最后用list转换为列表。 In [179]: list(x for x in dict.fromkeys(rows4) if len(x[0])>1) Out[179]: [('name', 'address'), ('tom li', 'beijing'), ('mary wang', 'shandong'), ('de8ug', 'guangzhou')] 上面的研究搞定了,直接把研究结果放到函数中解决重复行和空行的问题。 注意这时候我们处理的行数据,所以就不再按列循环了。而且,当前的sheet中处理之后,每一行的内容都会修改位置或删除。所以我们先用old_rows = [x for x in sheet.values]取到旧的每一行的数据,注意这里的sheet后直接用values取到数据,而不是cell对象。这里的old_rows是个列表,就可以用刚才的研究直接转为删除重复和空行的数据了。 接下来,用sheet.delete_rows(1, sheet.max_row)删除所有行,第一个参数表示从第一行开始,第二个参数为最大行数。最后,用循环新的行数据的方式,把新数据写入当前的sheet。 In [189]: def handle_duplicate(wb, sheetname): """ 去除重复行,空行 先取出每一行,清空sheet,处理后写回 """ print(f'开始处理工作表:{sheetname}'.center(18, '-')) sheet = wb[sheetname] old_rows = [x for x in sheet.values] print('修改前:', old_rows) new_rows = list(x for x in dict.fromkeys(old_rows) if len(x[0])>1) print('修改后-》》', new_rows) # 删除所有行 sheet.delete_rows(1, sheet.max_row) # 写入新数据 for row in new_rows: sheet.append(row) 运行测试,查看结果。再说一次,一定记得测试啊!如果有错误就根据错误提示,查看代码,反复调试,去除bugs。 In [190]: wb = load_data() handle_duplicate(wb, '重复行') save_as(wb) 2.删除空格 删除空格也需要用到字符串的函数,所以这里还是简单研究一下。如果我们想去除字符串中间的空格,可以用split默认进行分割,然后把分割的结果用’’.join方法连接起来就可以了。注意join前是空的字符串。这里也用不到strip去除两端的空格了,因为split分割后只有几个最后的字符串组成的列表。 In [192]: a="a b c " In [194]: a.strip() Out[194]: 'a b c' In [195]: a.split() Out[195]: ['a', 'b', 'c'] In [196]: ''.join(a.split()) Out[196]: 'abc' In [ ]: 研究成功后,写入函数。这次命名为handle_blank。 In [197]: def handle_blank(wb, sheetname): """ 按列循环, 通过参数确认目标 """ print(f'开始处理工作表:{sheetname}'.center(18, '-')) sheet = wb[sheetname] for col in sheet.iter_cols(): # 不加参数,循环所有列 for cell in col: print('修改前:', cell.value, end='') cell.value = ''.join(cell.value.split()) print('修改后-》》',cell.value) In [198]: handle_blank(wb, '空格') 3.修改日期和时间格式 有时候,我们需要对表格中时间相关的单元格进行格式修改,这里需要用到Python中时间模块datetime,将需要的格式进行拼接后,用strftime进行转换。 假设这里我们想把之前简单的1/11月日格式,更改为年月日的样式,中间加上分隔符/或-,就需要用"%x"或"%Y-%m-%d"来进行操作了。注意这里的%加字母都是官方定义好的格式而已,我们用到时候进行拼接,传给函数就可以了。 具体更多的拼接格式如下: In [199]: import datetime In [209]: d=datetime.datetime(2019,1,11) In [203]: d.strftime("%x") Out[203]: '01/11/19' In [205]: d.strftime("%Y-%m-%d") Out[205]: '2019-01-11' 研究完成后,我们编写函数。 首先需要用m, d = cell.value.split('/')把之前简单的日期进行分割,得到m,代表月份和日期,然后用datetime进行转换,生成时间相关的对象day,注意里面的参数是数字,所以用int转换,最后把day进行格式化输出。编写函数后,一定记得测试。 In [218]: def handle_time(wb, sheetname): """ 按列循环, 通过参数确认目标 """ print(f'开始处理工作表:{sheetname}'.center(18, '-')) sheet = wb[sheetname] for col in sheet.iter_cols(max_col=1, min_row=2): # 找到时间的列, 第一列,从第二行开始 for cell in col: print('修改前:', cell.value, end='') m, d = cell.value.split('/') day = datetime.datetime(2019, int(m), int(d)) cell.value = day.strftime("%Y-%m-%d") print('修改后-》》',cell.value) In [220]: wb = load_data() handle_time(wb, '时间') save_as(wb) 4.修复数字和符号 接下来,处理数字和符号相关的操作。加入我们之前的价格,很多是有小数点的,这时候还想保存两位小数,并加上人民币符号为前缀。就需要新的一波研究了。 有小数点,一是要保证位数,我们这里要求2位,二是要对多余的位数四舍五入。可以有以下俩个方式完成,一个用Decimal一个用round,两个的区别是Decimal("0.00")指定位数后,会自动补0,而round遇到0就自动舍掉了。而且round在四舍五入的计算中,还有点特殊。具体可查看官方文档。 我们这里用Decimal来完成函数内相关操作。记得测试啊! In [227]: from decimal import Decimal In [240]: a = 3.1 b=Decimal(a).quantize(Decimal("0.00")) print(b) 3.10 In [244]: round(a,2) # 位数自动省略0 Out[244]: 3.1 In [247]: def handle_num(wb, sheetname): """ 按列循环, 通过参数确认目标 """ print(f'开始处理工作表:{sheetname}'.center(18, '-')) sheet = wb[sheetname] for col in sheet.iter_cols(min_col=3, max_col=3, min_row=2): # 找到时间的列, 第一列,从第二行开始 for cell in col: print('修改前:', cell.value, end='') # cell.value = round(float(cell.value), 3) cell.value = '¥' + str(Decimal(cell.value).quantize(Decimal("0.00"))) print('修改后-》》',cell.value) In [249]: wb = load_data() handle_num(wb, '数字符号') save_as(wb) 9元微专栏,带你《用Python玩转excel》 还有群答疑服务哦↓

优秀的个人博客,低调大师

beans64 与 String 之间的自由转换

需要依赖jar: commons-codec.jarbeans64 工具类 package com.znsd.beans64; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import org.apache.commons.codec.binary.Base64; /** * beans64 工具类 */ public class Base64Util { /** * 将文件转换 beans64 * @param imgFile 待处理的数据 * @return beans64数据 */ public static String filetoBese64(String dir) { InputStream in = null; byte[] bytes = null; try { in = new FileInputStream(dir); bytes = new byte[in.available()]; in.read(bytes); in.close(); } catch (IOException e) { e.printStackTrace(); } return new String(Base64.encodeBase64(bytes)); } /** * 将 beans64 数据转为 磁盘数据 * @param beans64String * @param dir * @throws IOException */ public static void bese64ToFile(String beans64String, String dir) throws IOException { if (beans64String == null) return ; byte[] bytes = Base64.decodeBase64(beans64String); for (int i = 0; i < bytes.length; ++i) { if (bytes[i] < 0) bytes[i] += 256; } OutputStream out = new FileOutputStream(dir); out.write(bytes); out.flush(); out.close(); } /** * 将String 数据转换为 beans64 * @param beans64String 需要转换的 beans64 * @return 处理好的 String */ public static String stringTobeans64(String beans64String) { return new String(Base64.encodeBase64(beans64String.getBytes())); } /** * 将beans64 数据转换为 String * @param beans64String 需要转换的 beans64 * @return 处理好的 String */ public static String beans64ToString(String beans64String) { String temp = ""; if (beans64String == null) return temp; byte[] bytes = Base64.decodeBase64(beans64String); for (int i = 0; i < bytes.length; ++i) { if (bytes[i] < 0) bytes[i] += 256; } return new String(bytes); } } /** * demo 案例 * @param args */ public static void main(String[] args) { System.out.println(beans64ToString(stringTobeans64("StringData"))); String fileBese64 = filetoBese64("c:/filePath"); bese64ToFile(fileBese64, "toDir"); } beans64 与 md5 整合: 个人觉得没必要了做加密 DM5 就够了 package com.znsd.beans64; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import org.apache.commons.codec.binary.Base64; /** * 消息摘要工具 */ public class MessageDigestUtil { /** * 先进行MD5摘要再进行Base64编码获取摘要字符串 * * @param str * @return */ public static String base64AndMD5(String str) { if (str == null) { throw new IllegalArgumentException("inStr can not be null"); } return base64AndMD5(toBytes(str)); } /** * 先进行MD5摘要再进行Base64编码获取摘要字符串 * * @return */ public static String base64AndMD5(byte[] bytes) { if (bytes == null) { throw new IllegalArgumentException("bytes can not be null"); } try { final MessageDigest md = MessageDigest.getInstance("MD5"); md.reset(); md.update(bytes); final Base64 base64 = new Base64(); final byte[] enbytes = base64.encode(md.digest()); return new String(enbytes); } catch (final NoSuchAlgorithmException e) { throw new IllegalArgumentException("unknown algorithm MD5"); } } /** * UTF-8编码转换为ISO-9959-1 * * @param str * @return */ public static String utf8ToIso88591(String str) { if (str == null) { return str; } try { return new String(str.getBytes("UTF-8"), "ISO-8859-1"); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e.getMessage(), e); } } /** * ISO-9959-1编码转换为UTF-8 * * @param str * @return */ public static String iso88591ToUtf8(String str) { if (str == null) { return str; } try { return new String(str.getBytes("ISO-8859-1"), "UTF-8"); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e.getMessage(), e); } } /** * String转换为字节数组 * * @param str * @return */ private static byte[] toBytes(final String str) { if (str == null) { return null; } return str.getBytes(); } } MD5加密 与 SHA1加密 import org.apache.commons.codec.digest.DigestUtils; /** * MD5 案例 * @param args */ public static void main(String[] args) { // 1. MD5加密 DigestUtils.md5Hex(data) System.out.println(DigestUtils.md5Hex("StringData")); // 2. SHA1加密 DigestUtils.sha1Hex(data) System.out.println(DigestUtils.sha1Hex("StringData")); }

优秀的个人博客,低调大师

难以置信,MySQL也可以无损自由切换

MySQL通常在人们眼中就是一个低端、开源、大众化的数据库产品,它的稳定性和可用性一直被人们所置疑,被认为难登大雅之堂,只适用于互联网应用,难于应用到可用性高的场景中,比如金融、证券等行业。然而时代的变化太快,MySQL也不能再以过去的眼光来看,从MySQL金融版的诞生开始,它已经不再是那个扶不起的阿斗,它已经脱胎换骨,以一个崭新的形象出现在数据库的高端产品中。 这一切真的难以置信,在开源数据库产品中,MySQL从来都是一枝独秀,但在表面风光的同时,却是DBA和资深用户的满心苦涩。由于硬件、网络的可用性还难以达到理想的要求,无论出现任何故障,数据库系统都必须保证其可用性。对于MySQL来说,大家所熟知的主备集群是最常见的解决方案。由于MySQL的架构设计原因,主备集群的解决方案虽然不完美,但也是其最好

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册