Python学习基础2-多个表中的内容合并在一起

2019-10-09  本文已影响0人  洪乙己

#如何将多个表中的内容合并在一起

#思路:使用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()

上一篇下一篇

猜你喜欢

热点阅读