使用用Python快速合并excel,相比使用VBA代码更简洁,但是使用到 glob 和pandas 两个库,其中glob为标准库无需安装,pandas需要pip安装。代码如下:
import
代码解释
语句1:
flist=[i for i in glob.glob("E:*.xls")]
功能:获得所有后缀为xls的文件,写入名为flist的列表。
glob.glob(r"E:*.xls")
获取E盘下后缀为xls的文件,使用时换为自己路径和文件名如"E:*.csv"
glob模块用来查找文件目录和文件,并将搜索的到的结果返回到一个列表中,支持三种通配符,其中 “*”代表0个或多个字符,“?”代表一个字符, “[]”匹配指定范围内的字符,如[0-9]匹配数字。
知乎用户子明子羽先生在https://zhuanlan.zhihu.com/p/71861602有这个模块的详细说明
[i for i in …]
为列表推导式,生成一个元素为i的列表,以[i for i in a]为例
等价于
b=list()
for i in a:
b.append(i)
代替语句
本语句可以用Python标准库 os 中的 listdir代替
import os
files = [name for name in os.listdir("E:*.xls")if name.endswith('.xls')]
语句2:
d = pd.concat([pd.read_excel(i,header = None) for i in flist],axis=0)
利用pandas的read_excel读取excel,形成DateFrame,可以参考我写的https://zhuanlan.zhihu.com/p/138212562
[pd.read_excel(i,header = None) for i in flist] 利用列表推导式生成一个DateFrame列表,其中每个表都是由excel生成的。
利用pandas的concat函数将列表中的DateFrame合并。
注意:header = None必须加上,否则会把excel的第一列作为列名,在合并时由于不同的的列名横向排列(与是否加axis=0无关,axis只能决定同列名的数据沿那个轴合并),导致只能横向合并。
例如不加header = None时:
第一张表
a b
1 2
生成的DateFrame为(第一行的值 a 和 b成为了列名 )
a b
1 2
第二张表
b c
3 4
生成的DateFrame为(第一行的值 b和 c成为了列名 )
b c
3 4
合并后的表为(a b c三个不同的列横向排列,对于b列由于axis=0纵向排列)
a b c
1 2 3
3
加header = None时:
第一张表生成的DateFrame为(0 和 1 是自动生成的列名 )
0 1
a b
1 2
第二张表生成的DateFrame为(0和1 为自动生成的列名 )
0 1
b c
3 4
合并后的表为
0 1
a b
1 2
b c
3 4
语句3:
d.to_excel( "comb.xls", header = False,index=False, encoding='utf-8')
comb.xls为合并后的文件名,存放于python脚本所在的目录下
注意:header = False要加上,这样写入excel时会把读取excel生成DateFrame时自动生成的列名去掉(上例中自动生成的列名0 和1 )