Python基础 4 - 文件操作、异常处理、模块梗概





  大家好,我是技术界的小萌新,今天要和大家分享一些干货。在阅读之前请先点赞👍,给我一点鼓励吧!这对我来说很重要 (*^▽^*)

一、文件知识

1、文件编码

  文件编码:编码是一种规则集合,将机器码(二进制码)与自然语言之间进行翻译。

  常用文件编码(密码本):UTF-8、GBK、Big5 等。


2、文件的读取操作

  文件:操作系统以文件为单位管理磁盘中的数据,文件分类很多,分为文本、图像、视频、音频、可执行文件等。

1) open() 打开文件 (读)

  语法:open(file,mode,encoding)

  • file [str]: 要打开文件的目标文件名的字符串[可包含文件的所在的绝对路径、相对路径。

  • mode [str]:设置打开模式,只读 r、写入 w、追加 a等。

    • w 写入:文件存在则覆盖写入,无文件则创建。

    • a 追加:文件存在,写入内容追加到文件末尾,无文件则创建。

  • encoding [str]:编码格式 (推荐使用 UTF-8 )。encoding 参数位置并非为第三位,所以使用 “关键字传参”。

2) 读操作相关方法:

  • 整个文件读取都是通过移动指针的方式,所以需要特别注意指针在读取中移动时所处的位置

  file.read([size]): 读取文件 size 字符的内容。size 默认为 -1 ( = None),即读取整个文件内容。

警告:

  1. 每次读取文件都是从当前指针位置(即上一次的位置)开始读取数据。即读取通过移动指针的方式。
  2. 在文本文件读取模式,size 的计数是以 Unicode 字符的个数计数的,在二进制文件读取模式下,size 计数是以字节为单位计数。
    • 在纯 ASCII 码下,字节数=字符串长度=字符个数,因为每个字符就一个字节。
    • 在 Unicode (编码)下,2 字节数=字符串长度=字符个数,因为每个字符都是2个字节。
    • UTF-8 下:英文 1 字节,中文 3 字节。

  file.readlines(): 读取文件所有内容,封装到列表中,每一行均为一个元素。读取文件指针后续的所有内容,直到读取到 文件结束符 EOF。会读取到换行符 “\n” 不会被转义。

  file.readline(): 一次读取一行内容,同上,包括 \n

  for line in file: 通过 for 循环简单的读取缓存区中已打开文件的每一行内容。会读入 \n

注意:

按行读入均会读取到换行符,一般需要 variable.strip() 默认去除文本(前)后的换行符、空格

3) 关闭文件

  file.close(): 关闭文件,把缓冲区写入磁盘进行持久化存储,最后解除文件占用,防止持续的 IO流 占用系统内存资源。

4) with open 打开文件

  语法:with open() as variable

  with open("./text.txt","r",encoding="UTF-8") as file_ins:

    for line in f:

      print(line)

  • 作用:语句结束后,自动关闭文件,防止遗忘

3、文件的写入操作

1) 写入/追加写入

  f.write(‘text’) --> 写入文本到 Python 内存缓冲区 --> f.flust --> 刷新缓冲区内容,写入到磁盘。

f = open('ins.txt','w')	  # 不指定 encoding ,则默认使用当前系统的 文件编码格式。
# f = open('ins.txt','a')	# 追加写入,可写入“\n”换行符来进行换行。
f.write('hello world')     # 写入字符,到 ptyhon 内存的缓冲区内。
f.flush()	# flush 刷新,缓冲区内容持久化存储写入到硬盘中。
  • 直接调用 write ,内容并未真正写入文件,而是会积攒在程序的内存中,称之为缓冲区。
  • 当调用 flush 的时候,内容会真正写入文件。
  • 这样做是避免频繁的操作硬盘,导致效率下降(缓冲区高速读取修改,最后一次性写入磁盘)。

二、异常的处理

1、异常的概念

  异常 = “BUG” = “小虫子”,一旦发生异常,Python 解释器就无法继续执行,并进行提示。


2、异常的捕获

  为什么需要捕获异常? 为了在力所能及的范围内,对可能出现的 BUG,进行提前准备、提前处理。

  这种行为被称之为:异常处理(捕获异常)

  程序遇到 BUG 之后的行为:

   ① 整个程序因为 小BUG 而停止。

   ② 对 BUG 进行提醒,整个程序继续进行。 --> 进行 “异常捕获” 即可达到该效果。

  基本语法

  try:

    可能发生的异常

  except: # 排除

    如果出现异常执行的代码  # 即补救行为

1) 捕获指定异常

  语法:except NameError(异常名称) as variable(把第一个异常赋给此变量,以下均同样):

2) 捕获多个异常

  语法:except (NameError, ZeroDivisionError)(多个异常)(as variable):

3) 捕获全部异常

  语法:except Exception (as e):

     print(“出现了未知的异常”)`


3、异常的 else 和 finally

  

try:

except:      # 有异常执行语句,与 else 互异。
    
else:          # 和 except 互异,无异常执行下列语句。
    
finally:      # 有没有异常都执行下列语句 。
   

4、异常的传递性

  异常具有传递性:如下示例,证明了异常具有传递性,从最底层,一直传递到了顶层。

所以顶层也可以捕获到异常。

def fun1():
    1 /0
def fun2():
    fun1()
def fun3():
    fun2()
fun3()
    
打印:

Traceback (most recent call last):
  File "D:\ASUS\Desktop\Typora\Python 学习笔记\Scripts\test.py", line 7, in <module>
    fun3()
  File "D:\ASUS\Desktop\Typora\Python 学习笔记\Scripts\test.py", line 6, in fun3
    fun2()
  File "D:\ASUS\Desktop\Typora\Python 学习笔记\Scripts\test.py", line 4, in fun2
    fun1()
  File "D:\ASUS\Desktop\Typora\Python 学习笔记\Scripts\test.py", line 2, in fun1
    1 /0
    ~~^~
ZeroDivisionError: division by zero   # 除零异常

三、模块

1、模块及导入方法

  Python 模块(Module),是一个 Python 文件,以 .py 结尾,模块能定义函数、类和变量,包含可执行代码。

  使用:1、导入模块:

[from 模块名]import [模块丨类丨变量丨函数丨*][as 别名]

  • 点 在此处代表模块的 层级结构
# 使用 from 导入单个函数就不用 “点” 表示层级关系了,* 同理,如下:
# from time import *     # 同下。
from time import sleep
sleep(5)

# 模块别名写法:
import time as t
from time import sleep as sl
image-20240824213741371

常见组合补充: import 包名.模块名.函数名 : 后续调用函数还得写全称,除非 from 消除掉。

   from 包名.模块名 import 函数

警告:

  • 导入不同名模块,同名变量、函数等,会被后一个模块覆盖。

2、自定义模块

  自定义个性模块时,模块名.pyimport 导入模块时需要的模块名。

1) name 内置变量

  __name__: Python 内置特殊变量,当程序执行时,被赋值为 __main__,调用其他模块时,会被替换为它的模块名

image-20240824220800405

  • 所以此处 if 块内容 既可以用于测试,又不会在模块被其他程序导入时 执行测试语句
# 自定义模块 my_module.py
def test(a,b):
	c = a+b
	return c
if __name__ == '__main__':    # 内置变量,运行程序时,被赋值为 __main__。
	v = test(1,2)                 # 测试内容,想导入模块时不被执行,则需要使用 __main__。
	print(v)

print(__name__)

2) all 内置变量

  __all__:数据类型 --> 列表。

所有 from xxx import * 中的 * 会应用 __all__ 列表中的对象。

  • __all__ = [“sleep”, “test”, “randint”] 只有定义 __all__ 列表时 * 的导入行为才会被它控制。
  • 也可控制 Python 软件包导入的 模块 行为,在 __init__.py 中 定义 __all__ 列表即可。

3、自定义 Python 包

image-20240824221854622

  Python 包为模块的文件夹,包含 一堆模块 + __init__.py 文件。–> Package 包

  导入 Python 软件包模块:import my_package.module_1from my_package import module_1

from my_package.module_1 import *(或具体功能)

  使用模块函数:my_package.module_1.test()module_1.test()test()

# __init__.py
    __all__ = ['module_1', 'module_2', 'module_3']	# 只允许导入软件包内的 这 3 个模块

4、pip 安装第三方 python 包

image-20240824223118060

   pip 使用语法:pip install python软件包名 设置中也可以管理下载、卸载 第三方库

   pip 默认从国外地址下载,加速方法:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 第三方库名

  • -i 指定网址,pycharm 设置中也可以 选中 options 参数输入:-i 指定网址 进行网络加速。

5、自定义模块,异常捕获综合讲解视频

[第一阶段-第九章-08-异常-模块-包-综合案例讲解_哔哩哔哩_bilibili


  文章到这里就结束了,希望我的分享能为你的技术之旅增添一抹亮色。如果你喜欢这篇文章,请点赞收藏支持我,给予我前行的动力!🚀



  • 13
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值