python 文件操作、代码异常

本章知识简介

主线A: 操作文件和目录
主线B: 异常处理

==本章目标:==

1:能够知道文件的使用步骤; [了解]
    a.打开文件
    b.读/写数据
    c.关闭文件
2:能够掌握如何以读的方式打开文件; [重点]
    open("xxx","r")
3:能够知道什么是异常; [了解]
    程序报错
4:能够知道try-except的作用; [重点]
    捕获异常

文件操作

[了解]什么是文件

==目标:==了解什么是文件?

如果要操作具体的文件以及文件内的数据内容,一起来看看文件类型。

说明:

(1)目录就是可以用于存放多个文件、目录的集合;[os模块]

(2)文件是用于记录数据内容的,通常是有后缀名的。[file对象]

我们已知道,文件可以用来存储数据。若根据文件内容的不同来给文件分类,可分为:

(1)文本类型:存放文字类数据,读写时使用r、w;

(2)二进制原始数据类型:存放二进制bytes数据,比如图片、音频、视频等,读写时使用rb、wb;

==总结:==

通常情况下,文件是有后缀名的,比如:.txt、.jpg等。

[掌握]操作文件的步骤

==目标:==掌握如何操作文件?

先来看看在现实生活中,怎么记录电子笔记?

(1)新建一个doc文件,使用办公软件打开;
(2)写入一些笔记,笔记写完了,然后保存信息;
(3)关闭办公软件。

类似地,在Python中操作文件记录信息的步骤:

(1)打开文件,或新建一个文件; open()
(2)读取或写入数据内容; read() / write()
(3)关闭文件。 close()

说明:

无论操作文件的过程多么复杂,这个步骤基本是一致的。

(1)打开文件

在操作一个文件前,需要先打开文件。

函数名含义
open(name, mode)创建一个新文件或打开一个已经存在的文件,name指的是文件名,mode指的是访问模式。

常见的mode访问模式有:

模式描述
r以读数据的方式打开文件,这是默认模式,可以省略。
rb以读二进制原始数据的方式打开文件。
w以写数据的方式打开文件。如果文件已存在,则打开文件写入数据是会覆盖原有内容。如果文件不存在,则创建新文件。
wb以写二进制原始数据的方式打开文件。
a使用追加内容形式,打开一个文件。通常用于写数据,此时会把新内容写入到已有内容后。

说明:

(1)访问模式r表示read,即读;

(2)访问模式w表示write,即写。

(2)读数据

在读取文件数据前,该文件必须已存在。

函数名含义
read()从某文件中,一次性读完整的数据。
readlines()按行的方式把文件中的完整内容进行一次性读取,并返回一个列表。
readline()一行一行读文件中的数据内容。

说明:

当访问模式有r时,可以读数据。

​
# 1、打开文件
# 这里文件路径后r是来说明后边的路径中\是普通字符,没有特殊函数,而不是转义字符
# 第二个参数r表示读模式,我要读取文件内容
file1 = open(r'E:\郑州大数据20期\file_test\a.txt','r',encoding='utf-8')
print(file1)
​
print('-----------读取文件全部数据-------------')
# 2、读取文件全部数据
file_data = file1.read()  # 从文件中读取所有数据,并返回
print(file_data)
​
print('-----------读取一行数据-------------')
# 3、读取一行数据
# 由于之前已经把文件的全部数据读取了,文件定位指针已经在文件末尾
# 这里需要将文件指针重新定位到开头
file1.seek(0)
file_line = file1.readline()
print(file_line)
​
print('-----------读每一行数据,并存入列表中-------------')
# 4、读取文件数据,并将每一行存入列表中
# 这里需要将文件指针重新定位到开头
file1.seek(0)
file_list = file1.readlines()  # 返回一个列表,列表中的元素是每一行数据,会每一行末尾的换行符
print(file_list)
for s1 in file_list:
 print(s1.strip())  # 去除每行的换行符
​
# 5、关闭文件
file1.close()

(3)写数据

在写文件数据前,文件若不存在,则创建一个新文件。

函数名含义
write(seq)给某文件写数据。

说明:

(1)当访问模式有w时,可以写数据;

(2)当使用访问模式a时,用于追加数据内容,也可以写入数据。

(4)关闭文件

当每次打开文件及使用完毕后,都需要进行关闭文件,用于释放系统内存资源。

函数名含义
close()关闭文件。

==总结:==

(1)读数据时使用r模式,写数据时使用()模式;A、a;==B、w==;

(2)不管一个文件有多么复杂,操作步骤都是:打开文件、读/写数据、关闭文件。

[掌握]写数据

==目标:==掌握写入数据的使用。

给文件写入数据:

函数名含义
write(seq)给某文件写数据。

例如,一起来完成:

(1)给test.txt文件分别写入数据:Hello World、123456;

(2)思考1:如果要给文件写入内容:黑马程序员,会怎样?

(3)思考2:如果要在文件原有内容基础上,再追加内容:itheima,该怎么做呢?

# 1、打开文件
# 这里的r是来说明后边的路径中\是普通字符,没有特殊函数,而不是转义字符
# w是以写入的模式打开文件,如果文件不存在则创建,如果文件存在,则覆盖原内容
file1 = open(r'E:\郑州大数据20期\file_test\a.txt','a',encoding='utf-8')
print(file1)
​
# 2、向文件写入数据
file1.write('好好学习,天天向上!\n')  # 写入时,不会自动换行,你需要手动加换行符
​
# 3、关闭文件
file1.close()

==总结:==

(1)请问:当使用w模式操作文件时,可以不管文件是否已存在,这句话对吗?A、对;B、错;

(2)注意:如果要给一个文件写入中文内容,要记得设定文件的编码格式为utf-8。

[掌握]快捷读取数据

==目标:==掌握快捷读取内容的使用。

给文件读取数据:

函数名含义
read()从某文件中,一次性读完整的数据。

说明:

读取文件数据之前,要保证文件已经存在。

为了简化读写数据的操作,也可以使用语法:

with open(xxx, xx) as 变量名:
    变量名.read()
    # 变量名.write(xxx)

例如,一起来完成:

(1)读取hello.txt文件的数据内容,并输出;

(2)思考:若手动给hello.txt文件中添加了【深圳】,再读文件数据会出现什么情况呢?

# 这种写法使用完文件之后,我们不用手动关闭文件,系统会自动关闭文件,释放资源,并且自动处理异常情况
with open(r'E:\郑州大数据20期\file_test\a.txt','r',encoding='utf-8') as file1:
    file_data = file1.read()  # 从文件中读取所有数据,并返回
    print(file_data)
​
# 这种写法使用完文件之后,我们不用手动关闭文件,系统会自动关闭文件,释放资源,并且自动处理异常情况
with open(r'E:\郑州大数据20期\file_test\a.txt','a',encoding='utf-8') as file2:
    file2.write('eooigeegoegoegego')
 

==总结:==

(1)注意:当使用r模式操作文件时,文件必须已存在;

(2)如果要读取一个有中文内容的文件,需要设定文件的编码格式为()。==A、utf-8==;B、gbk;

[了解]其他方式读数据

==目标:==了解读取数据的其他方式。

其他方式:

函数名含义
readlines()按行的方式把文件中的完整内容进行一次性读取,并返回一个列表。
readline()一行一行读文件中的数据内容。

例如,一起来完成:

(1)读取hello.txt文件的数据内容,并输出;

(2)分别使用readlines()、readline()方式来完成。

# 1.打开文件
# file = open("./file/hello.txt","r")
file = open("./file/hello.txt","r",encoding="utf-8")
# 2.读数据
# readlines()
lines = file.readlines()  # ['hello python\n', 'abc\n', 'ABCDEFG\n', '123']
print(lines)
# readline()   # 1.当使用readxx()读取数据时, 指针偏移量开始处;  2.指针继续移动
# line = file.readline()
# print(line)
# line = file.readline()
# print(line)
# line = file.readline()
# print(line)
# line = file.readline()
# print(line)
# print("------------------------")
# line = file.readline()  # ""
# print(line)
# while True:
#     line = file.readline()
#     if len(line) == 0:  # \n
#         break
#     print(line)
​
# 3.关闭文件
file.close()

==总结:==

(1)常见读取文件数据的方式有:read()、readlines();

(2)注意:当文件内的数据呈现很规律的一行一行内容时,可以优先考虑使用()。==A、readlines()==;B、readline();

[掌握]备份文件

==目标:==掌握如何备份文件内容。

备份文件指的是:将原文件的数据内容进行重新写入到另一个新文件中。

备份文件常应用:

例如,一起来完成:

(1)将a.txt文件进行备份处理;

(2)备份文件名为:b.txt。

print('-------------文本文件复制(自定义):方式1----------------')
# 1、打开源文件(a.txt)和目标文件(b.txt)
with open('a.txt','r',encoding='utf-8') as file_src:
    with open('b.txt','w',encoding='utf-8') as file_dest:
        # 2、实现文件复制
        file_data = file_src.read()
        file_dest.write(file_data)
​
​
print('-------------文本文件复制(调用模块函数):方式2----------------')
import shutil
​
# copy2函数既可以拷贝文件内容,也会拷贝a.txt的元数据(文件权限,访问日期.....)
shutil.copy2('a.txt','c.txt')
​
print('-------------二进制文件复制(自定义):方式1----------------')
# 1、打开源文件(aaa.wmv)和目标文件(bbb.wmv),视频是二进制文件,必须加b
with open('aaa.wmv','rb') as file_src:
    with open('bbb.wmv','wb') as file_dest:
        # 2、实现文件复制
        file_data = file_src.read()  # 从源文件读取数据
        file_dest.write(file_data)   # 把读取后的数据写入目标文件
​
​
print('-------------二进制文件复制(调用模块函数):方式2----------------')
import shutil
​
# copy2函数既可以拷贝文件内容,也会拷贝aaa.wmv的元数据(文件权限,访问日期.....)
shutil.copy2('aaa.wmv','ccc.wmv')
​

==总结:==

(1)备份文件的操作,类似于操作系统中的复制、粘贴功能;

(2)请问:当要备份文件时,要注意读写文件的编码要保持一致,这句话正确吗?==A、正确==;B、错误。

os模块

[掌握]查看目录

==目标:==了解查看目录的使用。

Python中的os模块包含有操作系统所具备的功能,如查看路径、创建目录、显示文件列表等。

os模块是Python标准库,可直接导入使用:

# 导入os模块
import os

在Python中,os模块的常用函数分为两类:

(a)通过os.path调用的函数

(b)通过os直接调用的函数

在Python的os模块中,通过os.path常用函数:

函数名含义
exists(pathname)用来检验给出的路径是否存在。
isfile(pathname)用来检验给出的路径是否是一个文件。
isdir(pathname)用来检验给出的路径是否是一个目录。
abspath(pathname)获得绝对路径。
join(pathname,name)连接目录与文件名或目录。
basename(pathname)返回单独的文件名。
dirname(pathname)返回文件路径。

说明:

上述常用函数需要使用os.path来进行调用。

例如,使用os模块来完成:

(1)在某目录下手动新建day05/file目录与day05/file/hello.txt文件;

(2)判断file/hello.txt是否存在、是否是文件、是否是目录、获取绝对路径名、获取单独的文件名;

(3)执行程序,观察效果。

import os
​
print(os.path.exists('a.txt'))
​
# | isfile(pathname)    | 用来检验给出的路径是否是一个文件。 |
print(os.path.isfile('a.txt'))
​
# | isdir(pathname)     | 用来检验给出的路径是否是一个目录。 |
print(os.path.isdir('dir'))
​
# | abspath(pathname)   | 获得绝对路径。                     |
print(os.path.abspath('a.txt'))
# | join(pathname,name) | 连接目录与文件名或目录。           |
​
print(os.path.join(r'D:\work_space\python_project_gz\day05','b.txt'))
​
# | basename(pathname)  | 返回单独的文件名。                 |
print(os.path.basename(r'D:\work_space\python_project_gz\day05\b.txt'))
​
# | dirname(pathname)   | 返回文件父路径。                     |
print(os.path.dirname(r'D:\work_space\python_project_gz\day05\b.txt'))

==总结:==

(1)在Python中操作目录时,需要使用到os模块;

(2)注意:当要检查某目录是否存在时,可以使用()方法。==A、exists()==;B、isfile()。

[掌握]目录的具体操作

==目标:==了解操作目录的方式有哪些?

在Python的os模块中,可直接通过os调用的常用函数:

函数名含义
getcwd()获得当前工作目录,即当前Python脚本工作的目录路径。
system(name)运行windows下cmd的shell命令。
listdir(path)返回指定目录下的所有文件和目录名,即获取文件或目录列表。
mkdir(path)创建单个目录。
makedirs(path)创建多级目录。
remove(path)删除一个文件。
rmdir(path)删除一个目录。
rename(old, new)重命名文件。

说明:

上述常用函数可直接使用os来进行调用。

例如,使用os模块来完成:

(1)获取当前工作目录;

(2)获取day05/file下的文件或目录列表信息;

(3)思考:若要在file下新建hello/world/python目录,该怎么做呢?

# # | getcwd()         | 获得当前工作目录,即当前Python脚本工作的目录路径。       |
import os
print(os.getcwd())
​
# system(name)     运行windows的cmd中的shell命令
os.system('dir')  # 中文路径可能会出现乱码
​
# listdir(path)    返回指定目录下的所有文件和目录名,并存入列表中
print(os.listdir('E:\input'))
​
#  mkdir(path)      创建单个目录。
os.mkdir('dir2')
#  makedirs(path)   | 创建多级目录。
os.makedirs('dir11/dir22/dir33')
os.makedirs('dir11\\dir22\\dir33')
​
# remove(path)   删除一个文件。
os.remove('a.txt')
​
# | rmdir(path)      删除一个空目录。
import shutil
​
os.rmdir('dir')
​
#  shutil.rmtree(path)   删除一个非空目录,递归删除
shutil.rmtree('dir11')
​
# rename(old, new)  重命名文件。
os.rename('aaa.wmv','aaa2.wmv')

==总结:==

(1)当要遍历及获取某目录下的所有文件信息时,可以使用()方法;==A、listdir()==;B、rmdir();

(2)注意:当要涉及到操作目录,比如创建目录、检查目录是否存在等,就需要直接使用os模块。

异常介绍

[了解]什么是异常

==目标:==了解什么是异常?

异常指的是Python程序发生的不正常事件。

有时候,异常可称为错误。

当检测到一个错误时,Python解释器就无法继续执行,反而出现了一些错误的提示,这就是异常,也就是我们常说的BUG。

例如,一起来完成:

(1)定义一个列表变量;

(2)获取一个远超列表索引值的元素,报错:IndexError。

# # 1.正常
# print("Hello1")
# print("Hello2")
# # 2.异常
# datas = [1,2,3]
# print(datas[100])  # 崩溃
# print("Hello3")
# print("Hello4")
​
list1 = [1,2,3,4,5]
try:  # 加上 try  except 可以使程序遇到异常不会崩溃,回到正常状态,并给出提醒
    print(list1[88])  # IndexError
except:
    print('服务器一不小心走丢了,请稍后再试!')
​
print('程序结束')
print('ByeBye')

==总结:==

(1)通常情况下,Python异常的名称是以()结尾;==A、Error==;B、Exception;

(2)注意:开发者往往是可以处理异常的。

[了解]制造常见的异常

==目标:==了解常见的异常有哪些?

为便于更快的了解Python异常,要了解并记忆异常信息。

例如,一起来完成:

(1)使用案例来制造出几个常见异常;

(2)比如:NameError、IndexError、KeyError、TypeError等。

# 1.fNameError: 直接使用未定义的变量
try:
    print(a)
    # 2.IndexError
    strs = "hello"
    print(strs[100])
​
    # 3.KeyError
    dicts = {}
    print(dicts["name"])
​
    # 4.TypeError
    print("hello" + 666)
    strs = "hello"
    print("结果:%d" % strs)
​
    # 5.FileNotFoundError ..
    open("./test.txt", "r")
​
except:
    print('程序出现了问题')
​
print('Byebye')

==总结:==

(1)当编程开发时,要把一些常见的异常记住,并掌握解决方案;

(2)实际上,当开发者能制造出对应的异常信息,往往他是能够解决的,反之则无法解决。

常见处理方式

[掌握]快速入门异常

==目标:==掌握异常的快速入门使用。

当程序中遇到了异常时,通常程序会出现崩溃情况。

为了不让程序崩溃,就可以使用异常来快速处理。

异常处理语法:

try:
    可能发生异常的代码
except:
    如果出现异常时, 执行的代码

说明:

try、except都是关键字,用于处理异常。

例如,一起来完成:

(1)制造出一个IndexError异常;

(2)使用异常来快速处理这段可能会产生IndexError的代码。

# 1.制造异常
# 2.处理
try:
    datas = [1,2,3]
    print(datas[100])  # 中断
except:
    print("已经发生了异常》。。")
print("Bye Bye")   # 当处理了异常后,程序可以稳定继续往后执行代码

==总结:==

(1)若要让程序不崩溃,可以使用()快速处理异常。==A、try-except==;B、try-error;

[了解]捕获多个异常

==目标:==了解捕获多个异常的使用。

捕获异常是处理异常的标准形式。通常情况下,捕获异常分为三类:

(1)捕获一个指定异常

(2)捕获多个异常

(3)捕获所有异常

接着,来看看捕获一个指定异常的语法:

try:
    可能发生异常的代码
except 异常类型名:
    当捕获到该异常类型时,执行的代码
try:
    # 1.NameError: 直接使用未定义的变量
    print(a)
    # 2.IndexError
    strs = "hello"
    print(strs[100])
​
    # 3.KeyError
    dicts = {}
    print(dicts["name"])
​
    # 4.TypeError
    print("hello" + 666)
    strs = "hello"
    print("结果:%d" % strs)
​
    # 5.FileNotFoundError ..
    open("./test.txt", "r")
​
except NameError:  # 这里只能处理变量未定义异常,其他异常不能处理
    print('程序出现了问题')
​
print('Bye Bye')
捕获多个异常指的是:可以对一段可能发生异常的代码做多个异常类型的判断处理。

捕获多个异常语法:

try:
    可能发生异常的代码
except (异常类型1,类型2,...):
    如果捕获到该异常类型时,执行的代码

例如,一起来完成:

(1)有一段可能发生IndexError、KeyError的代码;

(2)使用多个except做异常处理;

(3)使用捕获多个异常的方式来处理代码片段。

try:
    # 1.NameError: 直接使用未定义的变量
    print(a)
    # 2.IndexError
    strs = "hello"
    print(strs[100])
​
    # 3.KeyError
    dicts = {}
    print(dicts["name"])
​
    # 4.TypeError
    print("hello" + 666)
    strs = "hello"
    print("结果:%d" % strs)
​
    # 5.FileNotFoundError ..
    open("./test.txt", "r")
​
except (NameError,IndexError,KeyError,TypeError,FileNotFoundError):  # 这里可以处理5种异常,其他异常不能处理
    print('程序出现了问题')
​
print('Bye Bye')

==总结:==

(1)当捕获多个异常时,可以将多个异常使用()形式存放。==A、元组==;B、列表。

[掌握]捕获所有异常

==目标:==掌握捕获所有异常的使用。

要知道的是,Exception是表示所有程序异常类的父类,即使用Exception可以表示一切异常。

捕获所有异常语法:

try:
    可能发生异常的代码
except Exception[ as 变量]:
    当捕获到该异常类型时,执行的代码

说明:

Exception的首字母要大写。

例如,一起来完成:

(1)有一段可能发生异常的代码;

(2)使用捕获所有异常的形式来处理。

try:
    # 1.NameError: 直接使用未定义的变量
    print(a)
    # 2.IndexError
    strs = "hello"
    print(strs[100])
​
    # 3.KeyError
    dicts = {}
    print(dicts["name"])
​
    # 4.TypeError
    print("hello" + 666)
    strs = "hello"
    print("结果:%d" % strs)
​
    # 5.FileNotFoundError ..
    open("./test.txt", "r")
       # 类          对象
except Exception as error:  # 这里可以处理所有异常,会把异常信息保存到对象error中,可以打印
    print(error)  # 打印异常信息
​
print('Bye Bye')

==总结:==

(1)在捕获异常的三种方式中,而捕获所有异常的方式最简洁高效;

(2)在实际应用开发中,推荐使用捕获所有异常的方式来处理可能发生异常的代码。

[了解]异常的其他关键字

==目标:==了解异常其他关键字的使用。

在捕获异常过程中,有两个关键字else、finally需要注意:

else:表示如果没有异常时,要执行的代码;
finally:表示的是无论是否有异常,都要执行的代码。

当把else、finally都放入到捕获异常中,语法:

try:
    可能发生异常的代码
except 异常类型:
    当捕获到该异常类型时,执行的代码
else:
    没有异常信息时,执行的代码--->try 块成功完成后执行一些清理或后续操作。
finally:
    不管有没有异常,都会执行的代码(资源释放) --->它通常用于执行清理操作,如关闭文件、释放资源等

例如,一起来完成:

(1)有一段可能发生IndexError的代码片段;

(2)使用else关键字处理不发生异常的情况;

(3)使用finally关键字处理发生、不发生异常的情况;

(4)执行程序,观察效果。

# 1.制造异常
# 2.处理 指定异常
try:
    data = [1, 2, 3]
    print(data[100])
except IndexError:
    print("====1====已发生异常信息!")
else: # 3.else:没有发生异常时,处理的事情
    print("没有发生异常时,才会执行代码! !")
finally:# 4.finally:文件必须关闭
    print("无论有没有异常,都会执行finally!!")

==总结:==

(1)关键字else、finally可以配合异常处理一起使用;

(2)注意:当使用finally部分代码时,可以用于完成一些必须完成的操作,例如关闭文件、关闭系统资源等。[思考]

==思考:==例如,有一段代码,当执行结束后,结果是( ==C== )。

def test():
    try:
        strs = "abc"
        print(strs[60])
    except:
        return 1
    finally:
        return 2

A、程序出错 B、1 C、2 D、1 2

[掌握]异常具有传递性

==目标:==掌握异常可以进行传递。

例如,一起来完成:

(1)定义两个函数test()、func();

(2)在一个函数中产生IndexError,同时在另一个函数中调用,观察效果。

==总结:==

(1)当一段可能发生异常的代码,发生了异常时,若不处理,则会传递给调用处;

(2)注意:标准的异常处理方式是()。==A、捕获异常==;B、抛出异常;

(3) 处理异常,尽量在异常可能得发生地解决异常,不要随便把异常抛给它的调用者,这样出现异常会造成 更大范围的影响

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值