Python 文件操作,异常处理,模块,包(阶段二)

一 ,文件读操作

1.1文本编码概念

  1. 计算机只能识别0,1,文本文件的识别与存储在硬盘之中是如何实现?使用编码技术将内容翻译成0,1(二进制)存储。
  2. 编码技术:翻译的规则,记录了如何将内容翻译为二进制,以及如何将二进制翻译回原文本内容
  3. 计算机中的编码:UTF-8 GBK BIG5(繁体)等
    在这里插入图片描述

1.2文件的概念

  1. 内存中存入的数据在电脑关机后就会消失,为了长久保存数据,就要使用硬盘,光盘,U盘等设备,为了便于数据的管理和检索,引入了文件的概念。一篇文章,一段视频,一个可执行程序,都可以被保存为一个文件,并赋予文件名。操作系统以文件为单位管理磁盘中数据。
  2. 文件的操作包括:打开,关闭,读,写。

1.3open()方法

  1. 使用open()函数,打开一个存在的文件或建立一个新文件(打开方式为w的时候创建)。将其赋值给一个文件对象f,f用于后续读,写等操作。
  2. 语法:open(文件名,打开方式,编码格式 )
  3. 例如:f=open('python.txt','r',encoding="UTF-8"),f是open函数的文件对象
模式描述
r以只读的方式打开文件,文件的指针将会放在文件袋的开头。
w以只写的方式打开,如果文件存在,从头开始编辑,原内容删除
a打开一个文件用于追加,如果该文件已经存在,新内容将会写入到已有内容之后如果文件不存在,则新建文件并存入内容。

1.4read(),readline(),readlines()方法

  1. 文件对象.read(num)num表示要从文件中读取的数据长度,单位是字节,如果没有传入参数,则读取所有数据。
  2. readlines()方法:按照行的方式将文本中数据进行读取,并且返回一个列表,其中每一行数据作为列表中一个元素。
  3. readline()方法:调用一次,一次读一行
  4. for可以循环每次读一行
  5. 文件的关闭:f.close()
#打开文件
f=open('E:\pythonProject/test1.txt',"r",encoding="UTF-8")#encoding关键字传参,因其位置并不是第三位
print(type(f))
#读操作read,readline
print(f.read(5))#读5个字节
print(f.read())#读取全部,
"""
如果同时使用了多次read方法第二次读的起点是第一次结束位置
"""

在这里插入图片描述

print(f.readlines())

在这里插入图片描述

print(f.readline())

在这里插入图片描述
读取两次:

print(f.readline())
print(f.readline())

在这里插入图片描述

#for循环每次读取一行
for line in f:
    print(f"每一行的数据:{line}")

在这里插入图片描述

#4关闭文件
f.close()

1.5with open as 操作

  1. 不用手动调用close()关闭文件操作,当执行完语句块后自动关闭文件。
#with open as
with open("E:\pythonProject/test1.txt","r",encoding="UTF-8") as f:
    for line in f:
        print(f"每行数据是{line}")

在这里插入图片描述

1.6总结

在这里插入图片描述

二,文件写操作

2.1语法格式

  1. 文件存在的话会将内容清空再写入,不存在则新建文件
"""写入"""
#1打开文件
f1=open("E:\pythonProject/test2.txt","w",encoding="UTF-8")
f2=open("E:\pythonProject/test3.txt","w",encoding="UTF-8")
#2写入文件,此时内容在缓冲区,并不在硬盘中
f1.write("你好")
f2.write("你好")
"""文件存在的话会将内容清空再写入,不存在则新建文件"""
#3将文件写入的内容刷新到硬盘中
f1.flush()
f2.flush()
#如果不用flush,关闭close拥有flush的功能
f1.close()
f2.close()
  • test3.txt文件并不存在,自动创建
  • 避免了频繁操作硬盘,提高效率。一攒一堆,一次性写入硬盘。
    在这里插入图片描述

2.2追加"a"

  1. 打开一个文件用于追加,如果该文件已经存在,新内容将会写入到已有内容之后如果文件不存在,则新建文件并存入内容。
  2. 只需将open方法中的w换成af1=open("E:\pythonProject/test2.txt","a",encoding="UTF-8"),其余写入操作不变
"""写入"""
#1打开文件
f1=open("E:\pythonProject/test2.txt","a",encoding="UTF-8")
#2写入文件,此时内容在缓冲区,并不在硬盘中
f1.write("追加写入")
#3将文件写入的内容刷新到硬盘中
f1.flush()

在这里插入图片描述
注意:可以用“\n”换行

f1.write("\n追加写入")

在这里插入图片描述

三, 异常处理

3.1 异常的捕获

3.1.1 为什么要捕获异常

  1. 程序中遇到BUG 后会出现两种情况:(1)整个程序遇到BUG后停止运行。(2)遇到BUG后有提醒,但程序继续运行
  2. 捕获异常的作用就在于,提前假设某处会出现异常,做好提前准备,当真的出现时,可以有后续手段。

3.1.2捕获常规异常

  1. 语法:
try:
    可能发生错误的代码
except:
    如果出现异常执行的代码

在这里插入图片描述

2.异常捕获基本语法


try:
    f=open("E:\pythonProject/abc.txt","r",encoding="UTF-8")
except:
    print("打开文件出错,文件不存在,将open的模式改为w")
    f = open("E:\pythonProject/abc.txt", "w", encoding="UTF-8")#此时创建了此文件

3.1.3捕获指定异常

try:
    print(name)
except NameError as e:
    print("出现了变量未定义异常")
    print(e)

try:
    print(1/0)
except ZeroDivisionError as e:
    print(e)

在这里插入图片描述

3.1.4捕获多个异常

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

###3.1.5 捕获所有异常

Exception 异常属于顶级异常,其余异常包含在内。

try:
    print(name)
except Exception as e:
    print(e)

在这里插入图片描述

3.2其他语法格式

3.2.1 try/except…else

在这里插入图片描述

3.2.2 try-finally

在这里插入图片描述

3.3异常的传递

  1. 异常具有传递性:当函数func1中发生异常,并且没有捕获到异常的时候,异常会传递到调用它的func2,同样,func2的异常会传递给调用它的main函数中。
def func1():
    print("这是func1的开始")
    num=1/0
    print("这是func1的结束")

def func2():
    print("这是func2的开始")
    func1()
    print("这是func2的结束")

def main():
    try:
        func2()
    except ZeroDivisionError as e:
         print(e)

main()

在这里插入图片描述

四,模块,包

4.1模块

  1. 定义:python模块(Module),是一个python文件,以.py结尾,模块中可以定义函数,变量,类,模块中也可以含有可执行代码。
  2. 作用:每一个模块都可以帮我们实现一些功能,比如实现和时间相关的功能,可以导入time模块,一个模块相当于一个工具包,里面有相似的功能实现。
  3. 语法:模块在使用前要先导入
1import 模块名
(2from 模块名 import 类,变量,方法
(3from 模块名 import *4import 模块名 as 别名
(5from 模块名 import 功能名 as 别名
  1. 实例:time模块的使用
    (当导入后并未使用时代码块处于灰色部分)
    在这里插入图片描述
    (按住ctrl键鼠标点击time,会进入time.py文件中,里面有对文件中函数的描述)
    在这里插入图片描述
    对sleep函数的功能描述
    (通过time.来调用需要的功能函数)
    在这里插入图片描述
    (1)import 模块名
#time 模块使用实例
#导入time模块,time.py代码文件,使用其中是sleep功能(函数)
import time
print("你好")
time.sleep(5)
print("我好")#五秒后输出

(2)from 模块名 import 类,变量,方法

#2.from  模块 import 功能名
#有时只需要模块的某一个功能,而不是所有的
from time import sleep
print("你好")
sleep(5)#不用再使用time.来待调用
print("我好")

(3)from 模块名 import *

from time import *
print("你好")
sleep(5)#不用再使用time.来待调用
print("我好")

(4)import 模块名 as 别名

import  time as T
print("开始")
T.sleep(3)#主要用来简化模块名称
print("3秒后")

(5)from 模块名 import 功能名 as 别名

from time import sleep as Sl
print("你好")
Sl(5)#不用再使用time.来待调用
print("我好")

4.2自定义模块

  1. 测试一:自定义模块并引用
    (自定义模块my_module1.py)
#定义加法函数
def add(x,y):
    return x+y

(测试文件my_module1_test.py)

#导入自定义模块
import my_module1
#调用
result=my_module1.add(1,5)
print(result)

在这里插入图片描述
2. 测试二:导入不同模块相同功能名称
定义两个模块分别是my_module1.py ,my_module2.py,内部定义了功能函数名字都为add(),但是一个是实现加法,一个 是减法。
在这里插入图片描述
my_module1.py:

#定义加法函数
def add(x,y):
    return x+y

my_module2.py:

#定义减法函数
def add(x,y):
    return x-y

测试:
当调用add()函数时,模块二引用语句颜色变深,说明模块一中的add()函数并未引用。
在这里插入图片描述

#导入自定义模块
from my_module1 import add#未引用
from my_module2 import add

#调用
result=add(3,1)
print(result)

在这里插入图片描述

4.3 内置变量 main

  1. 在模块内部写测试语句测试模块的函数能否执行,在导入该模块后直接运行会自动执行模块内的测试语句。
#定义加法函数
def add(x,y):
    return x+y
#模块内测试语句 
print(add(1,3))
#导入自定义模块
from my_module1 import add

直接运行:
在这里插入图片描述

  1. 当我们运行主文件程序时,不希望模块中的测试语句,测试语句只用于测试模块功能:使用内置变量__main__,当在模块内运行时,if后面的内容相当于true,执行下面语句,如果在导入模块文件中运行则if后面的语句相当于FALSE。
#定义加法函数
def add(x,y):
    return x+y
#模块内测试

if __name__=='__main__':
    print(add(1, 3))

4.4_ all _变量

  1. 如果模块中有‘_ all _’变量,此变量是一个列表形式,用来控制谁可导入,当时用from XXX import *时只能导入类表中元素
__all__=['add']
#定义减法函数

def add(x,y):
   print(x+y)
def reduce(x,y):
    print(x-y)
from my_module2 import *
add(1,2)

在这里插入图片描述

reduce() 函数不可以用
在这里插入图片描述

4.5包package

  1. 作用:用来管理模块(.py文件)
    在这里插入图片描述
  2. 包中必须包含__init__.py文件,如果没有就不是包,只是普通文件夹。包的文件夹图像有个圆圈。
    在这里插入图片描述
  3. import导入包:
import 包名.模块名
使用模块中函数:包名.模块名.函数名()
  1. 通过from语句导入:
 from 包名 import 模块名
 模块名.函数名#调用函数
from 包名.模块名 import 函数名
函数名()#调用调用
  1. 通过_ all _变量控制
在__init__.py文件中写入_ _all_ _变量:
_ _all__=[‘模块名1’,‘模块名2]

4.6安装第三方包

  1. 在pycharm中右下角找到python解释器,解释器设置:
    在这里插入图片描述
  2. 在这里插入图片描述
  3. 搜索numpy包
    在这里插入图片描述
  4. 在option中给定网址下载: -i https://pypi.tuna.tsinghua.edu.cn/simple
    在这里插入图片描述
  5. 或者在终端中使用命令安装:
 pip install  -i https://pypi.tuna.tsinghua.edu.cn/simple numpy

五,案例

在这里插入图片描述
文件目录结构:
在这里插入图片描述

  1. str_util.py文件
#字符串相关工具包

#函数str_reverse(s),接受传入的字符串,将字符串反转返回
def str_reverse(s):
    """多行注释回车后自动给出函数说明文档格式

    :param s: 传入的字符串
    :return: 返回反转后的字符串
    """
    return s[::-1]


#函数substr(s,x,y),按照下标x和y,对字符串切片
def substr(s,x,y):
    """
    :param s: 即将切片的字符串
    :param x: 切片开始下标
    :param y: 切片结束下标
    :return: 切片结束字符串
    """
    return s[x:y]


#测试
if __name__ == '__main__':
    print(str_reverse("黑马程序员"))
    print(substr("123456",1,4))
  1. file_util.py文件
#文件处理模块
#函数print_file_info(filename),接收传入文件的路径,打印文件全部内容,
# 如果文件不存在,捕获异常,输出提示信息,通过finally关闭文件对象。
def print_file_info(filename):
    fi=None
    try:
        fi=open(filename,"r",encoding="UTF-8")
        content=fi.read()
        print(f"文件内容:\n{content}")
    except Exception as e:
        print("文件异常")
        print(e)
    finally:
        if fi:
            fi.close()#如果一切正常,成功打开文件,fie不为空,否则出问题,所以要增加判断语句
#append_to_file(file_name,data) 接收文件路径以及传入的数据,将数据追加写到文件中
def append_to_file(file_name,data):
    try:
        #"a"打开一个文件用于追加,如果该文件已经存在,新内容将会写入到已有内容之后如果文件不存在,则新建文件并存入内容。
        fi2=open(file_name,"r",encoding="UTF-8")
        fi2.write(data)
    except Exception as e:
        print(f"文件有错:{e}")
    finally:
        fi2.close()
#测试
if __name__ == '__main__':
   # print_file_info("E:\pythonProject/test1.txt")
    append_to_file("E:\pythonProject/abc.txt","hello")
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泰勒今天想展开

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值