第一阶段-第九章 Python的异常、模块与包

news2024/11/27 18:30:21

目录

  • 一、了解异常
    •   1.学习目标
    •   2.什么是异常
    •   3.bug单词的诞生
    •   4.本节的演示
    •   5.本小节的总结
  • 二、异常的捕获方法
    •   1.学习目标
    •   2.为什么要捕获异常
    •   3.如何进行异常的捕获(异常为常规的、指定的、多个时,捕获所有异常、异常else、finally)
    •   4.本节的代码演示
    •   5.本小节的总结
  • 三、异常的传递
    •   1.学习目标
    •   2.异常具有传递性
    •   3.本节的代码演示
  • 四、Python模块
    •   4.1 模块的导入
      •   1.学习目标
      •   2.什么是模块
      •   3.模块的导入方式
      •   4.本节的代码演示
      •   5.本小节的总结
    •   4.2 自定义模块
      •   1.学习目标
      •   2. 制作自定义模块
      •   3. 测试模块(引入变量__main__)
      •   4. 变量__all__
      •   5.本节的代码演示(含__name__与__main__的配合使用)
      •   6.本小节的总结
  • 五、Python包
    •   5.1 自定义包
      •   1.学习目标
      •   2. 为什么要引入Python包
      •   3.什么是Python包
      •   4.如何创建Python包
      •   5.如何导入Python包
      •   6. 变量__all__
      •   7.本节的代码演示
      •   8.本小节的总结
    •   5.2 安装第三方包
      •   1.学习目标
      •   2. 什么是第三方包
      •   3. 如何安装第三方包-pip
      •   4. pip的网络优化
      •   5. 如何安装第三方包-PyCharm
      •   6.本节的演示
        •   (1)使用pip命令安装第三方包
        •   (2)使用PyCharm命令安装第三方包
      •   7.本小节的总结
  • 六、Python:异常、模块、包:综合案例(自定义工具包)
    •   1.案例需求
    •   2.本节的演示

  说明:该文章是学习 黑马程序员在B站上分享的视频 黑马程序员python教程,8天python从入门到精通而记录的笔记,笔记来源于本人。 若有侵权,请联系本人删除。笔记难免可能出现错误或笔误,若读者发现笔记有错误,欢迎在评论里批评指正。此笔记对应的doc文件的百度网盘下载链接为 Python入门(黑马)的学习笔记,提取码:1b3k。
在这里插入图片描述
在这里插入图片描述

一、了解异常

  1.学习目标

  了解异常的概念。

  2.什么是异常

在这里插入图片描述

  3.bug单词的诞生

在这里插入图片描述

  4.本节的演示

在这里插入图片描述
  先打开软件,创建一个名为“09_Python的异常、模块与包”的文件夹,并创建一个名为“01_演示异常的出现”的py文件。
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
  然后主动写一段 ! ! 错误 ! ! 代码,演示异常的出现。

"""
主动写一段错误代码,演示异常的出现
"""

# 通过open,读取一个不存在的文件
f = open("D:/abc.txt", "r", encoding="UTF-8")

在这里插入图片描述

  5.本小节的总结

在这里插入图片描述

二、异常的捕获方法

  1.学习目标

  知道为什么要捕获异常;掌握捕获异常的语法格式。

  2.为什么要捕获异常

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

  3.如何进行异常的捕获(异常为常规的、指定的、多个时,捕获所有异常、异常else、finally)

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

在这里插入图片描述在这里插入图片描述在这里插入图片描述
  注:finally常用于关闭资源。

  4.本节的代码演示

  先打开软件,创建一个名为“02_异常的捕获”的py文件。
在这里插入图片描述在这里插入图片描述
  编写代码并运行两次(注:第二次运行时,根据代码,有的不存在的文件会被创建),对比两次的结果,并结合理解各种捕获异常的效果。代码如下,可参考注释进行理解。

"""
演示捕获异常
"""

# 基本捕获语法
try:
    # 以只读模式打开不存在的文件abc.txt
    f = open("D:/test/abc.txt", "r", encoding="UTF-8")
except:
    # 如果出现错误,则进行捕获并执行except的代码
    print("出现异常了,因为文件不存在,我将open的r模式,改为w模式去打开")
    f = open("D:/test/abc.txt", "w", encoding="UTF-8")

# 捕获指定的异常
try:
    # 1 / 0     #未正确设置捕获异常类型,将无法捕获异常
    print(name)
except NameError as e:  # 给这个错误取 别名 为 e
    print("出现了变量未定义的异常")
    print(e)

# 捕获多个异常
try:
    # 1 / 0
    print(name)
except (NameError, ZeroDivisionError) as e:
    print("出现了变量未定义或者除以0的异常错误")

# 捕获所有异常
try:
    # 1 / 0
    # print(name)
    f = open("D:/test/ab223c.txt", "r", encoding="UTF-8")  # 以只读模式打开不存在的文件ab223c.txt
    # print("Hello")
except Exception as e:  # 或 except:
    print("出现异常了")
else:
    print("好高兴,没有异常。")

# finally 有没有异常都要执行
try:
    f = open("D:/test/123.txt", "r", encoding="UTF-8")  # 以只读模式打开不存在的文件123.txt
except Exception as e:
    print("出现异常了")
    f = open("D:/test/123.txt", "w", encoding="UTF-8")
else:
    print("好高兴,没有异常。")
finally:
    print("我是finally,有没有异常我都要执行")
    f.close()

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

  5.本小节的总结

在这里插入图片描述

三、异常的传递

  1.学习目标

  知道异常具有传递性;在了解异常具有传递性后,为了更方便快速地捕获异常,可以从高层次(如函数调用的最高层)中去捕获这个高层次调用含有异常的低层次的代码结构。

  2.异常具有传递性

在这里插入图片描述

  3.本节的代码演示

  先打开软件,创建一个名为“03_异常的传递”的py文件。
在这里插入图片描述在这里插入图片描述
  如下所示,先编写多个函数互相进行调用,暂时不加异常的捕获,可以看到异常的传递性。代码如下,可参考注释进行理解。

"""
演示异常的传递性
"""


# 定义一个出现异常的函数
def func1():
    print("fUnc1开始执行")
    num = 1 / 0
    # 肯定有异常,除以0的异常
    print("func1结束执行")


# 定义一个无异常的函数,调用上面的函数
def func2():
    print("func2开始执行")
    func1()
    print("fUnc2结束执行")


# 定义一个方法,调用上面的方法
def main():
    func2()


main()

在这里插入图片描述
  加上异常的捕获后的代码如下,运行后也能从运行结果上体现异常的传递性。

"""
演示异常的传递性
"""


# 定义一个出现异常的函数
def func1():
    print("fUnc1开始执行")
    num = 1 / 0
    # 肯定有异常,除以0的异常
    print("func1结束执行")


# 定义一个无异常的函数,调用上面的函数
def func2():
    print("func2开始执行")
    func1()
    print("fUnc2结束执行")


# 定义一个方法,调用上面的方法
def main():
    try:
        func2()
    except Exception as e:
        print(f"出现异常了,异常的信息是:{e}")


main()

在这里插入图片描述

四、Python模块

  4.1 模块的导入

  1.学习目标

  了解什么是模块;掌握导入Python内置的模块。

  2.什么是模块

在这里插入图片描述

  3.模块的导入方式

在这里插入图片描述
  注:本图所示的语法中带中括号[]为可选项,即from、as可以不写,而import必须写。
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  4.本节的代码演示

  创建一个名为“04_1_模块的导入”的py文件。
在这里插入图片描述在这里插入图片描述
  当程序写到一部分时,为了查看time模块,可按住Ctr不放,点击time,即可跳转到time中。然后,在time.py文件中可以看到函数sleep。
在这里插入图片描述在这里插入图片描述
  然后回到代码中,编写代码并运行。代码如下,可参考注释进行理解。可以体会“import 模块名”的用法。

"""
演示Python的模块导入
"""

# 使用import导入time模块,并使用time模块里的sleep功能(函数)
import time  # 导入Python内置的time模块(即time.py这个代码文件)

print("你好")
time.sleep(5)  # 通过.就可以使用模块内部的全部功能(类、函数、变量)
print("我好")

在这里插入图片描述
  如下重新编写代码并运行(使用快捷键Ctr+/可快速注释),体会“from 模块名 import 功能名”的用法。

"""
演示Python的模块导入
"""

# # 使用import导入time模块,并使用time模块里的sleep功能(函数)
# import time  # 导入Python内置的time模块(即time.py这个代码文件)
#
# print("你好")
# time.sleep(5)  # 通过.就可以使用模块内部的全部功能(类、函数、变量)
# print("我好")

# 使用from导入time的sleep功能(函数)
from time import sleep

print("你好")
sleep(5)
print("我好")

在这里插入图片描述
  如下重新编写代码并运行(使用快捷键Ctr+/可快速注释),体会“from 模块名 import *”的用法。

"""
演示Python的模块导入
"""

# # 使用import导入time模块,并使用time模块里的sleep功能(函数)
# import time  # 导入Python内置的time模块(即time.py这个代码文件)
#
# print("你好")
# time.sleep(5)  # 通过.就可以使用模块内部的全部功能(类、函数、变量)
# print("我好")

# # 使用from导入time的sleep功能(函数)
# from time import sleep
#
# print("你好")
# sleep(5)
# print("我好")

# 使用*导入time模块的全部功能
from time import *  # *表示全部的意思

print("你好")
sleep(5)
print("我好")

在这里插入图片描述
  如下重新编写代码并运行(使用快捷键Ctr+/可快速注释),体会as给模块取别名的用法。

"""
演示Python的模块导入
"""

# # 使用import导入time模块,并使用time模块里的sleep功能(函数)
# import time  # 导入Python内置的time模块(即time.py这个代码文件)
#
# print("你好")
# time.sleep(5)  # 通过.就可以使用模块内部的全部功能(类、函数、变量)
# print("我好")

# # 使用from导入time的sleep功能(函数)
# from time import sleep
#
# print("你好")
# sleep(5)
# print("我好")

# # 使用*导入time模块的全部功能
# from time import *  # *表示全部的意思
#
# print("你好")
# sleep(5)
# print("我好")

# 使用as给特定功能加上别名
import time as t

print("你好")
t.sleep(5)
print("我好")

在这里插入图片描述
  如下重新编写代码并运行(使用快捷键Ctr+/可快速注释),体会as给功能取别名的用法。

"""
演示Python的模块导入
"""

# # 使用import导入time模块,并使用time模块里的sleep功能(函数)
# import time  # 导入Python内置的time模块(即time.py这个代码文件)
#
# print("你好")
# time.sleep(5)  # 通过.就可以使用模块内部的全部功能(类、函数、变量)
# print("我好")

# # 使用from导入time的sleep功能(函数)
# from time import sleep
#
# print("你好")
# sleep(5)
# print("我好")

# # 使用*导入time模块的全部功能
# from time import *  # *表示全部的意思
#
# print("你好")
# sleep(5)
# print("我好")

# # 使用as给特定功能加上别名
# import time as t
#
# print("你好")
# t.sleep(5)
# print("我好")

from time import sleep as sl

print("你好")
sl(5)
print("我好")

在这里插入图片描述

  5.本小节的总结

在这里插入图片描述

  4.2 自定义模块

  1.学习目标

  了解如何自定义模块并使用;了解__main__变量的作用。

  2. 制作自定义模块

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

  3. 测试模块(引入变量__main__)

在这里插入图片描述

  4. 变量__all__

在这里插入图片描述

  5.本节的代码演示(含__name__与__main__的配合使用)

  创建一个名为“04_2_自定义模块”的py文件,一个名为“my_module1”的py文件作为自定义的模块1,一个名为“my_module2”的py文件作为自定义的模块2。
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
  编写代码模块1(即my_module1.py文件)的代码。

def test(a, b):
    print(a + b)

在这里插入图片描述
  编写代码模块2(即my_module2.py文件)的代码。

def test(a, b):
    print(a - b)

在这里插入图片描述
  在本次使用的文件(即04_2_自定义模块.py文件)中编写代码并运行,体会模块调用以及当调用不同模块的具有相同功能名的函数,后面模块的函数会覆盖前面模块的函数的现象。

"""
演示自定义模块
"""

# 导入自定义模块使用
# import my_module1
#
# my_module1.test(1, 2)

from my_module1 import test

test(1, 2)

# 导入不同模块的同名功能
from my_module1 import test
from my_module2 import test

test(1, 2)

在这里插入图片描述
  在编写完模块代码后,往往需要对它进行测试,比如需要对my_module1.py文件进行测试,在里面加了一行“test(1,2)”的代码。(框里为my_module1.py文件修改后的代码)

def test(a, b):
    print(a + b)


test(1, 2)

在这里插入图片描述在这里插入图片描述
  回到本次使用的文件(即04_2_自定义模块.py文件),使用快捷键Ctr+/将其他内容注释,然后写上仅仅导入my_module1.py模块的代码,代码如下,然后再运行,发现也会运行my_module1.py中的测试代码test(1, 2)。

"""
演示自定义模块
"""

# 导入自定义模块使用
# import my_module1
#
# my_module1.test(1, 2)

# from my_module1 import test
#
# test(1, 2)
#
# # 导入不同模块的同名功能
# from my_module1 import test
# from my_module2 import test
#
# test(1, 2)

# __main__变量
from my_module1 import test

在这里插入图片描述
  回到my_module1.py模块的代码中,如果我们不舍得删除测试代码test(1, 2),就可以使用变量__main__,然后就能解决问题,如下几张图所示。这是因为__name__为内置变量,当运行含有“if name == ‘main’:”的判断语句的py文件时,它会将它(即__name__)设为’main’,而在别的py文件中调用这个py文件的某些功能时,它(即__name__)就不再是’main’了。因此,这样就实现了测试代码不用删除,在模块中能运行测试代码,而在导入模块时也不会执行模块中的测试代码了。(框里为my_module1.py文件修改后的代码)

def test(a, b):
    print(a + b)


if __name__ == '__main__':
    test(1, 2)

在这里插入图片描述在这里插入图片描述
  然后,我们在两个文件my_module1.py、04_2_自定义模块.py中运行一下,可以发现上述效果已经实现。
在这里插入图片描述在这里插入图片描述
  然后修改模块2(即文件my_module2.py)的代码如下。

def test(a, b):
    print(a - b)


def test_a(a, b):
    print(a + b)


def test_b(a, b):
    print(a - b)

在这里插入图片描述
  再修改名为“04_2_自定义模块”的py文件的代码,并运行,可以发现“from my_module2 import *”导入后,所有功能均可运用。

"""
演示自定义模块
"""

# 导入自定义模块使用
# import my_module1
#
# my_module1.test(1, 2)

# from my_module1 import test
#
# test(1, 2)
#
# # 导入不同模块的同名功能
# from my_module1 import test
# from my_module2 import test
#
# test(1, 2)

# # __main__变量
# from my_module1 import test

# __all__变量
from my_module2 import *

print(f"test(1, 2)的结果:", end="")
test(1, 2)
print(f"test_a(1, 2)的结果:", end="")
test_a(1, 2)
print(f"test_b(2, 1)的结果:", end="")
test_b(2, 1)

在这里插入图片描述
  然后回到模块2(即文件my_module2.py)的文件中,添加代码“all = [‘test_a’]”。再回到名为“04_2_自定义模块”的py文件中,发现只有test_a能使用,从中能体现变量__all__的作用。
在这里插入图片描述在这里插入图片描述在这里插入图片描述

  6.本小节的总结

在这里插入图片描述

五、Python包

  5.1 自定义包

  1.学习目标

  了解什么是Python包;掌握如何自定义包。

  2. 为什么要引入Python包

在这里插入图片描述

  3.什么是Python包

在这里插入图片描述

  4.如何创建Python包

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

  5.如何导入Python包

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

  6. 变量__all__

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

  7.本节的代码演示

  创建一个名为“05_1_Python包”的py文件。
在这里插入图片描述在这里插入图片描述
  创建一个名为“my_package”的Python包(相比于普通的文件夹,Python包中含有文件__init__.py)。
在这里插入图片描述在这里插入图片描述
  在名为“my_package”的Python包中新建两个模块文件my_module1.py、my_module2.py,然后分别在这两个模块文件中编写相应的代码。包里的模块文件my_module1.py的代码如下框。

"""
演示自定义模块1
"""


def info_print1():
    print("我是模块1的功能函数代码")

在这里插入图片描述在这里插入图片描述在这里插入图片描述
  包里的模块文件my_module2.py操作一样,它的代码如下框。

"""
演示自定义模块2
"""


def info_print2():
    print("我是模块2的功能函数代码")

在这里插入图片描述在这里插入图片描述在这里插入图片描述
  回到文件“05_1_Python包.py”中,输入代码并运行,体会从Python包中如何导入对应的模块一种方式。

"""
演示Python的包
"""

# 创建一个包
# 导入自定义的包中的模块,并使用
import my_package.my_module1
import my_package.my_module2

# 调用
my_package.my_module1.info_print1()  # 调用my_package包里的模块my_module1里的函数info_print1
my_package.my_module2.info_print2()  # 调用my_package包里的模块my_module2里的函数info_print2

在这里插入图片描述
  如下重新编写代码并运行(使用快捷键Ctr+/可快速注释),体会从Python包中如何导入对应的模块另一种方式。

"""
演示Python的包
"""

# 方式1
# # 创建一个包
# # 导入自定义的包中的模块,并使用
# import my_package.my_module1
# import my_package.my_module2
#
# # 调用
# my_package.my_module1.info_print1()  # 调用my_package包里的模块my_module1里的函数info_print1
# my_package.my_module2.info_print2()  # 调用my_package包里的模块my_module2里的函数info_print2

# 方式2
from my_package import my_module1
from my_package import my_module2

my_module1.info_print1()
my_module2.info_print2()

在这里插入图片描述
  如下重新编写代码并运行(使用快捷键Ctr+/可快速注释),体会从Python包中如何导入某模块的某函数。

"""
演示Python的包
"""

# 方式1
# # 创建一个包
# # 导入自定义的包中的模块,并使用
# import my_package.my_module1
# import my_package.my_module2
#
# # 调用
# my_package.my_module1.info_print1()  # 调用my_package包里的模块my_module1里的函数info_print1
# my_package.my_module2.info_print2()  # 调用my_package包里的模块my_module2里的函数info_print2

# # 方式2
# from my_package import my_module1
# from my_package import my_module2
#
# my_module1.info_print1()
# my_module2.info_print2()

# 导入某包的某模块的某函数
from my_package.my_module1 import info_print1
from my_package.my_module2 import info_print2

info_print1()
info_print2()

在这里插入图片描述
  为了看到变量’ all’对’from xxx import *'的影响,如下图,先修改文件__init__.py里面的内容,如下图所示。

__all__ = ['my_module1']

在这里插入图片描述
  回到文件“05_1_Python包.py”中,输入代码并运行。

"""
演示Python的包
"""

# 方式1
# # 创建一个包
# # 导入自定义的包中的模块,并使用
# import my_package.my_module1
# import my_package.my_module2
#
# # 调用
# my_package.my_module1.info_print1()  # 调用my_package包里的模块my_module1里的函数info_print1
# my_package.my_module2.info_print2()  # 调用my_package包里的模块my_module2里的函数info_print2

# # 方式2:导入包的指定模块     from 包名 import 模块名
# from my_package import my_module1
# from my_package import my_module2
#
# my_module1.info_print1()
# my_module2.info_print2()

# # 方式3:导入某包的某模块的某函数      from 包名.模块名 import 功能名
# from my_package.my_module1 import info_print1
# from my_package.my_module2 import info_print2
#
# info_print1()
# info_print2()

# 通过__all__变量,控制 import *
from my_package import *

my_module1.info_print1()
# my_module2.info_print2()

在这里插入图片描述
  然后取消图中所示那一行的代码,运行报错,即可说明变量’ all’对’from xxx import *'的影响,只能使用变量’ all’所指的模块。
在这里插入图片描述

  8.本小节的总结

在这里插入图片描述

  5.2 安装第三方包

  1.学习目标

  了解什么是第三方包;掌握使用pip安装第三方包。

  2. 什么是第三方包

在这里插入图片描述

  3. 如何安装第三方包-pip

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

  4. pip的网络优化

在这里插入图片描述
  国内网站不止这一个,随便必应一下就能找到很多如下框(来源于知乎上的Krabs),能用,速度够快就行。

清华:https://pypi.tuna.tsinghua.edu.cn/simple
阿里云:http://mirrors.aliyun.com/pypi/simple/
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
华中理工大学:http://pypi.hustunique.com/
山东理工大学:http://pypi.sdutlinux.org/
豆瓣:http://pypi.douban.com/simple/

  5. 如何安装第三方包-PyCharm

在这里插入图片描述

  6.本节的演示

  (1)使用pip命令安装第三方包

  本小点将演示如何使用pip命令安装名为“numpy”的Python包。如下几张图所示(方法不唯一),打开“命令提示符”。
在这里插入图片描述在这里插入图片描述在这里插入图片描述
  然后在联网的条件下,按照“pip install 第三方包的名字”的格式,输入“pip install numpy”后,并按Enter键。
在这里插入图片描述
  我们会发现下载速度非常慢,这是由于pip程序默认连接的是国外的网站,所以在国内连接起来速度就非常慢。
在这里插入图片描述
  为了让下载速度更快,可以通过命令让其连接国内的网站进行包的安装,如下图所示,输入“pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy”后按Enter键,然后会显示“Successfully”安装成功的提示。
在这里插入图片描述
  然后如下图所示,输入“python”进入python中,然后输入“import numpy”没报错就说明下载成功。
在这里插入图片描述

  (2)使用PyCharm命令安装第三方包

  这里以安装pandas包为例进行演示。首先,如图所示,在PyCharm右下角点击“解释器的设置”。
在这里插入图片描述
  接着,如下图所示操作就OK了。
在这里插入图片描述
  一些b站网友和我一样,下载包时报错(忘截图了),本人按一些网上给出的方法试了好几个都不行。回到PyCharm后,再试了一阵,发现将下载链接由清华源改成豆瓣源就没问题了(-i http://pypi.douban.com/simple/)。
在这里插入图片描述

  7.本小节的总结

在这里插入图片描述

六、Python:异常、模块、包:综合案例(自定义工具包)

  1.案例需求

在这里插入图片描述

  2.本节的演示

  打开软件,创建一个名为“06_综合案例练习”的py文件。
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
  创建“my_utils”包,在包内创建2个模块:str_util.py和file_util.py。
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  如下编写模块str_util.py的代码,并运行测试一下。

"""
字符串相关的工具模块
"""


def str_reverse(s):
    """
    功能: 将字符串完成反转操作
    :param s: 将被反转的字符串
    :return: 反转后的字符串
    """
    return s[::-1]  # 利用切片反着取,形成一个新的字符串,并返回


def substr(s, x, y):
    """
    功能: 按照给定的下标完成给定字符串的切片
    :param s: 即将被切片的字符串
    :param x: 切片的开始下标
    :param y: 切片的结束下标
    :return: 切片完成后的字符串
    """
    return s[x:y]


if __name__ == '__main__':
    print(str_reverse("黑马程序员"))
    print(substr("黑马程序员", 1, 3))

在这里插入图片描述
  如下编写模块file_util.py的部分代码,先使用先前的文件“bill.txt”测试函数print_file_info的功能。

"""
文件处理相关的工具模块
"""


def print_file_info(file_name):
    """
    功能: 将给定路径的文件内容输出到控制台中
    :param file_name: 即将读取的文件路径
    :return: None
    """
    f = None  # 设置初始值
    try:
        f = open(file_name, "r", encoding="UTF-8")
        content = f.read()
        print("文件的全部内容如下:")
        print(content)
    except Exception as e:
        print(f"程序出现异常了,原因是:{e}")
    finally:
        if f:  # 如果变量是None,表示False,就不执行关闭文件的操作;如果有任何内容,就是True,就执行关闭文件的操作
            f.close()


if __name__ == '__main__':
    print_file_info("D:/test/bill.txt")

在这里插入图片描述在这里插入图片描述
  先查看电脑里的路径D:\test,确保没有文件test_append.txt。然后继续完编写模块file_util.py的代码,测试函数append_to_file的功能。

"""
文件处理相关的工具模块
"""


def print_file_info(file_name):
    """
    功能: 将给定路径的文件内容输出到控制台中
    :param file_name: 即将读取的文件路径
    :return: None
    """
    f = None  # 设置初始值
    try:
        f = open(file_name, "r", encoding="UTF-8")
        content = f.read()
        print("文件的全部内容如下:")
        print(content)
    except Exception as e:
        print(f"程序出现异常了,原因是:{e}")
    finally:
        if f:  # 如果变量是None,表示False,就不执行关闭文件的操作;如果有任何内容,就是True,就执行关闭文件的操作
            f.close()


def append_to_file(file_name, data):
    """
    功能: 将指定的数据追加到指定的文件中
    :param file_name: 指定的文件的路径
    :param data: 指定的数据
    :return: None
    """
    f = open(file_name, "a", encoding="UTF-8")
    f.write(data)
    f.write("\n")  # 有一个换行符,保证下次追加时,首字不是紧贴着上次的内容,而是有一个换行隔开
    f.close()


if __name__ == '__main__':
    # print_file_info("D:/test/bill.txt")
    append_to_file("D:/test/test_append.txt", "黑马程序员")

在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
  回到“06_综合案例练习.py”文件,编写代码后运行。

"""
演示异常、模块、包的综合案例练习
"""

# 创建my_utils包,  在包内创建:str_util.py和file_util.py  2个模块,并提供相应的函数
import my_utils.str_util
from my_utils import file_util

print(my_utils.str_util.str_reverse("黑马程序员"))
print(my_utils.str_util.substr("itheima", 0, 4))

print("未追加时", end="")
file_util.print_file_info("D:/test/test_append.txt")
file_util.append_to_file("D:/test/test_append.txt", "itheima")
print("追加后", end="")
file_util.print_file_info("D:/test/test_append.txt")

在这里插入图片描述
  好了,本章的笔记到此结束,谢谢大家阅读。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/759707.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

跟我一起从零开始学python(八)全栈开发

前言 回顾之前讲了python语法编程 ,必修入门基础和网络编程,多线程/多进程/协程等方面的内容,后续讲到了数据库编程篇MySQL,Redis,MongoDB篇,和机器学习前面没看的也不用往前翻,系列文已经整理…

【ArcGIS Pro微课1000例】0028:绘制酒店分布热力图(POI数据)

本文讲解在ArcGIS Pro中文版中,基于长沙市酒店宾馆分布矢量点数据(POI数据)绘制酒店分布热力图。 文章目录 一、加载酒店分布数据二、绘制热度图参考阅读: 【GeoDa实用技巧100例】004:绘制长沙市宾馆热度图 【ArcGIS微课1000例】0070:制作宾馆酒店分布热度热力图 一、加载…

【java爬虫】将优惠券数据存入数据库排序查询

本文是在之前两篇文章的基础上进行写作的 (1条消息) 【java爬虫】使用selenium爬取优惠券_haohulala的博客-CSDN博客 (1条消息) 【java爬虫】使用selenium获取某宝联盟淘口令_haohulala的博客-CSDN博客 前两篇文章介绍了如何获取优惠券的基础信息,本文将获取到的…

mybatis-plus中的逻辑删除

官网:逻辑删除 | MyBatis-Plus 1.数据库字段 得有一个字段用来表示是否被删除。 记得加上注解TableLogic 也可以加上值,表示被删除具体得值,和没有被删除具体的值。 TableLogic(value "1",delval "0") 源码&#…

go语言中的string类型简介

在 Go 中,String 是一种不可变的类型,不能被修改。 在 Go 语言中,字符串由 Unicode 字符组成,每个字符都可以用一个或多个字节来表示。我们使用双引号或反引号来定义字符串,使用反引号定义的字符串不会对其内容进行任何…

FPGA Verilog移位寄存器应用:边沿检测、信号同步、毛刺滤波

文章目录 1. 端口定义2. 边沿检测3. 信号同步4. 信号滤波5. 源码6. 总结 输入信号的边沿检测、打拍同步、毛刺滤波处理,是FPGA开发的基础知识,本文介绍基于移位寄存器的方式,实现以上全部功能:上升沿、下降沿、双边沿检测、输入信…

21.基于注解的自动装配

基于注解的自动装配 通过Autowired注解即可完成自动装配 Autowired注解标识的位置 成员变量上:直接标记Autowired注解即可完成自动装配,不需要提供setXxx()方法成员变量set方法上:直接标记Autowired注解即可完成自动装配成员变量赋值的有参…

C++函数对象与函数指针在sort上的性能测试

最近在比较函数对象和函数指针的性能,看了一些文章,国内的如: https://zhuanlan.zhihu.com/p/579128724 上面这篇文章是在GoogleTest当中进行测试的,其测试结果仅展示了一次,因此我认为不具备说服力,因为我…

风雨中茁壮成长的程序树-深入浅出2023-迟来的总结

起点所在; 反观2021年的时候,入行半年多的当时还是艰难万分啊。真的犹如创业艰难百战多,无数的风雨和重大压力的遭遇,甚至于当时第一家company的时候产生过放弃的念头。 Yes,当时时有产生放弃的念头的。 because当时入行时候的收…

【人工智能】从零开始的口罩识别系统

文章目录 前言第零章 环境准备Python环境安装安装labelimgAI StudioYOLO2COCOPaddleYOLOnumpy 猫狗分类数据集实战数据上传新建项目 前言 本文是从零开始搭建口罩识别系统的学习过程总结,涉及到的软件环境、硬件环境、代码、操作都会一一给出。 第零章 环境准备 …

Python实现PSO粒子群优化算法优化XGBoost分类模型(XGBClassifier算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 PSO是粒子群优化算法(Particle Swarm Optimization)的英文缩写,是一…

iconfont渐变色实现方案总结

iconfont是前端技术中重要的一环——它能够方便地沉淀大量设计资产,并通过组件化的方式高效地在各种场景复用。而单纯应用iconfont,只能支持到纯色渲染图标,越来越难以满足高品质视觉效果的诉求。本文结合实际工作业务场景,调研了…

大数据面试题:Kafka的消费者和消费者组有什么区别?为什么需要消费者组?

面试题来源: 《大数据面试题 V4.0》 大数据面试题V3.0,523道题,679页,46w字 可回答:1)说下Kafka的消费者和消费者组,以及它们的作用是什么? 参考答案: 1、什么是消费…

C++ 测试框架 GoogleTest 初学者入门篇

开发者虽然主要负责工程里的开发任务,但是每个开发完毕的功能都是需要开发者自测通过的,所以经常会听到开发者提起单元测试的话题。那么今天我就带大伙一起来看看大名鼎鼎的谷歌 C 测试框架 GoogleTest. 简单介绍 来看看谷歌官方是怎么介绍这个框架的&am…

数据结构(王卓版)——线性表

数据的存储结构之线性表 1、线性表的定义和特点 线性表的顺序存储结构 总结:

免费音频转文字的软件有哪些?分享这几个给大家!

在今天的数字化时代,音频转文字变得越来越常见和重要。无论是为了记录会议内容、制作字幕,还是为了更方便地查找和检索音频信息,免费的音频转文字软件可以帮助你实现这一目标。以下是几个方法,可以帮助你将音频转换为文字。 方法…

23年进阶高级测试,性能测试超细详解(附面试题+答案)一篇打通

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 用户视角&#xf…

从2050回顾2020,职业规划与技术路径(节选)补充

很多朋友问了其中一段: 文明的提升,源于机械/能源/信息/智能四大模式的转变。机械将自然力或人力更高效利用,如风车,能源以蒸汽机为代表开启工业革命,信息启动了互联网时代,智能将实现虚拟社区的主导模式。…

CS 144 Lab One

CS 144 Lab One 实验结构环境配置如何调试StreamReassembler 实现 对应课程视频: 【计算机网络】 斯坦福大学CS144课程 Lab 1 对应的PDF: Lab Checkpoint 1: stitching substrings into a byte stream 实验结构 这幅图完整的说明了CS144 这门实验的结构: 其中&am…

【C++】多线程编程三(std::mutexstd::mutex、std::lock_guard、std::unique_lock详解)

目录 一、线程间共享数据 1.数据共享和条件竞争 2.避免恶性条件竞争 二、用互斥量来保护共享数据 1. 互斥量机制 2.mutex头文件介绍 三、C中使用互斥量mutex 1. 互斥量mutex使用 2.mutex类成员函数 ① 构造函数 ② lock() ③ unlock() ④ try_lock() 四、使用std::…