用Python把Excel的字母列名,转化成数字序号

一、

通过观察,不难发现Excel的列名命名规则,本质是一个26进制。只不过正常的十进制是0~9,而Excel的列名是1~26。

把A~Z对应成1~26,最好的做法,就是采用ASCII码。A~Z的ASCII码对应65~90。

python内置了一个获取ASCII码的函数,ord()。

比如:ord("A")就是65,ord("F")就是70。

所以,ASCII码减去64,正好就是把A~Z,从1~26编号。

二、

Excel最多16834列,也就是XFD列,所以我们只需要考虑最多3个字母的情况:

a.一位字母:A~Z,直接用ord()-64即可;

b.两位字母:Z列再加1列的时候,每满26进1,就是AA列。第一位字母的编号乘26,加上第二位数字的编号,正好就是实际序号;

c.三位字母:在两位字母的情况下,又多了一位。当ZZ列,再加1的时候,就会变成AAA。ZZ列是26*26+26,也就是702列。也就是说,三位字母的时候,第一列的每一个1,都相当于26*26*26。

至此,得到具体代码如下:

if len(col_name)==1:
	col_int = ord(col_name) - 64

elif len(col_name)==2:
	col_int = (ord(col_name[0])- 64) * 26 + ord(col_name[1]) - 64

else:
	col_int = (ord(col_name[0]) - 64) * 26 * 26 + (ord(col_name[1])- 64) * 26 + ord(col_name[2]) - 64

三、

上面代码还有没有优化空间呢?

其实是有的,我们可以把不足三位的列名,补齐到三位,这样就只需要考虑len(col_name)为3的情况就可以。

这里我们巧妙的采用@符号的ASCII码为64这一特点,用@符号去补齐不足三位的情况。这样,当不足三位的时候,前面多出来的@符号,64-64正好等于0,就不会影响最终结果。

具体代码如下:

#用zfill函数,把不足3位的列名,前面补上0。再用replace把0替换成@
col_name = col_name.zfill(3).replace('0','@')
col_int = (ord(col_name[0]) - 64) * 26 * 26 + (ord(col_name[1])- 64) * 26 + ord(col_name[2]) - 64

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值