文章目录
- 一. 文件的基础知识
- 1. 文件与文件类型
- (1). 定义
- (2). 文件名的组成
- (3). 文件类型
- 2. 目录与文件路径
- (1). 目录
- (2). 路径表示
- 1. 绝对路径
- 2. 相对路径
- 二. 文件的操作
- 1. 文件的打开和关闭
- (1). 文件的打开
- 1. 定义
- 2. 语法格式一
- 3. 语法格式二
- (2). 文件的关闭
- 1. 定义
- 2. 语法格式
- 2. 文件内容的读取
- (1). 用文件对象的read()方法读文件
- 1. 定义
- 2. 语法
- 3. 举例
- (2). 用文件对象的readline()方法读文件
- 1. 定义
- 2. 语法
- 3. 注意事项
- (3). 用文件对象的readlines()方法读文件
- 1. 定义
- 2. 语法
- 3. 注意事项
- (4). 逐行读取
- 1. 定义
- 2. 举例
- (5). 语法总结
- (6). 文件的操作举例
- 1. 遍历全文本:方式一
- 2. 遍历全文本:方式二
- 3. 逐行遍历文件:方法一
- 4. 逐行遍历文件:方法二
- 3. 数据的文件写入
- (1). 用文件对象的write()方法写文件
- 1. 定义
- 2. 语法
- 3. 注意事项
- (2). 用文件对象的writelines()方法写文件
- 1. 定义
- 2. 语法
- 3. 注意事项
- (3). 语法总结
- (4). 数据文件写入举例
- 三. 实例:自动轨迹绘制
- 1. 基本思路
- 2. 数据接口定义
- 3. 举例:
- 四. 一维数据的格式化和处理
- 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. 异常的定义
- 2. 异常的处理
- 1. 方式一
- 2. 方式二
- 3. 方式三
- 3. 多异常处理
- 4. 注意事项
一. 文件的基础知识
文件的使用可以大大简化代码并保证输入的正确性。而将文件用于输出时,其最大的优势在于可以将程序结构长期保存
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平台表示形式
- 需要使用字符串
但是在字符串中,\是转义序列符,所有为了还原反斜杠分隔符的含义,使用两个\
如:"E:\\学习\\Visual stdio code\\Python作业\\python的word作业\\CTF.py"
- 使用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,88
9999180102,91,85
9999180103,87,96
9999180104,70,68
9999180105,86,72
with open('score1.txt', 'r', encoding="utf-8") as file_object:
contents = file_object.read()
print(contents)
结果为:
学号,平时成绩,期末成绩
9999180101,77,88
9999180102,91,85
9999180103,87,96
9999180104,70,68
9999180105,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.py
import turtle as t
t.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.txt
300,0,144,1,0,0
300,0,144,0,1,0
300,0,144,0,0,1
300,0,144,1,1,0
300,0,108,0,1,1
184,0,72,1,0,1
184,0,72,0,0,0
184,0,72,0,0,0
184,0,72,0,0,0
184,1,72,1,0,1
184,1,72,0,0,0
184,1,72,0,0,0
184,1,72,0,0,0
184,1,72,0,0,0
184,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子句具体操作进行恰当选择。