Python学习基础2-多个表中的内容合并在一起
#如何将多个表中的内容合并在一起
#思路:使用excel模块,比如xlrd,xlwt,openpyxl,xlsxwriter等模块。
#xlrd模块主要用于读取excel表,
#xlwt与xlsxwriter用于将数据写入表中,但不能修改表
#方案1:使用openpyxl,只对xlsx有效
#方案2:仍然使用xlwt与xlsxwriter等模块,先将每次读取的信息存储到list(列表)中,然后一次写入。
import xlrd,xlsxwriter
#待合并excel,列表形式存储需要合并的文件
allxls=['/Users/zanghong/Documents/腾讯工作/原始数据/第一个测试文件.xlsx',
'/Users/zanghong/Documents/腾讯工作/原始数据/第二个测试文件.xlsx',
'/Users/zanghong/Documents/腾讯工作/原始数据/第三个测试文件.xlsx']
#目标excel,设置合并好的文件存储的路径
end_xls='/Users/zanghong/Documents/腾讯工作/原始数据/合并测试文件.xlsx'
#打开表格
def open_xls(file):
try:
fb=xlrd.open_workbook(file)
return fb
except Eexception as e:
print('打开文件错误:'+e)
#获取所有sheet
def getsheet(fh):
return fh.sheets()
#读取某个sheet的行数
def getnrows(fh,sheet):
table=fh.sheets()[sheet]
shnrows=table.nrows
return shnrows
#读取某个文件的内容并返回所有行的值
def get_file_value(fb,shnum):
fh=open_xls(fb)#打开此文件
table=fh.sheet_by_name(shname[shnum])#获取当前文件当前sheet名的内容
row_num=getnrows(fh,shnum)#得到行数
lenrvalue=len(rvalue)#一开始lenrvalue为0,随着以行为单位的继续添加,rvalue长度按行数增加。当一个sheet为单位的循环结束后,rvalue长度增加一个sheet为单位的长度。
print('看这里'+str(lenrvalue))
if y>0:
for row in range(1,row_num):#按行读取,一行一行读取,读取整个sheet
rdata=table.row_values(row)
rvalue.append(rdata)
print(rvalue[lenrvalue:])
filevalue.append(rvalue[lenrvalue:])#按sheet为单位,添加到文件中。因前面每次循环增加完一个sheet,此时rvalue长度即为加入的sheet的总行数,所以从现行数开始向文件中添加后续的sheet。
else:
for row in range(0,row_num):#按行读取,一行一行读取,读取整个sheet
rdata=table.row_values(row)
rvalue.append(rdata)
print(rvalue[lenrvalue:])
filevalue.append(rvalue[lenrvalue:])#按sheet为单位,添加到文件中。因前面每次循环增加完一个sheet,此时rvalue长度即为加入的sheet的总行数,所以从现行数开始向文件中添加后续的sheet。
return filevalue
shname=[]
filevalue=[]
svalue=[]
rvalue=[]
#读取第一个待读文件,获取sheet数
f1=open_xls(allxls[0])#打开第一个文件
sh=getsheet(f1)#获得所有sheet
x=0
for sheet in sh:#按照列表方式遍历,不是按照数字遍历,想知道循环几次,用x来计数。
shname.append(sheet.name)
svalue.append([])#有几种类型的sheet就设立几个数组,以相同名称的sheet为单位往里添加数据为一组
x+=1
#依次读取各sheet的内容
#依次读取各文件当前sheet的内容
for shnum in range(0,x):#第一个文件中有x个sheet,依次遍历
lenfvalue=len(filevalue)
y=0
for fb in allxls:#依次读取各文件,取各文件相同sheet名的内容
print('正在读取文件:'+str(fb)+'的第'+str(shnum)+'个标签...')
filevalue=get_file_value(fb,shnum) #filevalue为三维度[file1[行1['列1','列2','列3'],行2['列1','列2','列3'],...行n['列1','列2','列3']]...filen[行1['列1','列2','列3'],行2['列1','列2','列3'],...行n['列1','列2','列3']]]
y+=1
svalue[shnum].append(filevalue)#内层循环完后,得到一组各个文件相同sheet名的所有内容,直接添加到svalue中[[0[[[]]]],[1[[[]]]],[2[[[]]]]]
print(shnum)
print(svalue[shnum])
print(svalue[0])
print(svalue[1])
#由于append具有叠加关系,分析可得所有信息均在svalue[0][0]中存储
#print(svalue)
#svalue[0][0]元素数量为sheet标签数(sn)*文件数(fn)
sn=x
fn=len(allxls)
endvalue=[]
def getsvalue(k):
for z in range(k,k+fn):
endvalue.append(svalue[0][0][z])
return endvalue
#打开最终写入的文件
wb1=xlsxwriter.Workbook(end_xls)
#创建一个sheet工作对象
ws=wb1.add_worksheet()
polit=0
linenum=0
#依次遍历每个sheet中的数据
for s in range(0,sn*fn,fn):#步长为文件数
thisvalue=getsvalue(s)
tvalue=thisvalue[polit:]
#将一个标签的内容写入新文件中
for a in range(0,len(tvalue)):
for b in range(0,len(tvalue[a])):
for c in range(0,len(tvalue[a][b])):
data=tvalue[a][b][c]
ws.write(linenum,c,data)
linenum+=1
#叠加关系,需要设置分割点
polit=len(thisvalue)
wb1.close()
# In[ ]:
# In[ ]:
# In[ ]:
#svalue[0][0]元素数量为sheet标签数(sn)*文件数(fn)
sn=x
fn=len(allxls)
endvalue=[]
def getsvalue(k):
for z in range(k,k+fn):
endvalue.append(svalue[0][0][z])
return endvalue
#打开最终写入的文件
wb1=xlsxwriter.Workbook(end_xls)
#创建一个sheet工作对象
ws=wb1.add_worksheet()
polit=0
linenum=0
#依次遍历每个sheet中的数据
for s in range(0,sn*fn,fn):#步长为文件数
thisvalue=getsvalue(s)
tvalue=thisvalue[polit:]
#将一个标签的内容写入新文件中
for a in range(0,len(tvalue)):
for b in range(0,len(tvalue[a])):
for c in range(0,len(tvalue[a][b])):
data=tvalue[a][b][c]
ws.write(linenum,c,data)
linenum+=1
#叠加关系,需要设置分割点
polit=len(thisvalue)
wb1.close()