新西兰服务器

Python怎么实现多表和工作簿合并及一表按列拆分


Python怎么实现多表和工作簿合并及一表按列拆分

发布时间:2022-05-21 17:33:00 来源:高防服务器网 阅读:89 作者:iii 栏目:开发技术

今天小编给大家分享一下Python怎么实现多表和工作簿合并及一表按列拆分的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

一、相关知识点讲解

1.1 需要使用的相关库

import numpy as np  import pandas as pd  import os

1.2 os.walk(pwd)

先来看看"G:a"文件夹下有哪些东西:

代码操作如下:

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)

结果如下:

<generator object walk at 0x0000029BB5AEAB88>
('G:\a', [], ['aa.txt', 'bb.xlsx', 'cc.txt', 'dd.docx'])
['aa.txt', 'bb.xlsx', 'cc.txt', 'dd.docx']

1.3 os.path.join(path2,path3&hellip;)

作用:将多个路径组合后返回

举例如下:

path2 = 'G:\a'  path3 = 'aa.txt'  print(os.path.join(path2,path3))

结果如下:

G:aaa.txt

1.4 案例解析

举例如下:

pwd = "G:\a"  file_path_list = []  for path,dirs,files in os.walk(pwd):      for file in files:          file_path_list.append(os.path.join(pwd,file))  print(file_path_list)

结果如下:

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

1.5 如何在一个列表中存放多个 DataFrame 数据

# 先使用如下代码创建两个DataFrame数据源。  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)

结果如下:

怎么讲上述两个DataFrame拼接在一起?

concat_list = []  concat_list.append(xx)  concat_list.append(yy)  # pd.concat(list)中【默认axis=0】默认的是数据的纵向合并。  # pd.concat(list)括号中传入的是一个DataFrame列表。  # ignore_list=True表示忽略原有索引,重新生成一组新的索引。  z = pd.concat(concat_list,ignore_list=True)  print(z)  # 或者直接可以写成z = pd.concat([xx,yy],ignore_list=True)

结果如下:

二、多工作簿合并(一)

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

操作如下:

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)

结果如下:

三、多工作簿合并(二)

3.1 相关知识点讲解

3.1.1 xlsxwrite 的用法

1)创建一个"工作簿",此时里面会默认生成一个名叫"Sheet1"的Sheet表。

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()

结果如下:

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()

结果如下:

3.1.2 xlrd 的用法

1)打开某一个存在的excel文件,返回给我们"xlrd.book.Book"工作簿对象;  # 这里所说的"打开"并不是实际意义上的打开,只是将该表加载到内存中打开。  # 我们并看不到"打开的这个效果"  # 以打开上述创建的"test.xlsx"文件为例;  import xlrd   file = r"G:Jupytertest.xlsx"   xlrd.open_workbook(file)   # 结果如下:   <xlrd.book.Book at 0x29bb8e4eda0>  2)sheet_names():获取所有的sheet表表名,假如有多个sheet表,返回一个列表;  import xlrd  file = r"G:Jupytertest.xlsx"  fh = xlrd.open_workbook(file)  fh.sheet_names()  # 结果如下:  ['2018年销售量', '2019年销售量']    3)sheets()方法:返回的是sheet表的对象列表。  # 返回sheet表的对象列表  fh.sheets()  # 结果如下:  [<xlrd.sheet.Sheet at 0x29bb8f07a90>, <xlrd.sheet.Sheet at 0x29bb8ef1390>]  # 可以利用索引,获取每一个sheet表的对象  fh.sheets()[0]  结果是:<xlrd.sheet.Sheet at 0x29bb8f07a90>  fh.sheets()[1]  结果是:<xlrd.sheet.Sheet at 0x29bb8ef1390>  4)返回每一个sheet表的行数(nrows) 和 列数(ncols);  # 我们可以利用上述创建的sheet表对象,对每一个sheet表进行操作;  fh.sheets()[0].nrows  # 结果是:4  fh.sheets()[0].ncols  # 结果是:3    5)row_values(行数):获取每一个sheet表中每一行的数据;  sheet1 = fh.sheets()[0]  for row in range(fh.sheets()[0].nrows):     value = sheet1.row_values(row)     print(value)

结果如下:

6)col_values(列数):获取每一个sheet表中每一列的数据;  sheet1 = fh.sheets()[0]  for col in range(fh.sheets()[0].ncols):     value = sheet1.col_values(col)     print(value)

结果如下:

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

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("文件合并完成")

将上述代码封装后如下:

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();

结果如下:

四、一个工作簿多 heet 合并

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

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:UsersAdministratorDesktopscore.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()

结果如下:

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

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

import pandas as pd  import xlsxwriter   data=pd.read_excel(r"C:UsersAdministratorDesktopchaifen.xlsx",encoding='gbk')  area_list=list(set(data['店铺']))  writer=pd.ExcelWriter(r"C:UsersAdministratorDesktop拆好的表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()  #一定要加上这句代码,“拆好的表”才会显示出来

结果如下:

以上就是“Python怎么实现多表和工作簿合并及一表按列拆分”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注高防服务器网行业资讯频道。

[微信提示:高防服务器能助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。

[图文来源于网络,不代表本站立场,如有侵权,请联系高防服务器网删除]
[