文章目录

  • 文件操作
    • 文件编码
      • 什么是编码
      • 为什么要使用编码
    • 文件的读取
      • open
      • model常用的三种基础访问模式
      • 读操作相关方法
    • 文件的写入
      • 注意
      • 代码示例
  • 异常
    • 定义
    • 异常捕获
      • 捕获指定异常
      • 捕获多个异常
      • 捕获所有异常
      • 异常else
      • 异常finally
    • 异常的传递
  • python 模块
    • 定义
    • 模块的导入
      • import模块名
      • from 模块名 import 功能名
      • 使用*导入time的sleep功能
      • 使用as给特定功能加上别名
    • 自定义模块
      • 创建自定义模块举例
      • `__name__` 变量
      • `__all__` 变量
      • 注意
  • Python包
    • 自定义包
      • 定义
      • 创建包
      • 导入包
        • 使用import导入
        • 使用from import导入
        • 导入模块中
    • 安装第三方包
      • 常见第三方包
      • 安装第三方包
  • 综合练习
    • 需求
    • 实现

文件操作

文件编码

什么是编码

  • 编码就是一种规则集合,记录了内容和二进制间进行互相转换的规则

  • 最常用的是UTF-8编码

为什么要使用编码

  • 计算机内部保存的都是0和1,所以需要将内容全部转换为0和1才能识别

  • 读取时需要将计算机中保存的0和1转为内容

文件的读取

open

  • 语法
open(name, mode, encoding)name要打开的目标文件名的字符串mode打开文件的模式:只读、写入、追加encoding编码格式,推荐使用UTF8

model常用的三种基础访问模式

读操作相关方法

  • read方法
文件对象.read(num)num表示要从文件中读取的数据长度,单位是字节,如果没有传,读取文件中所有的数据
  • readlines():可以按照行的方式把整个文件的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素

  • readline()读取文件的一行

  • for循环读取文件行

  • close()关闭文件对象

  • with open语法:用于打开文件并在使用完毕后自动关闭文件

  • 代码示例
# *_*coding:utf-8 *_*# 打开文件f = open("./read_file.py", 'r', encoding="UTF-8")# 读取文件print(f'读取50个字节的结果{f.read(50)}')# 在程序中多次调用read,下一次会从上一次读的偏移结尾继续读print(f'读取全部字节的结果{f.read()}')# readlines读取文件的全部行,封装到列表中print(f'读取文件的全部行{f.readlines()}')# readline一次读取文件一行line1 = f.readline()line2 = f.readline()line3 = f.readline()print(f'第一行数据是:{line1}')print(f'第二行数据是:{line2}')print(f'第三行数据是:{line3}')# 关闭文件f.close()# for循环读取文件行for line in open("./read_file.py", "r"):print(line)# with open语法with open("./read_file.py", "r", encoding="UTF-8") as f:print(f'{f.readlines()}')

文件的写入

注意

  • 直接调用write方法,内容并未真正写入文件,而是会积攒在程序的内存中,称之为缓冲区

  • 当调用flush的时候,内容会真正写入文件

  • 目的:避免频繁磁盘操作,导致效率下降

  • close方法内置了flush功能

  • w模式

    • 文件不存在则创建

    • 文件存在则清空

  • a模式

    • 文件不存在则创建

    • 文件存在则追加尾部写

代码示例

# *_*coding:utf-8 *_*# open打开文件,使用覆盖写操作f = open("test.txt", "w", encoding="UTF-8")# write写入f.write("123456789")# flush刷新f.flush()# 关闭文件f.close()# open打开文件,使用追加写操作f = open("test1.txt", "a", encoding="UTF-8")# write写入f.write("123456789")# flush刷新f.flush()# 关闭文件f.close()

异常

定义

  • 当检测到一个错误时,Python解释器就无法继续运行了,反而出现一些错误的提示,这就是所谓的异常

异常捕获

  • 作用:提前假设某处会出现异常,做好提前准备,当真的出现异常时,可以有后续手段

  • 基本语法

try:可能发生异常的代码块except:出现异常后的代码块
  • 代码示例:打开一个不存在的文件
try:f = open("xxx.txt", 'r')except:print("open file err")

捕获指定异常

  • 注意:

    • 如果尝试执行的代码的异常类型和捕获的异常类型不一致,则无法捕获异常

    • 一般try下面只放一行尝试执行的代码

  • 语法:

try:print(name)except NameError as e:print('name变量名称未定义错误')
  • 代码示例
try:print(name)# as e是给NameError类型起别名except NameError as e:print('name变量未定义错误')

捕获多个异常

  • 代码示例
# 捕获多个异常try:print(name)# as e是给NameError类型起别名,e中记录了异常的具体信息except (NameError, ZeroDivisionError) as e:print('name变量未定义错误或者除0异常')

捕获所有异常

  • 代码示例
# 捕获所有异常try:print(name)# 方式一:通过捕获Exception异常,Exception是顶级异常except Exception as e:print('name变量未定义错误')try:print(name)# 方式二:不指定具体的异常直接捕获except:print('name变量未定义错误')

异常else

  • else表示的是如果没有异常要执行的代码

  • 代码示例

# 异常elsetry:print(name)# as e是给NameError类型起别名,e中记录了异常的具体信息except (NameError, ZeroDivisionError) as e:print('name变量未定义错误或者除0异常')else:print("未发生异常")

异常finally

  • finally表示的是无论是否异常都要执行的代码

  • 代码示例

# 异常finallytry:print(name)# as e是给NameError类型起别名,e中记录了异常的具体信息except (NameError, ZeroDivisionError) as e:print('name变量未定义错误或者除0异常')else:print("未发生异常")finally:print("总会执行我")

异常的传递

  • 异常是具有传递性的

  • 内层的异常如果没有被捕获会沿着调用链一直向上抛直到main函数

  • 代码示例

# *_*coding:utf-8 *_*def func1():print("func1 start")1 / 0print("func1 end")def func2():print("func2 start")func1()print("func2 end")def main():try:func2()except Exception as e:print(e)main()

python 模块

定义

  • Python模块是一个Python文件,以.py结尾,模块能定义类、函数和变量,模块里面也能包含可执行的代码

  • 作用:模块就是一个工具包

模块的导入

  • 模块在使用之前需要先导入

  • 语法

[from 模块名] import [模块||变量|函数|*] [as 别名]
  • 常用组合方式
import 模块名from 模块名 import 类、变量、方法等from 模块名 import *import 模块名 as 别名from 模块名 import 功能名 as 别名

import模块名

  • 基本语法
import 模块名import 模块名1,模块名2
  • 代码示例
# 导入时间模块import timeprint("satrt")# 程序睡眠3stime.sleep(3)print("end")

from 模块名 import 功能名

  • 代码示例
from time import sleepprint("satrt")# 程序睡眠3ssleep(3)print("end")

使用*导入time的sleep功能

  • 代码示例
from time import *print("satrt")# 程序睡眠3ssleep(3)print("end")

使用as给特定功能加上别名

  • 代码示例
import time as tprint("satrt")# 程序睡眠3st.sleep(3)print("end")

自定义模块

创建自定义模块举例

  • 创建my_module.py
def test(a, b):print(a + b)
  • 创建test_my_module.py
import my_modulemy_module.test(1, 2)

__name__ 变量

  • 在当前模块中执行时,才会生效,外部导入时不会执行

  • 代码示例

def test(a, b):print(a + b)if __name__ == '__main__':test(1, 1)

__all__ 变量

  • 如果一个模块中有__all__变量,当使用from xxx import *,时只能导入这个列表中的元素,没有all时默认导入的是所有,有all时只导入all中的

  • 创建my_module.py

__all__ = ['test1']def test(a, b):print(a + b)def test1(a, b):print(a + b)
  • 创建test_my_module.py
from my_module import *test1(1, 1)# NameError: name 'test' is not defined# test(1, 1)

注意

  • 不同模块,同名的功能,如果都被导入,那么后导入的会覆盖先导入的

Python包

自定义包

定义

  • 从物理上看,包就是一个文件夹,在该文件夹下包含了一个__init__.py文件,该文件夹可用于包含多个模块文件

  • 从逻辑上看,包的本质依然是模块

创建包

  • 右键New->Python Package->输入包名

  • 编写对应模块文件

    • 新建my_module1.py
    # *_*coding:utf-8 *_*def info_print1():print('my_module1')
    • 新建my_module2.py
    # *_*coding:utf-8 *_*def info_print2():print('my_module2')

导入包

使用import导入
  • my_package同级创建一个test_my_package.py文件
# *_*coding:utf-8 *_*import my_package.my_module1import my_package.my_module2# 包中的my_module1模块的info_print方法my_package.my_module1.info_print1()# 包中的my_module2模块的info_print方法my_package.my_module2.info_print2()
使用from import导入
from my_package import my_module1from my_package import my_module2my_module1.info_print1()my_module2.info_print2()
导入模块中
from my_package.my_module1 import info_print1from my_package.my_module2 import info_print2info_print1()info_print2()

安装第三方包

常见第三方包

安装第三方包

  • 命令:pip install 包名

  • 示例

综合练习

需求

实现

  • 新建my_utils包

  • 新建str_utils.py文件

# *_*coding:utf-8 *_*def str_reverse(s):reversed(s)return sdef substr(s, x, y):return s[x:y]
  • 新建file_utils.py文件
# *_*coding:utf-8 *_*def print_file_info(file_name):try:f = open(file_name, "r", encoding='UTF-8')except Exception as e:print(e)finally:f.close()def append_to_file(file_name, data):f1 = open(file_name, 'a', encoding='UTF-8')f1.write(data)f1.close()
  • 测试:在my_utils同级新建test_my_utils.py
# *_*coding:utf-8 *_*from my_utils import str_utilfrom my_utils import file_utilprint(f'反转后的结果是:{str_util.str_reverse("abc")}')print(f'取子串后后的结果是:{str_util.substr("123456789", 2, 7)}')file_util.print_file_info("aa.txt")file_util.append_to_file("aa.txt", "这是一条追加内容")