【第17天】Python第一阶段学习总结
2021/10/12
一. 读取csv文件
1. csv.reader(文件名, delimiter=’’, quotechar=’’)
- delimiter参数默认是逗号,但是如果值不是用逗号分隔的就要重新设定
- quotechar参数默认值是引号,但是如果值不是用引号包围的就需要重新指定
import csv
# utf-8-sig ---> 带签名的UTF-8 ---> 有字节序标记
with open('resources/2018年北京积分落户数据.csv', 'r', encoding='utf-8-sig') as file:
reader = csv.reader(file) # csv.reader(file, delimiter='#', quotechar='|')
for line in reader:
print(line)
二. 将数据写入csv文件
1. csv.writer(文件名)
import csv
# newline参数:只换一行
with open('resources/2018年北京积分落户数据.csv', 'a', encoding='utf-8-sig', newline='') as file:
writer = csv.writer(file)
# writer.writerow(['6020', '骆昊', '1980-11', '北京千峰有限公司', '120.75'])
writer.writerows([
['6021', '王大锤', '1990-11', '北京千峰有限公司', '90.75'],
['6022', '李元芳', '1985-11', '北京千峰有限公司', '80.75']
])
三. 读取csv文件转换成Excel格式
import csv # 标准库
import openpyxl # 三方库
from openpyxl.styles import Font, Alignment
workbook = openpyxl.Workbook()
sheet = workbook.active
sheet.title = '2018年'
with open('resources/2018年北京积分落户数据.csv', 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)
sheet.cell(1, col).alignment = Alignment(horizontal='center', vertical='center')
workbook.save('resources/2018年北京积分落户数据.xlsx')
四. 读取Excel文件
-
workbook = openpyxl.load_workbook(文件路径):获取文件
-
workbook.sheetnames:获取工作表名
-
sheet = workbook.worksheets[下标]:获得第N个工作表
-
sheet.cell(行, 列).value/sheet[‘D3’].value:获取单元格的数据
-
sheet.dimensions:单元格的范围
-
sheet.max_row, sheet.max_column:获取表格最大的行数和列数
import openpyxl
# 加载Excel文件 ---> Workbook
workbook = openpyxl.load_workbook('resources/口罩销售数据.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(2, sheet.max_row + 1):
for col in 'ABCDEF':
print(sheet[f'{col}{row}'].value, end='\t')
print()
五. 面向对象编程(OOP)
1. 面向对象编程
- 用对象的概念将数据和操作数据的函数从逻辑上组织成一个整体。
- 在面向对象的世界里,我们要解决任何问题都是通过先创建对象,然后给对象发出消息。
2. 对象
- 接收消息的实体 —> 具体概念
3. 类
- 象的蓝图和模板 —> 抽象概念
- 命名
- 变量、函数的命名:snake_case
- 类命名:CamelNotation
4. 特点
- 一切皆为对象
- 每个对象都是独一无二的
- 对象都有静态特征(属性)和动态特征(行为)
- 对象都属于某个类
4. 实施步骤
- 定义类
- 数据抽象:给出对象的静态特征 —> 属性
- 行为抽象:给出对象的动态特征 —> 行为
- 创建对象
- 通过给对象发消息,完成指定的目标
# 第1步:定义类
# 类的命名,首字母大写
class Rectangle:
"""矩形"""
# 写在类里面的函数,叫方法(downder init:魔术方法,有特殊含义特殊用途的方法)
# self:接收消息的对象
def __init__(self, *, width, height):
"""
初始化方法
:param width: 矩形的宽度
:param height: 矩形的高度
"""
# 数据抽象:初始化属性
self.width = width
self.height = height
# 行为抽象1:计算周长
def perimeter(self):
"""计算周长"""
return (self.width + self.height) * 2
# 行为抽象2:计算面积
def area(self):
"""计算面积"""
return self.width * self.height
# 第2步:创建对象 ---> 构造器语法
# 构造器语法:变量名 = 类名字()
rect = Rectangle(width=5, height=3)
# 第3步:给对象发消息
print(f'矩形的周长是:{rect.perimeter()}')
print(f'矩形的面积是:{rect.area()}')
# 练习:给一个圆形游泳池修过道和围墙需要的金额
import math
class Circle:
def __init__(self, radius):
self.radius = radius
def perimeter(self):
return 2 * math.pi * self.radius
def area(self):
return math.pi * self.radius ** 2
r = float(input('请输入游泳池的半径:'))
c1 = Circle(r)
c2 = Circle(r + 3)
fence_price = c2.perimeter() * 38.2
aisle_price = (c2.area() - c1.area()) * 28.5
print(f'过道的造价为:{aisle_price:,.2f}元')
print(f'围墙的造价为:{fence_price:,.2f}元')
# 练习2:定义类描述数字时钟
import time
class ClockInfoSystem:
"""时钟"""
def __init__(self, hour=0, minute=0, second=0):
"""初始化方法
:param hour: 时针
:param minute: 分针
:param second: 秒针
"""
self.hour = hour
self.minute = minute
self.second = second
def show(self, mode_12=False):
"""显示时间
:param mode_12: 是否使用12小时制式
:return:
"""
if 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 = ClockInfoSystem(23, 59, 58)
while True:
# 通过os模块的system函数调用系统命令
# 清屏:Windows ---> cls
# import os
# os.system('cls')
print(clock.show(True))
time.sleep(1)
clock.run()