Python外部数据源文件处理作业(一)

每行都要写注释,直接提交代码

使用openpyxl实现以下需求

  1. 使用excel 写入一组数据,姓名,身高,体重
  2. 计算是否为健康体重,如果是健康体重,则在旁边备注健康,并将姓名打印出来
  • 健康体重计算公式:(身高cm-70)×60%

(可以做一部分优化)

作业-20200507

使用 openpyxl 实现以下需求

  1. 使用excel 写入一组数据,姓名,身高,体重
  2. 计算是否为健康体重,如果是健康体重,则在旁边备注健康,并将姓名打印出来
  • 健康体重计算公式:(身高cm-70)×60%

(可以做一部分优化)

代码

#!usr/bin/env python
# -*- coding: utf-8 -*-
# @Time       : 2020-05-07
# @Author     : Joey Jiang
# @File       : excel_openpyxl.py
# @Software   : Visual Studio Code
# @Description: 使用openpyxl实现excel写入

from openpyxl import load_workbook

'''
定义一个类,类名为PracticeExcel
'''
class PracticeExcel:

    '''
    *初始化类PracticeExcel
    *参数:
        data: 字典类型,key是身高,value是体重
    '''
    def __init__(self,data:dict):
        self.data=data # 定义一个变量data,将参数data的值传给它
    
    '''
    *创建一个方法write_to_excel
    *参数:
        file_name: 文件名
        sheet_name: sheet名
    '''
    def write_to_excel(self,file_name,sheet_name):
        data=self.data # 定义一个变量data,将self.data的值赋给它
        # 1.加载指定文件
        wb=load_workbook(file_name) # 定义一个变量wb,将指定文件的内容赋值给它
        # 2.加载指定sheet
        sheet=wb[sheet_name] # 定义变量sheet,将指定sheet的内容传给它
        # 3.写入标题
        sheet['A1']="身高" # 在sheet的A1位置写入文字身高
        sheet['B1']="体重" # 在sheet的B1位置写入文字体重
        sheet['C1']="备注" # 在sheet的C1位置写入文字备注
        # 4.写入数据
        print(type(data.keys())) # 打印出字典的keys方法返回值的类型
        height_list=list(data.keys()) # 定义一个变量height_list,将data中的关键字转换成list类型后赋值给它
        # 4.1身高和体重的数据直接写入
        for i in range(len(height_list)): # 定义一个循环,循环的次数为height_list列表的长度,变量为i
            sheet.cell(row=i+2,column=1).value=height_list[i] # 将height_list列表中索引为i的元素写入到A列i+2行
            sheet.cell(row=i+2,column=2).value=data.get(height_list[i])# 将data中关键字为height_list[i]的值写入到B列i+2行
        # 4.2只有健康体重需要在旁边备注:健康体重计算公式:(身高cm-70)×60%
            if (int(height_list[i])-70)*0.6 ==int(data.get(height_list[i]))*1.0: # 判断体重是否为健康体重
                sheet.cell(row=i+2,column=3).value="健康体重" # 将文字“健康体重”写入到C列i+2行
        # 5.保存指定文件
        wb.save(file_name) # 保存指定文件

if __name__ == "__main__":  
    file_name="./sample.xlsx" # 定义一个变量file_name,将指定文件名称赋值给它
    sheet_name="Sheet" # 定义一个变量sheet_name,将指定sheet名称赋值给它
    data={"180":"57","190":"72","200":"95"} # 定义一个字典data,关键字为身高,值为体重
    PracticeExcel(data).write_to_excel(file_name,sheet_name) # 使用类对象,传入参数data,调用write_to_excel方法

运行结果

image

*代码:
# 男性:(身高cm-知80)×70﹪=标准体重道

女性:(身高cm-70)×60﹪=标准体重

标准体重±10﹪为正常体重

标准体重±10﹪~ 20﹪为体重过重或过轻;

标准体重±20﹪以上为肥回胖或体重不足;

超重计算公式

超重%=[(实际体重-理想体重)答/(理想体重)]×100%

导入模块

from openpyxl import Workbook,load_workbook

创建类

class HWExcel:
# 生成数据,以列表的形式
Excel_data=[
{‘name’:‘杨幂’,
‘sex’:‘女’,
‘height’:167,
‘weight’:45},
{‘name’:‘赵丽颖’,
‘sex’:‘女’,
‘height’:165,
‘weight’:44},
{‘name’: ‘沈腾’,
‘sex’: ‘男’,
‘height’: 180,
‘weight’: 65},
{‘name’: ‘贾玲’,
‘sex’: ‘女’,
‘height’: 166,
‘weight’: 75},
{‘name’: ‘华晨宇’,
‘sex’: ‘男’,
‘height’: 173,
‘weight’: 51}
]
# 往表格中写入姓名,身高,体重
def Creat_Data(self):
# 创建Excel对象
wb = Workbook()
ws=wb.active
ws.title=“娱乐圈男神女神的身高体重资料卡”
ws[“A1”]=“姓名”
ws[‘B1’]=‘性别’
ws[“C1”]=‘身高’
ws[‘D1’]=‘体重’
ws[‘E1’]=‘备注’
# 利用for循环,往列表里更新数据
for i in range(len(self.Excel_data)):
j = 1
for k,v in self.Excel_data[i].items():
if(j<=4):
ws.cell(row=i + 2, column=j).value = v
j += 1
# 保存数据
wb.save(“Excel_data.xlsx”)

    # 给体重分类
def Stand_weight(self):
    ld=load_workbook(filename='Excel_data.xlsx')
    sheet=ld.active
    # 创建列表,保存计算出来的标准体重
    male=[]
    fmale=[]
    for i in range(len(self.Excel_data)):
        # 根据男性和女性来计算标准体重
        if self.Excel_data[i]['sex']=='男':
            # print(self.Excel_data[i]['height'])
            # print("男生标准体重")
            #   标准体重±10﹪~ 20﹪为体重过重或过轻;
            #   标准体重±20﹪以上为肥回胖或体重不足;
            #   超重计算公式
            #   超重%=[(实际体重-理想体重)答/(理想体重)]×100%
            male=((self.Excel_data[i]['height']-80)*0.7)
            if (male*0.9)<=self.Excel_data[i]['weight'] and self.Excel_data[i]['weight']<=(male*1.1):
                sheet.cell(row=i+2,column=5).value='标准体重'
            elif male*1.1<=self.Excel_data[i]['weight'] and self.Excel_data[i]['weight']<=male*1.2:
                sheet.cell(row=i+2,column=5).value='体重过重'
            elif male*0.8<=self.Excel_data[i]['weight'] and self.Excel_data[i]['weight'] <=male*0.9:
                sheet.cell(row=i+2,column=5).value='体重过轻'
            elif male*0.8>=self.Excel_data[i]['weight']:
                sheet.cell(row=i+2,column=5).value='体重严重不足'
            elif male*1.2<=self.Excel_data[i]['weight']:
                sheet.cell(row=i+2,column=5).value='肥胖'
            # print(male)
        elif self.Excel_data[i]['sex']=='女':
            fmale=((self.Excel_data[i]['height']-70)*0.6)
            if (fmale*0.9)<=self.Excel_data[i]['weight'] and self.Excel_data[i]['weight']<=(fmale*1.1):
                sheet.cell(row=i+2,column=5).value='标准体重'
            elif fmale * 1.1 <= self.Excel_data[i]['weight'] and self.Excel_data[i]['weight'] <= fmale * 1.2:
                sheet.cell(row=i + 2, column=5).value = '体重过重'
            elif fmale * 0.8 <= self.Excel_data[i]['weight'] and self.Excel_data[i]['weight'] <= fmale * 0.9:
                sheet.cell(row=i + 2, column=5).value = '体重过轻'
            elif fmale * 0.8 >= self.Excel_data[i]['weight']:
                sheet.cell(row=i + 2, column=5).value = '体重严重不足'
            elif fmale * 1.2 <= self.Excel_data[i]['weight']:
                sheet.cell(row=i + 2, column=5).value = '肥胖'
    ld.save(filename="Excel_data.xlsx")

data=HWExcel()
data.Creat_Data()
data.Stand_weight()

生成的Excel表格:
image

代码

from openpyxl import Workbook, load_workbook

class PracticeExcel():      #定义一个类,进行excel数据操作
    def __init__(self, filename, title, para, data:dict):   #从外部传入信息:filename(文件名),title(页签名),para(参数名),data(要写入的数据(数据类型为字典——key:value))
        self.filename = filename  # 将传入的参数复制给类属性  文件名
        self.title = title  # 将传入的参数复制给类属性   页签名
        self.para = para    # 将传入的参数复制给类属性   参数——身高、体重
        self.data = data    #将传入的参数复制给类属性    传入的身高、体重数值

    def new_data(self):    #新建excel文件
        wb = Workbook()       #实例化一个Workbook对象
        ws1 = wb.active        #激活当前页签
        ws1.title = self.title  #给页签命名
        for i in range(len(self.para)):  #对表格第一行的参数进行复制
            ws1.cell(row=1,column=i+1).value = self.para[i]
        wb.save(filename=self.filename)   #保存文件

    def write_data(self):   #写入身高体重的具体数值
        ld = load_workbook(self.filename)  #加载需要写入的excel文件
        sheet = ld[self.title]        #获取需要写入excel文件的页签
        height = [i for i in self.data.keys()]   #从写入数据中取出身高(key)
        for i in range(len(height)):  #循环写入每个身高和体重
            sheet.cell(row=i+2,column=1).value = height[i]    #写入身高
            sheet.cell(row=i+2,column=2).value = self.data[height[i]]   #写入体重
        ld.save(self.filename)   #保存文件

    def healthy_data(self):  #判断是否为健康体重
        ld = load_workbook(self.filename)    #加载需要判断的excel文件
        sheet = ld[self.title]   #获取需要判断的excel文件的页签
        i=2  #设置行初值
        while True:  #设置死循环:循环取出excel表格中的数值
            flag = sheet.cell(row=i, column=1).value    #设置跳出循环的条件:当第一列的单元格值为空时跳出循环
            if flag != None:           #如果第一列单元格值不为空,进行取值
                height = sheet.cell(row=i, column=1).value  #取出第一列的数据:height
                weight = sheet.cell(row=i,column=2).value   #取出第二列的数据:weight
                healthy_weight = (height-70)*0.6    #计算健康体重
                if weight == healthy_weight:  #判断是否为健康体重
                    sheet.cell(row=i, column=3).value = "健康体重"  #若为健康体重则在备注栏进行备注
            else:   #当遇到的单元格值为空时,跳出循环
                break   #跳出循环
            i += 1  #进行下一行的操作
        ld.save(self.filename)   #保存文件

data_dict = {159:49,160:54,170:68,155:80, 178:76, 185:69}   #定义身高-体重数据(数据类型为字典)
file_name = "my_data.xlsx"       #定义excel文件名
title_name = "身高-体重"   #定义页签名
para_name = ["身高", "体重", "备注"]     #定义表格第一行参数名
pe = PracticeExcel(file_name, title_name , para_name, data_dict)  #实例化对象,并进行传参
pe.new_data()    #新建excel表格
pe.write_data()   #写入指定数据
pe.healthy_data()  #判断是否为健康体重

运行结果

image

作业

代码地址

https://github.com/llpanyuan/data_processing/blob/master/excel2_pc.py

代码运行

程序内提示健康信息

结果图

表格罗列健康信息

表图

from openpyxl import Workbook, load_workbook
from openpyxl.styles import Font, Alignment


class PracticeExcel:
    def __init__(self,name,height,weight):#将姓名,身高,体重作为实例变量
        self.name = name
        self.height = height
        self.weight = weight
    def create_data(self):
        wb = Workbook()
        ws1 = wb.active  #获取第一个sheet
        ws1.title = "create"  #给第一个sheet命名
        ws1["A1"] = "姓名"  #首行写入
        ws1["A1"].alignment = Alignment(horizontal='center', vertical='center') #居中
        ws1["B1"] = "身高"    #首行写入
        ws1["A1"].alignment = Alignment(horizontal='center', vertical='center') #居中
        ws1["C1"] = "体重"    #首航写入
        ws1["A1"].alignment = Alignment(horizontal='center', vertical='center') #居中
        # name = ["张三","李四","妮妮","熊熊"]
        # height = [180,160,185,155]
        # weight = [120,100,140,110]
        for i in range(len(self.name)):     #创建循环,循环将姓名,身高,体重写入
            ws1.cell(row=i + 2,column= 1).value = self.name[i]
            ws1.cell(row=i + 2, column= 2).value = self.height[i]
            ws1.cell(row=i + 2, column= 3).value = self.weight[i]
            ws1.cell(row=i + 2,column= 4).value = (ws1.cell(row=i + 2, column= 2).value-70)*0.6  #将公式写入第四列
            ws1.cell(row=i + 2, column=1).alignment = Alignment(horizontal='center', vertical='center')  #规范格式为居中
            ws1.cell(row=i + 2, column=2).alignment = Alignment(horizontal='center', vertical='center')
            ws1.cell(row=i + 2, column=3).alignment = Alignment(horizontal='center', vertical='center')
            ws1.cell(row=i + 2, column=4).alignment = Alignment(horizontal='center', vertical='center')
        wb.save("data.xlsx")        #保存写入内容

    def health_data(self):
        ld = load_workbook(filename="data.xlsx")   #读现有工作表
        sheet = ld["create"]            #读当前sheet
        for i in range(len(self.name)):     #循环判断第四列的内容
            if self.weight[i] == sheet.cell(row=i + 2, column=4).value:
                print(self.name[i],"拥有健康的体重,体重是:",self.weight[i],"kg")  #打印结果
                sheet.cell(row=i + 2,column=5).value = "此人健康"  #在excel中添加内容
        ld.save(filename="data.xlsx")   #保存对excel的改动
if __name__ == '__main__':
    name = ["张三","李四","妮妮","熊熊"]
    height = [180,160,185,155]
    weight = [66,50,70,55]
    P = PracticeExcel(name,height,weight)
    P.create_data()
    P.health_data()

运行结果:
image

源代码地址:

https://github.com/michelle885/Python1/blob/master/exercise_excel.py

运行结果:

生成的excel:

# 导入所需要用到的workbook包
from openpyxl import Workbook, load_workbook


# 定义健康体重的类
class HealthWeigth:
    # 构造创建数据的方法
    def creat_wb_data(self):
        # 实例化Wookbook
        wb = Workbook()
        # 创建使用sheet的实例
        ws = wb.active
        # 创建sheet名
        ws.title = "身高体重一览"
        # 创建表格头,共4列
        ws["A1"] = "姓名"
        ws["B1"] = "身高"
        ws["C1"] = "体重"
        ws["D1"] = "备注"

        # 定义名字\身高\体重
        

        name = ["小明", "小贾", "小红", "小芳"]
        height = [180, 160, 165, 171]
        weigth = [88, 48, 60, 50]
        # for循环写入定义的数据,
        for i in range(len(height)):
            # 写入名字
            ws.cell(row=i + 2, column=1).value = name[i]
            # 写入身高
            ws.cell(row=i + 2, column=2).value = height[i]
            # 写入体重
            ws.cell(row=i + 2, column=3).value = weigth[i]
         # 保存wb
        wb.save("whatnever.xlsx")
    # 定义健康体重判定的方法
    def health_data(self):
        # 读取文件
        ld = load_workbook(filename="whatnever.xlsx")
        # 读取sheet 并赋值给sh
        sh = ld["身高体重一览"]
        # 把表格的姓名,身高体重 赋值给 name1,height1和weight1
        for i in range(4):
            name1 = sh.cell(row=i + 2, column=1).value
            height1 = sh.cell(row=i + 2, column=2).value
            weight1 = sh.cell(row=i + 2, column=3).value
            # 赋值health_weight
            health_weight = (height1 -70 )* 0.6
            # 判断 体重小于健康体重,则打印姓名,并在表格中写入健康体重
            if weight1 <= health_weight:
                print(f"恭喜{name1},你的体重很健康")
                # 表格中写入健康体重
                sh.cell(row=i+2,column=4).value ="健康体重"
        # 保存文件
        ld.save(filename="whatnever.xlsx")

hw = HealthWeigth()
hw.creat_wb_data()
hw.health_data()

运行程序截图
image

运行后excel文档截图
image

使用 openpyxl 实现以下需求

  1. 使用excel 写入一组数据,姓名,身高,体重
  2. 计算是否为健康体重,如果是健康体重,则在旁边备注健康,并将姓名打印出来
  • 健康体重计算公式:(身高cm-70)×60%

(可以做一部分优化)


image
image

作业:使用excel写入一组数据(姓名、身高、体重),计算健康值并标注


image
image

作业链接:

写入结果:
image
打印结果:
image

问题:
写入excel数据时:

如果身高有2个或者多个相同的人,字典keys索引越界

读取execl时:

如何获取excel列表中的长度?而不是输入一个固定数据

如何设置column的数据,而不是输入一个固定的列

  1. 不同的数据,应该灵活选用不同的数据结构存放。字典的key值是唯一的。
    如果·key值出现重复,应该使用别的数据结构
  2. 官方文档,百度都可以查到对应的api,如果需要拓展可以试着自行查询
  3. 同row相同,可以使用循环实现
  1. 不同的数据,应该灵活选用不同的数据结构存放。字典的key值是唯一的。
    如果·key值出现重复,应该使用别的数据结构
  2. 官方文档,百度都可以查到对应的api,如果需要拓展可以试着自行查询
  3. 同row相同,可以使用循环实现
'''
使用openpyxl实现以下需求:
    1.使用excel写入一组数据,包含:姓名,性别,身高,体重
    2.计算是否为健康体重,如果是健康体重,则在旁边备注健康,并将姓名打印出来
    3.健康体重计算公式:
        男:(身高-80)*70%
        女:(身高-70)*60%
        上下浮动10%均为健康
'''
from openpyxl import Workbook, load_workbook  # 导入openpylx模块


class HeightCheck:  # 定义HeightCheck
    def create_data(self):  # 定义create_data方法
        wb = Workbook()  # 创建excel表格
        ws1 = wb.active  # 获取当前sheet页
        ws1.title = 'create'  # 给当前sheet取名'create'
        ws1['A1'] = '姓名'  # A列的第1行输入‘名字’
        ws1['B1'] = '性别'  # B列的第1行输入‘性别’
        ws1['C1'] = '身高'  # C列的第1行输入‘身高’
        ws1['D1'] = '体重'  # D列的第1行输入‘体重’

        name = ['娟娟', '行行', '泽伟', '左丽', '肖龙']  # 创建name列表并赋值
        sex = ['女', '男', '男', '女', '男']  # 创建sex列表并赋值
        height = [160, 175, 179, 160, 180]  # 创建height列表并赋值
        weight = [53, 75, 73, 56, 60]  # 创建weight列表并赋值

        for i in range(len(name)):  # 根据name列表的长度进行for循环
            ws1.cell(column=1, row=i + 2, value=name[i])  # 将name列表的值放在excel表格的A列
            ws1.cell(column=2, row=i + 2, value=sex[i])  # 将sex列表的值放在excel表格的B列
            ws1.cell(column=3, row=i + 2, value=height[i])  # 将height列表的值放在excel表格的C列
            ws1.cell(column=4, row=i + 2, value=weight[i])  # 将weight列表的值放在excel表格的D列

        wb.save('data1.xlsx')  # 保存excel表格,文件名为‘data1.xlsx’

    def health_data(self):  # 定义health_data方法
        ld = load_workbook(filename='data1.xlsx')  # 读取文件名为‘data1.xlsx’的excel表格
        sheet = ld['create']  # 定位到表格的'create'页签
        sheet['E1'] = '备注'  # 在E列的第1行输入‘备注’
        for i in range(5):  # 根据name列表的长度进行for循环
            sex = sheet.cell(column=2, row=i + 2).value  # 取B列的值赋给sex
            height = sheet.cell(column=3, row=i + 2).value  # 取C列的值赋给height
            weight = sheet.cell(column=4, row=i + 2).value  # 取D列的值赋给weight
            if sex == '男':  # 如果sex为‘男’,进行下面的运算
                health_weight = (height - 80) * 0.7  # 性别为男的健康体重计算
            else:  # 否则进行下面的运算
                health_weight = (height - 70) * 0.6  # 性别为女的额健康体重计算

            if weight < health_weight * 0.9:  # 如果体重小于健康体重的90%,则为偏瘦
                sheet.cell(column=5, row=i + 2, value='偏瘦')  # 在E列的备注中输入‘偏瘦’
            elif health_weight * 0.9 <= weight <= health_weight * 1.1:  # 如果体重在健康体重上下浮动10%以内,则为健康
                sheet.cell(column=5, row=i + 2, value='健康体重')  # 在E列的备注中输入‘健康体重’
            else:  # 否则为‘偏胖’
                sheet.cell(column=5, row=i + 2, value='偏胖')  # E列的备注中输入‘偏胖’
        ld.save('data1.xlsx')  # 保存excel表格,文件名为‘data1.xlsx’


hc = HeightCheck()  # 对HeightCheck类进行实例化
hc.create_data()  # 实例对象hc调用HeightCheck类中的create_data方法
hc.health_data()  # 实例对象hc调用HeightCheck类中的health_data方法

结果:
image

from openpyxl import Workbook, load_workbook
from openpyxl.styles import Alignment
# 导包操作

class RePracticeExcel: # 定义一个练习类,需要传入文件名,sheet名,数据
    def __init__(self, dest_filename, title, data):
        self.dest_filename = dest_filename
        self.title = title
        self.data = data

    def create_data(self): # 创建数据
        wb = Workbook() # 实例化
        ws1 = wb.active  # 获取当前活跃页签1
        ws1.title = self.title  # 第一张sheet名为传入参数
        ws1['A1'] = "身高"  # A1单元格填入身高
        ws1['A1'].alignment = Alignment(horizontal='center', vertical='center') # 格式化
        ws1['B1'] = "体重"  # B1单元格填入体重
        ws1['B1'].alignment = Alignment(horizontal='center', vertical='center')
        ws1['C1'] = "备注"
        ws1['C1'].alignment = Alignment(horizontal='center', vertical='center')
        height = [i for i in self.data.keys()] # 循环取出身高
        weight = [i for i in self.data.values()] # 循环取出体重
        for i in range(len(height)): # 填入表格
            ws1.cell(row=i + 2, column=1).value = height[i]
            ws1.cell(row=i + 2, column=2).value = weight[i]
        wb.save(filename=self.dest_filename)  # 不要忘记保存文件

    def get_data(self): #读取文件的方法
        lw = load_workbook(filename="data.xlsx")
        sheet = lw["create"]
        for row in range(len(sheet["A"])):
            for col in range(len(sheet["1"])):
                print(sheet.cell(row=row + 1, column=col + 1).value, end=" ")

    def healthy_data(self): # 计算健康体重
        lw = load_workbook(filename=self.destname)
        sheet = lw[self.title]
        for i in range(len(sheet["A"]) - 1): # 同上
            height = sheet.cell(row=i + 2, column=1).value
            weight = sheet.cell(row=i + 2, column=2).value
            health_weight = (height - 70) * 0.6
            if weight == health_weight:
                print(i + 1, "这是健康的体重")
                sheet.cell(row=i + 2, column=3).value = "健康体重"
            elif weight < health_weight:
                print(i + 1, "体重过轻")
                sheet.cell(row=i + 2, column=3).value = "体重过轻"
            elif weight > health_weight:
                print(i + 1, "体重过重")
                sheet.cell(row=i + 2, column=3).value = "体重过重"
        lw.save(filename="data.xlsx")


if __name__ == '__main__':
    data = {180: 60, 160: 55, 170: 60, 155: 80}
    R = RePracticeExcel("data.xlsx", "healthy data", data)
    R.healthy_data()
关闭