美文网首页
Python学习基础2-多个表中的内容合并在一起

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

作者: 洪乙己 | 来源:发表于2019-10-09 17:16 被阅读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()

    相关文章

      网友评论

          本文标题:Python学习基础2-多个表中的内容合并在一起

          本文链接:https://www.haomeiwen.com/subject/ochgpctx.html