day17-csv、Excel的读写转换和面向对象编程

读取CSV文件
import csv

# utf-8-sig ---> 带签名的utf-8 ---> 有字节序标记
with open('resource/2018年北京积分落户数据.csv', 'r', encoding='utf-8-sig') as file:
    # delimiter参数默认是逗号,但是如果值不是用逗号分隔的就要重新指定
    # quotchar参数的默认值是引号,但是如果值不是用引号包围的就要重新指定
    reader = csv.reader(file, delimiter=',')
    print(type(reader))			# <class '_csv.reader'>
    for line in reader:
        print(line)

在这里插入图片描述

将数据写入csv文件
import csv

with open('resource/2018年北京积分落户数据.csv', 'a', endcoding='utf-8-sig', newline='') as file:
    writer = csv.writer(file)
    writer.writerows([
        ['6021', '王五', '2000-02', '北京阿里巴巴云计算技术有限公司', '114.96'],
        ['6022', '李四', '2002-05', '北京阿里巴巴云计算技术有限公司', '104.96'],
        ['6023', '赵二', '2001-01', '北京阿里巴巴云计算技术有限公司', '124.96']
    ])

在这里插入图片描述

读取CSV文件转换成Excel格式
import csv

import openpyxl
from openpyxl.styles import Font, Alignment

workbook = openpyxl.Workbook()
sheet = workbook.active
sheet.title = '2018年'

with open('resource/2018年北京积分落户数据.csv', 'r', encoding='utf-8-sig') as file:
    reader = csv.reader(file)
    for line in reader:
        sheet.append(line)
        
# 修改行的高度
sheet.row_dimensions[1].height = 40
cols_width = {
    'A': 30,
    'B': 50,
    'C': 60,
    'D': 180,
    'E': 50
}
# 修改列的宽度
for key in cols_width:
    sheet.column_dimensions[key].width = cols_width[key]
# 修改单元格式
for col in range(1, 6):
    sheet.cell(1, col).font = Font(name='楷体', size=22, bold=True, color='990099')
    sheet.cell(1, col).alignment = Alignment(horizontal='center', vertical='center')
workbook.save('resource/2018年北京积分落户数据.xlsx')

在这里插入图片描述

读Excel文件
import openpyxl

# 加载Excel文件 ---> Workbook
workbook = openpyxl.load_workbook('resource/口罩销售数据.xlsx')
# 获取所有工作表的名字
print(workbook.sheetnames)
# 获得第一个工作表 ---> Worksheet
sheet = workbook.worksheets[0]
# 获取单元格的数据
print(sheet.cell(3, 4).value)
print(sheet['D3'].value)
# 单元格的范围
print(sheet.dimensions)
# 获取表格的函数和列数
print(sheet.max_row, sheet.max_column)
# 循环遍历所有的数据
for row in range(1, sheet.max_row + 1):
    for col in range(1, sheet.max_col):
        print(sheet.cell(row, col).value, end='\t')
    print()

在这里插入图片描述
在这里插入图片描述

面向对象编程(OOP)

用对象的概念将数据和操作数据的函数从逻辑上组织成一个整体

在面向对象的世界里,我们要解决任何问题都是通过创建对象,任何给对象发出消息

  • 对象 - 接收消息的实体 - 具体概念
  • 类 - 对象的蓝图和模板 - 抽象概念
  1. 一切皆为对象
  2. 每个对象都是独一无二的
  3. 对象都有静态特征(属性)和动态特征(行为)
  4. 对象一定属于某个类
面向对象编程的实施步骤:
  1. 定义类
    • 数据抽象:给出对象的静态特征 - 属性
    • 行为抽象:给出对象的动态特征 - 行为
  2. 创建对象
  3. 给对象发消息
# 第一步:定义类


class Rectangle:
    """矩形"""
    
    def __init__(self, *, width, height):
        """初始化方法
        :param width: 矩形的宽度
        :param height: 矩形的高度
        """
        self.width = width
        self.height = height
    
    def permeter(self):
        """计算周长"""
        return (self.width + self.height) * 2
    
    def area(self):
        """计算面积"""
        return self.width * self.height
    
# 第二步:创建对象 ---> 构造器语法
rect = Rectangle(width, height=3)
# 第三步:给对象发消息
print(f'矩形的周长是:{rect.perimeter()}')		# 矩形的周长是:16
print(f'矩形的面积是:{rect.area()}')		# 矩形的面积是:15

练习:写一个圆的类

import math


class Circle:
    """圆"""
    
    def __init__(self, radius):
        """
        初始化方法
        :param radius:圆的半径
        """
        self.radius = radius
        
    def perimeter(self):
        """圆的周长"""
        return 2 * math.pi * self.radius
    
    def area(self):
        """圆的面积"""
        return math.pi * self.radius ** 2
    
# 求游泳池周围3米宽的同心圆的道路和围墙多少钱,围墙:38.2元/米,过道:28.5元/平方米
r = float(input('请输入游泳池的半径:'))
c1, c2 = Circle(r), Circle(r + 3)
fence_price = c2.perimeter() * 38.2
aisle_price = (c2.area() - c1.area()) * 28.5
print(f'过道的造价为:{aisle_price:.2f}元')
print(f'围墙的造价为:{perim_price:.2f}元')

在这里插入图片描述

练习:定义类描述数字时钟

  • 变量、函数的命名:snake_case
  • 类命名:CamelNotation
# import os
import time


class Clock:
    """数字时钟"""
    
    def __init__(self, hour=0, minute=0, second=0, mode_12=False):
        """初始化方法
        :param hour: 时
        :param minute: 分
        :param second: 秒
        :param mode_12: 是否12小时制
        """
        self.hour = hour
        self.minute = minute
        self.second = second
        self.mode_12 = mode_12
        
    def show(self):
        """显示时间"""
        if self.mode_12:
            if self.hour < 12:
                return f'{self.hour:0>2d}:{self.minute:0>2d}:{self.second:0>2d} AM'
            else:
                hour = self.hour - 12 if self.hour > 12 else self.hour
                return f'{hour:0>2d}:{self.minute:0>2d}:{self.second:0>2d} PM'
        return f'{self.hour:0>2d}:{self.minute:0>2d}:{self.second:0>2d}'
    
    def run(self):
        """走字"""
        self.second += 1
        if self.second == 60:
            self.second = 0
            self.minute += 1
            if self.minute == 60:
                self.minute = 0
                self.hour += 1
                if self.hour == 24:
                    self.hour = 0
                    
                    
clock = Clock(hour=15, minute=5, second=52)
while True:
    # 通过os模块的system函数调用系统命令
    # 清屏:windows - 'cls'/macOS - 'clear'
    # os.system('cls')			# 在终端的时候用
    print(clock.show())
    time.sleep(1)
    clock.run()

在这里插入图片描述

作业:定义类来描述倒计时
import time


class CountDown:
    """倒计时"""
    
    def __init__(self, hour=23, minute, 59, second=59):
        """初始化方法
        :param hour: 时
        :param minute: 分
        :param second: 秒
        """
        self.hour = hour
        self.minute = minute
        self.second = second
        
    def show(self):
        """显示时间"""
        return f'{self.hour:0>2d}:{self.minute:0>2d}:{self.second:0>2}'
    
    def run(self):
        """走字"""
        if self.second != 0:
            self.second -= 1
            elif self.second == 0:
                if self.minute:
                    self.second = 59
                    self.minute -= 1
                elif self hour:
                    self.second = 59
                    self.minute = 59
                    self.hour -= 1
                else:
                    print('倒计时结束')
                    exit()
                    
                    
hour1 = int(input('输入时:'))
minute1 = int(input('输入分:'))
second1 = int(input('输入秒:'))
count_down = CountDown(hour1, minute1. second1)
while True:
    # os.system('cls')
    print(count_down.show())
    time.sleep(1)
    count_down.run()

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值