python合并工作簿所有内容_python多表合并、多工作簿合并、一表案列拆分为多表...

本文介绍了如何使用Python的os和pandas库合并多个Excel工作簿。首先回顾os.walk()和os.path.join()的用法,然后展示了如何通过遍历目录获取Excel文件路径并进行合并。还讲解了如何将多个DataFrame纵向拼接。最后,提供了多工作簿合并的两种方法,一种是将多个Excel合并到一个Excel中,另一种是合并一个Excel中的多个sheet表。
摘要由CSDN通过智能技术生成

一、相关知识点回顾

本文所需要的数据,可以去如下链接中下载。该链接好像不能直接在csdn中打开,你可以复制粘贴到浏览器中打开。

http://note.youdao.com/noteshare?id=97d43c014d97a1e6fb167145152e31fc&sub=AEE8D7188AD34D4D85A7D59CB06727E8

1、需要使用的相关库

import numpy as np

import pandas as pd

import os

import xlsxwriter

import xlrd

2、os.walk(pwd):传入一个文件路径pwd。

1)作用如下

441839147e8fa67c5bb974c8fa065802.png

2)案例演示:以我电脑中“G:\a”文件夹下的文件为例,进行说明。

① 先来看看“G:\a”文件夹下有哪些东西。

76e853f84dedf9c19ba75dda8e5b13bb.png

② 代码实现

pwd = "G:\\a"

print(os.walk(pwd))

for i in os.walk(pwd):

print(i)

for path,dirs,files in os.walk(pwd):

print(files)```

结果如下:

('G:\\a', [], ['aa.txt', 'bb.xlsx', 'cc.txt', 'dd.docx'])

['aa.txt', 'bb.xlsx', 'cc.txt', 'dd.docx']

结果分析:

首先,我们使用print直接打印os.walk(pwd)的结果,显示的是一个生成器generator,我们并不能查看到其中的内容,而是需要遍历获取其中的内容。

接着,我们写了一个for循环,并使用了一个变量,接收os.walk(pwd)的返回值,可以看到返回的结果是一个元组。在这个元组中,第一个元素返回的是传入的pwd路径;第二个元素,返回的是a目录下的子目录文件夹组成的列表,由于在a目录下没有其它的子文件夹,因此返回的是一个空列表;第三个元素,返回的是a目录下的子文件组成的列表。

最后,我们使用三个变量,分别接收os.walk(pwd)的返回值,并且只打印输出了files这个变量,可以看到,这是一个由a目录下所有子文件组成的列表。

注意一:上述所说的a目录下的子目录,指的是a目录下的直接子目录,不包括a子目录下的子目录。

注意二:上述所说的a目录下的子文件,指的是a目录下的直接子文件,不包括a子目录下的子文件。

3、os.path.join(path1,path2…)

1)作用如下:用于将多个路径组合后返回。

2)案例演示

path1 = 'G:\\a'

path2 = 'aa.txt'

print(os.path.join(path1,path2))

结果如下:

G:\a\aa.txt

结果分析

从上述结果中可以看出:利用os.path.join(path1,path2),是不是可以帮助我们获取到aa.txt的全路径。利用这种思想,假如某个目录下有多个excel,我们是不是可以结合使用os.walk和os.path.join,来得到每一个excel文件的全路径,之后依据这个全路径对excel进行操作,是不是显得很方便。

4、os.walk和os.path.join使用的综合案例

1)需求如下

22d6eedaf42e8567c2e004b31a7b2c2a.png

2)实现如下

file_path_list = []

for path,dirs,files in os.walk(pwd):

for file in files:

file_path_list.append(os.path.join(path,file))

print(file_path_list)

结果如下:

['G:\\a\\aa.txt','G:\\a\\bb.xlsx','G:\\a\\cc.txt','G:\\a\\dd.docx']

5、如何将多个Dataframe进行纵向拼接?

1)创建两个dataframe数据框xx和yy。

import numpy as np

xx = np.arange(15).reshape(5,3)

yy = np.arange(1,16).reshape(5,3)

xx = pd.DataFrame(xx,columns=["语文","数学","外语"])

yy = pd.DataFrame(yy,columns=["语文","数学","外语"])

print(xx)

print(yy)

效果如下:

d3ac14cbba68b228d9454f0879a70d9f.png

2)将上述两个dataframe进行横纵向拼接。

concat_list = []

concat_list.append(xx)

concat_list.append(yy)

z = pd.concat(concat_list,ignore_list=True)

print(z)

# pd.concat(list)中【默认axis=0】默认的是数据的纵向合并。

# pd.concat(list)括号中传入的是一个列表。

# ignore_list=True表示忽略原有索引,重新生成一组新的索引。

# 或者直接可以写成z = pd.concat([xx,yy],ignore_list=True)

效果如下:

98c3d48509aa72e44cc8440d5851b6d8.png

二、多工作簿合并(一)

1、将多个Excel合并到一个Excel中(每个Excel中只有一个sheet表)

f58a0afb8ea059dec7b255c7e956337e.png

实现代码如下:

import pandas as pd

import os

pwd = "G:\\b"

df_list = []

for path,dirs,files in os.walk(pwd):

for file in files:

file_path = os.path.join(path,file)

df = pd.read_excel(file_path)

df_list.append(df)

result = pd.concat(df_list)

print(result)

result.to_excel('G:\\b\\result.xlsx',index=False)

结果如下:

d67aa178d88099247348df731c714d97.png

三、多工作簿合并(二)

1、xlsxwrite的用法讲解

1)创建一个"工作簿"。

import xlsxwriter

# 这一步相当于创建了一个新的"工作簿";

# "demo.xlsx"文件不存在,表示新建"工作簿";

# "demo.xlsx"文件存在,表示新建"工作簿"覆盖原有的"工作簿";

workbook = xlsxwriter.Workbook("demo.xlsx")

# close是将"工作簿"保存关闭,这一步必须有。否则创建的文件无法显示出来。

workbook.close()

2)创建一个"工作簿",并给工作表命名为"2018年销量"。

import xlsxwriter

workbook = xlsxwriter.Workbook("cc.xlsx")

worksheet = workbook.add_worksheet("2018年销售量")

workbook.close()

效果如下:

bb70c89c6e4e332d90208ecbb75615db.png

3)在第二步的基础上,给"2018年销售量"工作表添加一个表头,并向其中插入一条数据。

import xlsxwriter

# 创建一个名为【demo.xlsx】工作簿;

workbook = xlsxwriter.Workbook("demo.xlsx")

# 创建一个名为【2018年销售量】工作表;

worksheet = workbook.add_worksheet("2018年销售量")

# 使用write_row方法,为【2018年销售量】工作表,添加一个表头;

headings = ['产品','销量',"单价"]

worksheet.write_row('A1',headings)

# 使用write方法,在【2018年销售量】工作表中插入一条数据;

# write语法格式:worksheet.write(行,列,数据)

data = ["苹果",500,8.9]

for i in range(len(headings)):

worksheet.write(1,i,data[i])

workbook.close()

效果如下:

75e83e0e3e3623bb9c498e741a07e562.png

2、xlrd的用法讲解

1)利用test.xlsx工作簿讲解xlrd的使用原理

ea1b0af62673370f8c00e14ea8b6a097.png

上述图展示的是一个工作簿test.xlsx下面,有两张sheet表。一张sheet表,命名为“2018年销售量”,一张sheet表,命名为“2019年销售量”。

2)open_workbook(file):使用该方法帮助我们打开一个excel文件,返回给我们"xlrd.book.Book"工作簿对象;

# 这里所说的"打开"并不是实际意义上的打开,只是将该表加载到内存中打开。我们并看不到"打开的这个效果"

# 以打开上述创建的"test.xlsx"文件为例;

import xlrd

file = r"G:\Jupyter\test.xlsx"

xlrd.open_workbook(file)

# 结果如下:

3)sheet_names():获取某个工作簿下,所有sheet表的表名。假如有多个sheet表,返回表名组成的一个列表;

import xlrd

file = r"G:\Jupyter\test.xlsx"

fh = xlrd.open_workbook(file)

fh.sheet_names()

# 结果如下:

['2018年销售量', '2019年销售量']

4)sheets()方法:返回的是sheet表的对象列表。

import xlrd

file = r"G:\Jupyter\test.xlsx"

fh = xlrd.open_workbook(file)

fh.sheets()

# 结果如下:

[, ]

# 可以利用索引,获取每一个sheet表的对象

fh.sheets()[0]

fh.sheets()[1]

5)nrows和ncols属性:返回每一个sheet表的行数(nrows) 和 列数(ncols);

import xlrd

file = r"G:\Jupyter\test.xlsx"

fh = xlrd.open_workbook(file)

fh.sheets()

fh.sheets()[0].nrows # 结果是:4

fh.sheets()[0].ncols # 结果是:3

fh.sheets()[1].nrows # 结果是:4

fh.sheets()[1].ncols # 结果是:3

6)row_values(行数):传入行数,获取sheet表中该行的数据;(这个用处很大)

import xlrd

file = r"G:\Jupyter\test.xlsx"

fh = xlrd.open_workbook(file)

sheet1 = fh.sheets()[0]

for row in range(fh.sheets()[0].nrows):

value = sheet1.row_values(row)

print(value)

效果如下:

5dd9d8f156650ca1ca3882735456604c.png

7)col_values(列数):传入列数,获取sheet表中该列的数据;(这个用处不大)

import xlrd

file = r"G:\Jupyter\test.xlsx"

fh = xlrd.open_workbook(file)

sheet1 = fh.sheets()[0]

for col in range(fh.sheets()[0].ncols):

value = sheet1.col_values(col)

print(value)

效果如下:

baf55235910489893206f4ae42b3e237.png

3、将多个Excel表合并到一个Excel中(每个Excel中不只一个sheet表)

1)源数据

4adadbeb446d702221a8ff4c80233205.png

上述图展示的有两个工作簿,一个工作簿是pp.xlsx,一个工作簿是qq.xlsx。

工作簿pp.xlsx下,有两个工作表sheet1和sheet2。工作簿qq.xlsx下,也有两个工作表sheet1和sheet2。

2)使用面向过程实现上述表中数据合并

import xlrd

import xlsxwriter

import os

# 打开一个Excel文件,创建一个工作簿对象

def open_xlsx(file):

fh=xlrd.open_workbook(file)

return fh

# 获取sheet表的个数

def get_sheet_num(fh):

x = len(fh.sheets())

return x

# 读取文件内容并返回行内容

def get_file_content(file,shnum):

fh=open_xlsx(file)

table=fh.sheets()[shnum]

num=table.nrows

for row in range(num):

rdata=table.row_values(row)

datavalue.append(rdata)

return datavalue

def get_allxls(pwd):

allxls = []

for path,dirs,files in os.walk(pwd):

for file in files:

allxls.append(os.path.join(path,file))

return allxls

# 存储所有读取的结果

datavalue = []

pwd = "G:\\d"

for fl in get_allxls(pwd):

fh = open_xlsx(fl)

x = get_sheet_num(fh)

for shnum in range(x):

print("正在读取文件:"+str(fl)+"的第"+str(shnum)+"个sheet表的内容...")

rvalue = get_file_content(fl,shnum)

# 定义最终合并后生成的新文件

endfile = "G:\\d\\concat.xlsx"

wb1=xlsxwriter.Workbook(endfile)

# 创建一个sheet工作对象

ws=wb1.add_worksheet()

for a in range(len(rvalue)):

for b in range(len(rvalue[a])):

c=rvalue[a][b]

ws.write(a,b,c)

wb1.close()

print("文件合并完成")

3)将上述代码封装后的效果如下

import xlrd

import xlsxwriter

import os

class Xlrd():

def __init__(self,pwd):

self.datavalue = []

self.pwd = pwd

# 打开一个Excel文件,创建一个工作簿对象;

def open_xlsx(self,fl):

fh=xlrd.open_workbook(fl)

return fh

# 获取sheet表的个数;

def get_sheet_num(self,fh):

x = len(fh.sheets())

return x

# 读取不同工作簿中每一个sheet中的内容,并返回每行内容组成的列表;

def get_file_content(self,file,shnum):

fh = self.open_xlsx(file)

table=fh.sheets()[shnum]

num=table.nrows

for row in range(num):

rdata=table.row_values(row)

# 因为每一个sheet表都有一个表头;

# 这里的判断语句,把这个表头去除掉;

# 然后在最后写入数据的,添加上一个表头,即可;

if rdata == ['姓名','性别','年龄','家庭住址']:

pass

else:

self.datavalue.append(rdata)

return self.datavalue

# 获取xlsx文件的全路径;

def get_allxls(self):

allxls = []

for path,dirs,files in os.walk(self.pwd):

for file in files:

allxls.append(os.path.join(path,file))

return allxls

# 返回不同工作簿中,所有的sheet表的内容列表;

def return_rvalue(self):

for fl in self.get_allxls():

fh = self.open_xlsx(fl)

x = self.get_sheet_num(fh)

for shnum in range(x):

print("正在读取文件:"+str(fl)+"的第"+str(shnum)+"个sheet表的内容...")

rvalue = self.get_file_content(fl,shnum)

return rvalue

class Xlsxwriter():

def __init__(self,endfile,rvalue):

self.endfile = endfile

self.rvalue = rvalue

def save_data(self):

wb1 = xlsxwriter.Workbook(endfile)

# 创建一个sheet工作对象;

ws = wb1.add_worksheet("一年级(7)班")

# 给文件添加表头;

ws = wb1.add_worksheet("2018年销售量")

headings = ['姓名','性别','年龄','家庭住址']

for a in range(len(self.rvalue)):

for b in range(len(self.rvalue[a])):

c = self.rvalue[a][b]

# 因为给文件添加了表头,因此,数据从下一行开始写入;

ws.write(a+1,b,c)

wb1.close()

print("文件合并完成")

pwd = "G:\\d"

xl = Xlrd(pwd)

rvalue = xl.return_rvalue()

endfile = "G:\\d\\concat.xlsx"

write = Xlsxwriter(endfile,rvalue)

write.save_data();

效果如下:

75ca5fb07db8314db531eb5f6f770d6e.png

四、一个工作簿多sheet表合并。

1、将一个Excel表中的多个sheet表合并,并保存到同一个excel。

1)数据源

44e8be39da0db4f280841aa17ad84465.png

2)实现代码如下

import xlrd

import pandas as pd

from pandas import DataFrame

from openpyxl import load_workbook

excel_name = r"D:\pp.xlsx"

wb = xlrd.open_workbook(excel_name)

sheets = wb.sheet_names()

alldata = DataFrame()

for i in range(len(sheets)):

df = pd.read_excel(excel_name, sheet_name=i, index=False, encoding='utf8')

alldata = alldata.append(df)

writer = pd.ExcelWriter(r"C:\Users\Administrator\Desktop\score.xlsx",engine='openpyxl')

book = load_workbook(writer.path)

writer.book = book

# 必须要有上面这两行,假如没有这两行,则会删去其余的sheet表,只保留最终合并的sheet表

alldata.to_excel(excel_writer=writer,sheet_name="ALLDATA")

writer.save()

writer.close()

效果如下:

312c2842300ba83b357c3a840ed2126e.png

五、一表拆分(按照表中某一列进行拆分)

1、将一个Excel表,按某一列拆分成多张表。

1)数据源

28bd105b674c4bc62061695636d9d3e6.png

2)实现代码如下

import pandas as pd

import xlsxwriter

data=pd.read_excel(r"C:\Users\Administrator\Desktop\chaifen.xlsx",encoding='gbk')

area_list=list(set(data['店铺']))

writer=pd.ExcelWriter(r"C:\Users\Administrator\Desktop\拆好的表1.xlsx",engine='xlsxwriter')

data.to_excel(writer,sheet_name="总表",index=False)

for j in area_list:

df=data[data['店铺']==j]

df.to_excel(writer,sheet_name=j,index=False)

writer.save() #一定要加上这句代码,“拆好的表”才会显示出来

效果如下:

8e7905d4d7816f385fbfa271fe6e1b9e.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值