【黑马程序员】Python文件、异常、模块、包

文章目录

  • 文件操作
    • 文件编码
      • 什么是编码
      • 为什么要使用编码
    • 文件的读取
      • 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表示的是如果没有异常要执行的代码

  • 代码示例

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

异常finally

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

  • 代码示例

# 异常finally
try:
    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 / 0
    print("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 time

print("satrt")
# 程序睡眠3s
time.sleep(3)
print("end")

from 模块名 import 功能名

  • 代码示例
from time import sleep

print("satrt")
# 程序睡眠3s
sleep(3)
print("end")

使用*导入time的sleep功能

  • 代码示例
from time import *

print("satrt")
# 程序睡眠3s
sleep(3)
print("end")

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

  • 代码示例
import time as t

print("satrt")
# 程序睡眠3s
t.sleep(3)
print("end")

自定义模块

创建自定义模块举例

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

my_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_module1
import 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_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()

安装第三方包

常见第三方包

在这里插入图片描述

安装第三方包

  • 命令:pip install 包名

  • 示例

在这里插入图片描述

综合练习

需求

在这里插入图片描述

实现

  • 新建my_utils包

  • 新建str_utils.py文件

# *_*coding:utf-8 *_*

def str_reverse(s):
    reversed(s)
    return s

def 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_util
from my_utils import file_util

print(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", "这是一条追加内容")

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【北京大学】徐高《金融经济学二十五讲》

一、经济的任务 经济的任务之一是确保有效地分配稀缺资源,这是经济学中的一个核心问题。资源是有限的,而需求是无限的,因此经济系统需要通过合理的机制来分配资源以满足社会的需求。以下是关于经济分配资源的几个方面: 1. 资源配…

【RPG Maker MV 仿新仙剑 战斗场景UI (三)】

RPG Maker MV 仿新仙剑 战斗场景UI 三 二级战斗指令菜单RMMV效果代码效果 仿仙剑UI代码效果 二级战斗指令菜单 仙剑1中二级战斗的菜单内容如下:物品、防御、围攻、逃跑、状态这五项。 现在来完成金玉其外的UI部分,内核具体的功能需要后期进行填充了&…

聚酰亚胺PI材料难于粘接,用什么胶水粘接?那么让我们先一步步的从认识它开始(一)

聚酰亚胺PI的基本概念 聚酰亚胺(Polyimide,简称PI)是一种重要的高性能聚合物材料。是指主链上含有酰亚胺环的一类聚合物,是综合性能最佳的有机高分子材料之一。它具有最高的阻燃等级(UL-94),以及…

C语言从入门到实战————数组和指针的深入理解

前言 在C语言中,数组和指针有的密切得联系,因为数组名本身就相当于一个指针常量。指针是一个变量,专门用来存储另一个变量的内存地址,通过这个地址可以访问和操作该变量的值,同时也包括数组。数组是一组连续存储的同类…

离线安装数据库 mysql 5.7 linux

离线安装数据库 mysql 5.7 linux 方法一 参考链接Linux(Debian10.2)安装MySQL5.7.24环境 赋予文件执行权限chmod x 文件名 使用root用户sudo su解压文件tar xvf mysql-5.7.42-linux-glibc2.12-x86_64.tar.gz重命名mv mysql-5.7.42-linux-glibc2.12-x86_64 mysql将桌面的mys…

【WSL】Windows wsl2 子系统忘记密码,重置修改用户密码

1.问题 windows 子系统 ubuntu 忘记密码,sudo 命令无法使用,需要重置密码 2. 解决 使用 wsl 命令进行修改,打开 cmd 窗口 # root 打开 wsl --user root # 修改 root 密码 passwd root # 修改用户密码 passwd username

【ARM】DS中Coretex-M处理器的常用寄存器介绍

【更多软件使用问题请点击亿道电子官方网站查询】 1、 文档目标 了解ArmDS中Coretex-M处理器的常用寄存器的名称及作用。 2、 问题场景 在对Coretex-M处理器进行开发时,了解常用寄存器的名称及作用,可以: 编写正确的程序: 寄存器是程序员用…

AI会取代低代码吗?——探讨两者在软件开发中的角色和关系

引言 在当今快速发展的数字化时代,软件开发已成为企业和商户必不可少的一项工作。为了应对不断增长的需求和日益复杂的业务要求,开发人员和企业正在寻求更加高效、快速的软件开发解决方案。在这样的背景下,低代码开发平台和人工智能&#xf…

【嵌入式开发·Arduino板】I2C接口通讯及应用 | 串口通讯实例 | I2C的类库函数,I2C接口的应用

“跟猫学,保持冷漠,适当撒娇,几乎不动心。跟猪学,保持食欲,充足睡眠,几乎不烦恼。” 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌿[2] 2023年城市之星领跑者TOP1(哈尔滨)🌿 🌟[3] 2022年度博客之星人工智能领域…

集合系列(四) -LinkedHashMap详解

一、摘要 在集合系列的第一章,咱们了解到,Map的实现类有HashMap、LinkedHashMap、TreeMap、IdentityHashMap、WeakHashMap、Hashtable、Properties等等。 本文主要从数据结构和算法层面,探讨LinkedHashMap的实现。 二、简介 LinkedHashMap可…

虚拟机网络链接

在虚拟网络设置中找到如下界面: "子网 IP" 192.168.79.0/24 表示一个局域网络,它有254个可能的IP地址可供分配(192.168.79.1到192.168.79.254),255.255.255.0 是子网掩码,定义了网络和主机部分。…

python练习一

1. 五个PPT上的界面打印【print、input函数】 print("\t\t\t\t\t英雄联盟商城登录界面\n~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~\n\t\t\t\t\t1. 用户登录\n\t\t\t\t\t2. 新用户注册\n\t\t\t\t\t3. 退出系统\n" "~ * ~ * ~ * ~ * ~ * ~ * ~…

代码随想录算法训练营第二十三天 | 77. 组合

回溯 77. 组合 题目链接&#xff1a;https://leetcode.cn/problems/combinations/ 文章讲解&#xff1a;https://programmercarl.com/0077.%E7%BB%84%E5%90%88.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1ti4y1L7cv/ class Solution { private:vector<…

菜刀HTTPTCP后门分析+防范

“菜刀”对于渗透测试者来说耳熟能详&#xff0c;但是大家用的菜刀真的安全吗&#xff1f;你能保证你所使用的工具不会被别人偷偷的塞入后门吗&#xff1f; 如果菜刀中被塞入后门 那我们岂不是成了别人的苦力。辛辛苦苦打下的shell就这样不知不觉的被别人窃取&#xff0c;怎能…

springboot271制造装备物联及生产管理ERP系统

制造装备物联及生产管理ERP系统设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装制造装备物联及…

Grass推出Layer 2 Data Rollup

Grass推出Layer 2 Data Rollup Grass邀请链接最新资讯 Grass邀请链接 欢迎使用我的邀请码进行注册: 邀请链接 如果你还不知道注册流程&#xff1a;详见Grass: 出售闲置带宽实现被动收入 最新资讯 简讯&#xff1a;2024年3月13日&#xff0c;Grass宣布正在建立基于Solana的La…

低噪声、低电压、低功耗运放,应用广泛—— D722 9MHz,轨对轨I/O CMOS运放

产品简介 D722是低噪声、低电压、低功耗运放&#xff0c;应用广泛。D722具有9MHz的高增益带宽积&#xff0c;转换速率为8.5V/μs&#xff0c;静态电流为1.7mA&#xff08;5V电源电压&#xff09;。 D722具有低电压、低噪声的特点&#xff0c;并提供轨到轨输出能力&#xff0c;D…

矿洞隧道漫游可视化:探索地心深处的奇幻世界

在这个充满好奇与探索的时代&#xff0c;我们总是渴望揭开世界的神秘面纱&#xff0c;探寻那些深藏在地球内部的奥秘。 矿洞隧道漫游可视化系统通过先进的计算机图形学、虚拟现实和三维建模技术&#xff0c;将矿洞隧道的真实场景进行高精度还原&#xff0c;让我们仿佛置身于一个…

云原生应用(4)之阿里云镜像加速以及镜像仓库

一、容器镜像加速器 1.1 获取阿里云容器镜像加速地址 登录阿里云。 1.2 配置Docker daemon加速器 添加daemion.json文件。 添加daemon.json配置文件 # vim /etc/docker/daemon.json # cat /etc/docker/daemon.json { "registry-mirrors": ["https://s…

基于Java+Springmvc+vue+element实现大学生科技创新创业项目管理系统

基于JavaSpringmvcvueelement实现大学生科技创新创业项目管理系统 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐…