一 ,文件读操作
1.1文本编码概念
- 计算机只能识别0,1,文本文件的识别与存储在硬盘之中是如何实现?使用编码技术将内容翻译成0,1(二进制)存储。
- 编码技术:翻译的规则,记录了如何将内容翻译为二进制,以及如何将二进制翻译回原文本内容
- 计算机中的编码:UTF-8 GBK BIG5(繁体)等
1.2文件的概念
- 内存中存入的数据在电脑关机后就会消失,为了长久保存数据,就要使用硬盘,光盘,U盘等设备,为了便于数据的管理和检索,引入了文件的概念。一篇文章,一段视频,一个可执行程序,都可以被保存为一个文件,并赋予文件名。操作系统以文件为单位管理磁盘中数据。
- 文件的操作包括:打开,关闭,读,写。
1.3open()方法
- 使用open()函数,打开一个存在的文件或建立一个新文件(打开方式为w的时候创建)。将其赋值给一个文件对象f,f用于后续读,写等操作。
- 语法:open(文件名,打开方式,编码格式 )
- 例如:
f=open('python.txt','r',encoding="UTF-8")
,f是open函数的文件对象
模式 | 描述 |
---|---|
r | 以只读的方式打开文件,文件的指针将会放在文件袋的开头。 |
w | 以只写的方式打开,如果文件存在,从头开始编辑,原内容删除 |
a | 打开一个文件用于追加,如果该文件已经存在,新内容将会写入到已有内容之后如果文件不存在,则新建文件并存入内容。 |
1.4read(),readline(),readlines()方法
文件对象.read(num)
num表示要从文件中读取的数据长度,单位是字节,如果没有传入参数,则读取所有数据。readlines()
方法:按照行的方式将文本中数据进行读取,并且返回一个列表,其中每一行数据作为列表中一个元素。readline()
方法:调用一次,一次读一行- for可以循环每次读一行
- 文件的关闭:
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 操作
- 不用手动调用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打开文件
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"
- 打开一个文件用于追加,如果该文件已经存在,新内容将会写入到已有内容之后如果文件不存在,则新建文件并存入内容。
- 只需将open方法中的w换成a
f1=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 为什么要捕获异常
- 程序中遇到BUG 后会出现两种情况:(1)整个程序遇到BUG后停止运行。(2)遇到BUG后有提醒,但程序继续运行
- 捕获异常的作用就在于,提前假设某处会出现异常,做好提前准备,当真的出现时,可以有后续手段。
3.1.2捕获常规异常
- 语法:
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异常的传递
- 异常具有传递性:当函数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模块
- 定义:python模块(Module),是一个python文件,以.py结尾,模块中可以定义函数,变量,类,模块中也可以含有可执行代码。
- 作用:每一个模块都可以帮我们实现一些功能,比如实现和时间相关的功能,可以导入time模块,一个模块相当于一个工具包,里面有相似的功能实现。
- 语法:模块在使用前要先导入
(1)import 模块名
(2)from 模块名 import 类,变量,方法
(3)from 模块名 import *
(4)import 模块名 as 别名
(5)from 模块名 import 功能名 as 别名
- 实例:time模块的使用
(当导入后并未使用时代码块处于灰色部分)
(按住ctrl键鼠标点击time,会进入time.py文件中,里面有对文件中函数的描述)
(通过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自定义模块
- 测试一:自定义模块并引用
(自定义模块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
- 在模块内部写测试语句测试模块的函数能否执行,在导入该模块后直接运行会自动执行模块内的测试语句。
#定义加法函数
def add(x,y):
return x+y
#模块内测试语句
print(add(1,3))
#导入自定义模块
from my_module1 import add
直接运行:
- 当我们运行主文件程序时,不希望模块中的测试语句,测试语句只用于测试模块功能:使用内置变量__main__,当在模块内运行时,if后面的内容相当于true,执行下面语句,如果在导入模块文件中运行则if后面的语句相当于FALSE。
#定义加法函数
def add(x,y):
return x+y
#模块内测试
if __name__=='__main__':
print(add(1, 3))
4.4_ all _变量
- 如果模块中有‘_ 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
- 作用:用来管理模块(.py文件)
- 包中必须包含__init__.py文件,如果没有就不是包,只是普通文件夹。包的文件夹图像有个圆圈。
- import导入包:
import 包名.模块名
使用模块中函数:包名.模块名.函数名()
- 通过from语句导入:
from 包名 import 模块名
模块名.函数名#调用函数
from 包名.模块名 import 函数名
函数名()#调用调用
- 通过_ all _变量控制
在__init__.py文件中写入_ _all_ _变量:
_ _all__=[‘模块名1’,‘模块名2’]
4.6安装第三方包
- 在pycharm中右下角找到python解释器,解释器设置:
- 搜索numpy包
- 在option中给定网址下载: -i https://pypi.tuna.tsinghua.edu/simple
- 或者在终端中使用命令安装:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy
五,案例
文件目录结构:
- 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))
- 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")
更多推荐
Python 文件操作,异常处理,模块,包(阶段二)
发布评论