1.代码调试的方式
断言
assert 正确的元素状态,如果元素状态出现问题给出的错误提示
正确的元素状态 返回的是bool类型的 满足条件 代码向下执行
不满足条件 出现断言错误 给出错误提示
list0 = ["abc", "hello", 123, "good"]
list1 = [str(item) for item in list0]
for item in list0:
# 断言
assert isinstance(item, str), "item需要是字符串类型,但是该数据%s不是字符串格式" % (item)
print(item.upper())
'''
Traceback (most recent call last):
ABC
File "C:/Users/11143/Documents/讲课容/BJ_Python1811/day19/Day19/debug_pack/bug_demo.py", line 7, in <module>
assert isinstance(item, str), "item需要是字符串类型 但是该数据%s不是字符串格式" % (item)
HELLO
AssertionError: item的值需要是字符串类型 但是该数据123不是字符串格式
'''
logging
需要先导入模块 logging
在进行测试之前先添加一行配置语句:
logging.basicConfig(level=logging.INFO)
logging.info(数据信息)
import logging
logging.basicConfig(level=logging.INFO)
list0 = ["abc", "hello", 123, "good"]
for item in list0:
logging.info("item=%s" % (item))
print(item.upper())
'''
INFO:root:item=abc
INFO:root:item=hello
INFO:root:item=123
Traceback (most recent call last):
File "F:/老师代码/第04周/day19/debug_pack/bug_demo.py", line 17, in <module>
print(item.upper())
AttributeError: 'int' object has no attribute 'upper'
'''
单元测试
单元测试的作用:
用来对一个函数, 一个类或者一个模块进行正确测验的工作
如何进行单元测试:
导入unittest模块
声明一个类 继承自 unittest.TestCase
# 对列表进行升序排序
def sort_list(src_list):
# 冒泡排序
for out in range(1, len(src_list)):
for i in range(0, len(src_list) - out):
if src_list[i] > src_list[i+1]:
src_list[i], src_list[i+1] = src_list[i+1], src_list[i]
return src_list
def add(num1, num2):
return num1 + num2
from debug_pack.tools import *
import unittest
class Test(unittest.TestCase):
def test_sort_list(self):
self.assertEqual(sort_list([12, 54, 31, 79, 62]), [12, 31, 54, 62, 79], "跟设定结果不一致的情况下的错误提示")
def test_add(self):
self.assertEqual(add(12, 34), 46, "加法错误")
if __name__ == '__main__':
unittest.main()
文档测试
首先导入模块 import doctest
如果对外提供一个功能 功能中有对功能调用的实例 需要先验证实例的准确性 就可以使用文档测试进行调试
当没有问题的时候就可以对外提供了
import doctest
def sort_list(src_list):
'''
对功能的讲解: 对列表进行升序排序
:param src_list: 需要调用者传入一个列表
:return: 返回排好序的列表
Example:
>>> sort_list([12, 34, 19, 25])
[12, 19, 25, 34]
'''
# 冒泡排序
for out in range(1, len(src_list)):
for i in range(0, len(src_list) - out):
if src_list[i] > src_list[i+1]:
src_list[i], src_list[i+1] = src_list[i+1], src_list[i]
return src_list
print(sort_list([71, 22, 19, 55]))
# 文档测试
doctest.testmod()
2.读写doc|excel|csv文件
读写csv文件
需要模块 csv
import csv
from read_write_file.person import Person
# 写内容
# 先向csv文件中写入内容
with open("test.csv", "w", encoding="utf-8", newline="") as handle:
# 向csv文件中写入的手柄
csv_writer = csv.writer(handle)
csv_writer.writerow(["name","age","sex","score"])
csv_writer.writerows([["韩梅梅","15","女","99"],["李雷","16", "男","88"],["马冬梅","14","女","89"],["郝建","17","男","20"]])
person_list = []
with open("test.csv","r", encoding="utf-8") as handle:
# 获取csv单独的读取方式 使用csv.reader将数据从csv文件中读取完毕
csv_reader = csv.reader(handle)
# 本身就是一个容器的存在 存放这csv文件中一行一行的数据 每一行使用的是一个列表存放的
index= 0
for item in csv_reader:
print(item)
index += 1
if index >= 1:
person = Person(item[0], item[1], item[2], item[3])
person_list.append(person)
print(person_list)
读写excel表格
xlrd(读的) xlwt(写的)
pip install xlrd
pip install xlwt
写
import xlwt
path = r"text.xls"
# 1. 先创建一个表格工作簿
work_book = xlwt.Workbook(encoding="utf-8")
# 创建sheet
sheet = work_book.add_sheet("成绩单")
row0 = ["姓名","成绩"]
row1 = ["陈昕", "59"]
row2 = ["黄懋生","60"]
row3 = ["尹昊", "61"]
# 设置样式的方法
def set_style(name, size, bold = False):
# 声明样式对象
style = xlwt.XFStyle()
# 获得设置文字的样式
font = xlwt.Font()
# 设置字体名字
font.name = name
font.height = size
font.bold = bold
# 将字体赋值给样式对象
style.font = font
return style
for i in range(len(row0)):
# 第一个参数:行;第二个参数:列;第三个参数:该行该列的内容;第四个参数:设置样式
# 设置字号的时候 在原有的基础上乘以10
sheet.write(0, i, row0[i], set_style("楷体", 30, True))
sheet.write(1, i, row1[i])
sheet.write(2, i, row2[i])
sheet.write(3, i, row3[i])
# 保存信息
work_book.save(path)
读
import xlrd
path = r"text.xls"
# 打开该工作部
wb = xlrd.open_workbook(path)
# 获得所有的sheet单名字
sheets = wb.sheet_names()
print(sheets)
# 获取指定的某个sheet单
# 根据索引获取
sheet = wb.sheets()[0]
# 根据某个索引获得某个表单
sheet = wb.sheet_by_index(0)
# 根据表单名字来获取
sheet = wb.sheet_by_name("成绩单")
print(sheet)
# 获取表单的名字
name = sheet.name
print(name)
# 行数
rows = sheet.nrows
print(rows)
# 列数
cols = sheet.ncols
print(cols)
# 读取整行数据 参数行数
row_data = sheet.row_values(0)
print(row_data) # 获取的是列表
# 从哪一列开始读取该行
row_data = sheet.row_values(0,1)
print(row_data) # 获取的是列表
# 读取整列的内容
col_data = sheet.col_values(0)
print(col_data)
# 从哪一行开始读取该列
col_data = sheet.col_values(0, 1)
print(col_data)
# 获取所有单元格的内容
for i in range(rows):
for j in range(cols):
print(sheet.cell_value(i, j), end=" ")
print()
# 获取某个单元格
value = sheet.cell_value(0, 1)
print(value)
value = sheet.cell(1, 1).value
print(value)
# 通过行
value = sheet.row(2)[0].value
print(value)
# 通过列
value = sheet.col(0)[3].value
print(value)
读写doc文件
pip install python-docx
可以操作word文档:
Document ---> 文档类
文档对象.paragraphs ---> 段落集合
文档对象.tables ---> 表格集合
文档对象.styles ---> 样式集合
文档对象.inline_shapes ---> 图像 其他形状等等...
from docx import Document
from docx.shared import RGBColor
from docx.shared import Inches
# 生成一个文档对象
# 有一个参数的 参数设置的是word文档路径 如果设置 表达的是打开文件 如果不写表示要新建一个文件
docuemnt = Document()
# 添加段落
docuemnt.add_paragraph("Hello Docx", style="Heading 9")
# 查看一下word默认带有的样式
for style in docuemnt.styles:
print(style)
# 自定义样式 第一个参数就是样式名字 第二参数样式类型 1.表示段落 2.表示字符 3.表格
cus_style = docuemnt.styles.add_style("cus_style", 1)
cus_style.font.color.rgb = RGBColor(200, 175, 221)
docuemnt.add_paragraph("自定义样式", style="cus_style")
# 添加标题
docuemnt.add_heading("1号标题", 0)
# 新起一页
docuemnt.add_page_break()
# 添加表格
table = docuemnt.add_table(2, 3)
# 获得表格的行的容器
rows = table.rows # 容器 存放的是行的对象
for i in range(len(rows)):
# row.cells ---> 获取的是每一行有几个小表格
print(rows[i].cells)
for j in range(len(rows[i].cells)):
rows[i].cells[j].text = "第%d行第%d列" % (i+1, j+1)
# 图片的大小是使用英寸来设置的
docuemnt.add_picture("男.jpg", width=Inches(1.5))
print(rows)
for i in range(rows):
for j in range(cols):
cell = table.cell(i, j)
cell.text = "第%d行第%d列" % (i+1, j+1)
# 保存的操作
docuemnt.save("test.doc")
读
from docx import Document
# 声明文档对象
doc = Document("test.doc")
# 读段落
for p in doc.paragraphs:
print(p.text)
# 读表格
tables = doc.tables
for t in tables:
print(t.rows)
for row in t.rows:
print(row)
print(row.cells)
for i in range(len(row.cells)):
print(row.cells[i].text)
# 读图形
images = doc.inline_shapes
print(images)
3.python2和python3版本的区别
如果2和3版本同时存在:
一般处理的时候 控制台指令python2进入的是2的环境 — python3进入的是3的环境
将py2的路径设置在环境变量中 并且将其路径设置在python3之前 —> python — > 进入的2.x
将3版本下的python.exe改名为python3.exe —> 再执行python3的话进入的就是3的环境下
1.效率的问题:
py2.x的效率要比py3.x版本的效率高,但是3正在追赶
2.编码的问题
python2的编码是 ascii码
python3的编码是 utf-8
python3中可以以中文为变量名 进行变量声明
3.运算符的区别:
3.1 python3中舍弃了cmp比较大小的方法
python3中 比较两个数值的大小
(x > y) - (x < y)
python2中
cmp(x, y) 与 (x > y) - (x < y)
3.2 不等于 在python3中舍弃了 <>
python3中 !=
python2中 <> 与 !=
3.3 除法运算
python3中 / ---> 普通的除法 会有小数的产生
// ---> 整除
python2中都表示的是整除
/
//
除不尽想显示小数的话 需要将一方转化为浮点数
4.print
print在python3 中是一个内置方法
print("输出的内容")
print在python2 中是一个语句
print "输出的内容"
5.input的区别
python3中input
不管输入的是什么内容接受到就是字符串类型
python2中input
输入什么格式的数据 就以什么类型接受
另外一个接受输入的方式
raw_input() ---> 与python3中input一致
6.不同类型之间数据的比较(整型和字符串类型)
python3中不支持
python2中支持
7.八进制:
0o / 0O
python2中 以0开头表示的是八进制数据
python3中 不支持以0开头
8.数据类型:
8.1 字符串
python2中字符串占8位
python3中占16b
8.2 整型
python2 中整型有两种格式 int 和 long
python3 只用一个int表示 但是它的行为类似于python2中的long
9.异常机制
python3中
try:
except 异常类型 as 变量:
python2中没有as格式 使用的是逗号来分割
try:
except 异常类型, 变量:
10. range
python3中 生成一个range对象 存放的是连续的序列
如果想转化成其他序列 需要进行强转
python2中 生成本身就是一个列表
11. 打开文件
python3中:open(文件路径)
python2中多了一种形式 file ---> file(文件路径)
python3中file类被舍弃了