Python基础_Day18

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类被舍弃了

猜你喜欢

转载自blog.csdn.net/weixin_42076261/article/details/88421631