博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python文件与异常
阅读量:3957 次
发布时间:2019-05-24

本文共 7328 字,大约阅读时间需要 24 分钟。

文章目录

一. 文件的基础知识

文件的使用可以大大简化代码并保证输入的正确性。而将文件用于输出时,其最大的优势在于可以将程序结构长期保存

1. 文件与文件类型

(1). 定义

文件是数据的抽象和集合

  • 文件是存储在辅助存储器上的数据序列

  • 文件是数据存储的一种形式

  • 文件的展现形态:文本文件和二进制文件

    组成文件的数据可以是ASCII编码,也可以是二进制编码    本质上所有文件都是二进制形式存储    形式上所有文件采用两种方式展示

文件一定有一个文件名,文件名的长度和命名规则因不同的操作系统而异

(2). 文件名的组成

文件名 = 主文件名.扩展名

主文件名:由用户根据OS的命名规则自行命名,并且要与其他文件加以区别扩展名:根据文件类型对应专属的缩写,指定打开、操作该文件的应用程序

注:文件都是按文件名访问的

一方面通过主文件名指明访问对象另一方面通过扩展名指定访问和处理文件的应用程序

(3). 文件类型

文本文件:是纯文本,指只包含基本文本字符,由单一特定编码组成的文件

由于存在编码,文本文件也被看成是存储着的长字符串

最常见的文本文件是.txt文件.py文件也是文本文件

二进制文件:除了文本文件之外的文件,直接由比特0和1组成,没有统一字符编码

一般存在由二进制0和1进行特定的组织结构,产生文件如.doc文件,.xls文件,声音文件,图像文件(.png),.exe文件,视频文件(.avi)不同的二进制文件需要借助不同的库进行不同的处理

在这里插入图片描述

2. 目录与文件路径

(1). 目录

  • 文件是用来组织和管理一组相关数据的,而目录是用来组织和管理一组相关文件的
  • 目录又称为文件夹,可以包含文件,也可以包含其他目录

(2). 路径表示

文件保存的位置称为路径

1. 绝对路径

①定义:

指从文件所在驱动器(盘符)开始描述文件的保存位置。

举例:	E:\学习\Visual stdio code\Python作业\python的word作业\CTF.py		其中反斜杠\是盘符、目录、文件之间在WindowsOS下的分隔符。

②在Python程序中描述一个文件的路径方式

以下是在Windows平台表示形式

  1. 需要使用字符串

    但是在字符串中,\是转义序列符,所有为了还原反斜杠分隔符的含义,使用两个\  如:"E:\\学习\\Visual stdio code\\Python作业\\python的word作业\\CTF.py"
  2. 使用r取消后续字符串中反斜杠的转义特性

    这样书写简便

    举例:r "E:\学习\Visual stdio code\Python作业\python的word作业\CTF.py"

2. 相对路径

①定义

是指从当前工作目录开始扫描文件的保存位置

每个运行的程序都有一个当前工作目录,又称cwd。一般来说当前工作目录默认为应用程序的安装目录
通过Python语言自带的os库函数重新设置cwd>>>import os>>>os.getcwd()		#查看当前工作目录'E:\\学习\\Visual stdio code\\Python作业\\python的word作业\\CTF.py'>>>os.chdir('E:\\学习\\Visual stdio code\\Python作业')	#修改当前工作目录>>>os.getcwd()'E:\\学习\\Visual stdio code\\Python作业'

②相对路径表示方法

相对路径中的盘符直到当前工作目录部分都缺省了,系统默认从当前工作目录开始根据路径描述定位文件

“…”表示当前目录的上一级目录

二. 文件的操作

通过绝对路径或相对路径找到文件,然后就是对文件进行操作,

文件操作的步骤:打开文件、读或写文件、关闭文件

1. 文件的打开和关闭

在这里插入图片描述

(1). 文件的打开

1. 定义

大多数文件都是长期保存在外部存储器的,需要操作时必须从外存调入内存,才能由CPU进行处理。

而打开操作就是将文件从外部存储器调入内存的过程,这个过程需要使用Python内置的open命令,并生成一个File对象

注:Python程序中,文件一旦打开都会和一个文件对象相关联,随后的文件操作都通过调用file对象的方法实现

2. 语法格式一

文件对象名 = open(文件路径字符串,模式字符)

文件路径字符串可以采用:绝对路径、或相对路径打开文件模式:指定打开文件类型和操作文件的方式
打开模式 文件类型 操作方式 文件不存在时 是否覆盖写
’r‘ 文本文件 只可读文件 报错 -
’r+‘ 可读可写 报错
’w‘ 只可写文件 新建文件
’w+‘ 可读可写 新建文件
’a‘ 只可写文件 新建文件 否,从EOF处开始追加写
’a+‘ 可读可写 新建文件 否,从EOF处开始追加写
’rb‘ 二进制文件 只可读文件 报错 -
’rb+‘ 可读可写 报错
’wb‘ 只可写文件 新建文件
’wb+‘ 可读可写 新建文件
’ab‘ 只可写文件 新建文件 否,从EOF处开始追加写
’ab+‘ 可读可写 新建文件 否,从EOF处开始追加写

在这里插入图片描述

在这里插入图片描述

3. 语法格式二

with open("文件路径字符串", "模式字符", encoding="编码类型") as 文件对象名:	文件操作语句

关键字with的功能是在不再需要访问文件后自动将文件关闭。

而open命令打开文件一定要通过调用close()方法进行关闭。

举例理解:

文件 test.txt Hello,world!Hello,Python!Hello,my brothers.代码:with open('test.txt') as file_object:    contents = file_object.read()    print(contents)结果:Hello,world!Hello,Python!Hello,my brothers.解释一下:函数open()中的参数'test.txt'就是要打开的文件。函数open()返回的是打开文件的对象,第一行代码就是把文本文件 test.txt 打开,并将其对象保存在file_object变量中。

(2). 文件的关闭

1. 定义

执行open命令打开文件之后,这个文件就被Python程序占用并调入内存,其后所有的读写操作都发生在内存,于此同时,其他任何程序都不能操作该文件

当读写操作结束后,必须将文件从内存保存到外存,这样做一方面将内存中文件的变化同步至外存,以便长期保存

也是为了释放Python程序对文件的占用,让其他应用程序能够操作文件

2. 语法格式

文件对象.close()

注:不允许对关闭的文件执行任何读写操作

2. 文件内容的读取

(1). 用文件对象的read()方法读文件

1. 定义

读出文件所有内容并作为一个字符串返回

2. 语法

字符串变量 = 文件对象.read()

3. 举例

score1.txt文件内容:学号,平时成绩,期末成绩9999180101,77,889999180102,91,859999180103,87,969999180104,70,689999180105,86,72with open('score1.txt', 'r', encoding="utf-8") as file_object:    contents = file_object.read()    print(contents)结果为:学号,平时成绩,期末成绩9999180101,77,889999180102,91,859999180103,87,969999180104,70,689999180105,86,72

(2). 用文件对象的readline()方法读文件

1. 定义

将读出文件中当前行,并以字符串的形式返回

2. 语法

字符串变量 = 文件对象.readline()

3. 注意事项

每调用一次该函数,读取文件的一行内容

如果文件包含多行内容,配合for循环使用

(3). 用文件对象的readlines()方法读文件

1. 定义

以列表的形式返回整个文件的内容,其中一行对应一个列表元素

2. 语法

列表变量 = 文件对象.readlines()

3. 注意事项

readlines()方法更简洁的方式按行读出整个文件内容,后续只要通过简单的列表遍历就可以取出任意行进行处理

(4). 逐行读取

1. 定义

将文本文件中的数据进行逐行读取

2. 举例

with open('test.txt') as file_object:    for line in file_object:        print(line)结果:Hello,world!Hello,Python!Hello,my brothers.输出结果中每一行内容后面都多了一个空行,这时因为在文件中每一行的末尾都会有一个换行符,而每条print()语句也会加上一个换行符,所以每行末尾都有两个换行符,所以输出之后就会多一个空行。with open('test.txt') as file_object:    for line in file_object:        print(line.rstrip())可以消除多于的空行

(5). 语法总结

在这里插入图片描述

在这里插入图片描述

(6). 文件的操作举例

1. 遍历全文本:方式一

在这里插入图片描述

2. 遍历全文本:方式二

在这里插入图片描述

3. 逐行遍历文件:方法一

在这里插入图片描述

4. 逐行遍历文件:方法二

在这里插入图片描述

3. 数据的文件写入

(1). 用文件对象的write()方法写文件

1. 定义

write()方法将指定的字符串写入文件当前插入点位置

2. 语法

文件对象.wirte(写入字符串)

注:每次调用write()方法系统都会返回这次写入文件的字符数

3. 注意事项

  • 打开文件执行写入操作,连续的write()方法按照顺序依次写入字符串
  • 文件的write()方法将字符串参数原样写入文件,连续希尔不同字符串之间不会添加任何分隔符

(2). 用文件对象的writelines()方法写文件

1. 定义

writelines()方法可以以序列的形式接受多个字符串作为参数,一次性写入多个字符串

2. 语法

文件对象.writelines([“字符串序列1,字符串序列2”])

参数可以是:列表、集合、元组、字典,但元素一定要是字符串

3. 注意事项

  • 和write()方法一样都是字符串原样写入文件,不添加任何分隔符
  • 只有在列表参数的字符串末尾加上分隔符才行

(3). 语法总结

在这里插入图片描述

在这里插入图片描述

(4). 数据文件写入举例

在这里插入图片描述

需要移动指针,从最开始的位置向后遍历,才能输出文本内容

在这里插入图片描述

三. 实例:自动轨迹绘制

1. 基本思路

  • 步骤一:定义数据文件格式(接口)
  • 步骤二:编写程序,根据文件接口解析参数绘制图型
  • 步骤三:编制数据文件

2. 数据接口定义

在这里插入图片描述

3. 举例:

#AutoTraceDraw.pyimport turtle as tt.title('自动轨迹绘制')t.setup(800, 600, 0, 0)t.pencolor("red")t.pensize(5)#数据读取datals = []file = open("data.txt",'r')for line in file:    line = line.replace("\n","")    if line !="":        datals.append(list(map(eval, line.split(','))))file.close()#自动绘制for i in range(len(datals)):    t.pencolor(datals[i][3],datals[i][4],datals[i][5])    t.fd(datals[i][0])    if datals[i][1]:        t.rt(datals[i][2])    else:        t.lt(datals[i][2])data.txt300,0,144,1,0,0300,0,144,0,1,0300,0,144,0,0,1300,0,144,1,1,0300,0,108,0,1,1184,0,72,1,0,1184,0,72,0,0,0184,0,72,0,0,0184,0,72,0,0,0184,1,72,1,0,1184,1,72,0,0,0184,1,72,0,0,0184,1,72,0,0,0184,1,72,0,0,0184,1,720,0,0,0

在这里插入图片描述

四. 一维数据的格式化和处理

1. 数据组织的维度

(1). 从一个数据到一组数据

在这里插入图片描述

(2). 维度:一组数据的组织形式

在这里插入图片描述

(3). 数据的分类表示

1. 一维数据

在这里插入图片描述

2. 二维数据

在这里插入图片描述

3. 多维数据

在这里插入图片描述

4. 高维数据

在这里插入图片描述

(4). 数据的操作周期

在这里插入图片描述

2. 一维数据的表示

(1). 如果数据间有序:使用列表类型

在这里插入图片描述

(2). 如果数据间无序:使用集合类型

在这里插入图片描述

3. 一维数据的存储

(1). 存储方式一:空格分隔

在这里插入图片描述

(2). 存储方式二:逗号分隔

在这里插入图片描述

(3). 其他方式

在这里插入图片描述

4. 一维数据的处理

在这里插入图片描述

(1). 一维数据的读入处理

在这里插入图片描述

(2). 一维数据的写入处理

在这里插入图片描述

五. 二维数据的格式化和处理

1. 二维数据的表示

(1). 使用列表类型

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2. CSV数据存储格式

(1). CSV(Comma-Separated Values, 由逗号分隔的值)

在这里插入图片描述

(2). 举例

在这里插入图片描述

(3). 约定

在这里插入图片描述

3. 二维数据的存储

在这里插入图片描述

4. 二维数据的处理

(1). 二维数据的读入处理

在这里插入图片描述

(2). 二维数据的写入处理

在这里插入图片描述

(3). 二维数据的逐一处理

在这里插入图片描述

六. 异常和异常处理

1. 异常的定义

异常:错误信息影响程序的正常执行

不同的异常被定义为不同的对象,对应不同的错误

异常名称 描述
Exception 常规异常的基类
ZeroDivisionError 除数为零
IOError 输入/输出操作失败
IndexError 序列中没有此索引
KeyError 映射中没有这个键
NameError 未声明/初始化对象

异常会立即终止程序的执行,无法实现原定功能。

如果在异常发生时,能及时捕获并作出处理,就能控制异常,纠正错误,保证程序顺利执行

2. 异常的处理

1. 方式一

Python语言提供了try子句来进行异常的捕获与处理

语法格式:

try:	语句except 异常名称:	捕获异常时处理else:	未发生异常时处理

程序执行时,如果try子句中发生了指定的异常,则执行except子句部分进行异常的处理,如果try子句执行没有发生异常则执行else子句部分

try-except代码块的作用就是当try代码块中的程序代码运行没有错误,则跳过except代码块;反之如果try代码块中的程序代码运行出现错误,则运行except代码块中的内容,一般except代码块中的内容都是输出错误信息。

如果except代码块后面还有其他代码,程序将继续运行,因为 Python 已经在程序报错后执行了except代码块中的内容,告诉了错误信息,所以可以继续运行程序。

2. 方式二

通过raise显式抛出异常信息

Python 的raise显式抛出自己的包含特定信息的异常。一旦执行了raise语句,raise之后的语句将不能执行。

def read_C():    try:       	C = float(sys.argv[1])    except ValueError:        raise ValueError('Degrees must be number, not "%s"' % sys.argv[1])    if C < -273.15:        raise ValueError('C=%g is a non-physical value!' % C)    return C在raise关键字之后抛出一个ValueError类型的异常信息,并在后面的参数中定义具体的异常信息。

3. 方式三

try…except…finally…

在这里插入图片描述

try:    num = "1" + 1     # 会发生TypeError错误    print(num)except TypeError:     # 只有发生TypeError时才运行except子句    print("发生TypeError错误")finally:    print("执行finally子句")try:    num = 10 * 1     # 不会发生TypeError错误    print(num)except TypeError:    print("发生TypeError错误")finally:    print("执行finally子句")结果;发生TypeError错误执行finally子句10执行finally子句

3. 多异常处理

try:    执行语句except IOError:    print("发生了输入/输出异常")except KeyError:    print("发生了键访问异常")except SyntaxError:    print("发生了 Python 语法异常")
# 如果执行语句发生了两个异常类型中的一个,则运行except子句try:    执行语句except (IOError,KeyError):    print("发生了IOError或者KeyError异常")

4. 注意事项

异常处理不能消灭异常,但是却可以让原本不可控的异常及时被发现,并按照设计好的方式被处理

异常处理让程序不会被意外的终止,而是按照设计以不同的方式结束运行。

except后的异常类型至关重要,需要根据try子句具体操作进行恰当选择。

转载地址:http://emxzi.baihongyu.com/

你可能感兴趣的文章
二叉树基础知识大全(核心理解遍历)
查看>>
03-树1 树的同构(25 分) 2017秋 数据结构 陈越、何钦铭
查看>>
04-树4 是否同一棵二叉搜索树(25 分)---陈越、何钦铭-数据结构-2017秋
查看>>
表达式求值(C实现,实现多括号,浮点数)---栈的实现以及运用。
查看>>
有序链表的合并(数据结构---单链表)
查看>>
栈实现(数据结构---数组,链表 C实现)
查看>>
POJ3903(dp,最长上升子序列,最基础题)
查看>>
POJ1836-Alignment(最长上升子序列)
查看>>
POJ 1251 Jungle Roads(最小生成树简单题)
查看>>
HDU 1690---Bus System(Floyd模板题+合理定义INF)
查看>>
POJ 2240---Arbitrage(Floyd的dp思想)
查看>>
Dijkstra算法---模板
查看>>
POJ 3680(费用流)
查看>>
校oj10532: 生成字符串(dp,最优状态转移)
查看>>
平衡二叉树(AVL树)
查看>>
POJ1521---哈夫曼编码,求最优WPL
查看>>
POJ---2010(Moo University - Financial Aid,优先队列)
查看>>
POJ---3662(Telephone Lines,最短路+二分*好题)
查看>>
L2-007. 家庭房产(并查集)
查看>>
L2-016. 愿天下有情人都是失散多年的兄妹(搜索)
查看>>