目录
1.2 文件的打开和关闭( open()、.close() )
1.3.1 读文件方法( .read()、.readline()、.readlines() )
1.3.2 文件的全文本操作(全读统一处理、按数量读逐一处理)
1.4 数据的文件写入( .write()、.writelines()、.seek() )
回顾:字符串格式化——将字符串按照一定的规格和样式进行规范。字符串格式化参考“Python初学4”第五章。
一、文件的使用
1.1 文件的类型(文本、二进制)
文件的存储形式:二进制
文件的展示方式:文本文件、二进制文件
- 文本文件:由单一特定编码(如UTF-8编码)组成,可以被看成是长字符串。如.txt文件、.py文件
- 二进制文件:无统一的字符编码,直接由0/1组成。如.png文件、.avi文件
1.2 文件的打开和关闭( open()、.close() )
文件处理三步走:打开 -> 处理 -> 关闭

文件打开:
<变量名> = open(<文件路径和名称>, <打开模式>)
- 文件路径和名称:
- 绝对路径 "E:/Python_Module/f.txt" 或 "E:\\Python_Module\\f.txt"(斜杠和反斜杠的区别)
- 相对路径 "./Python_Module/f.txt" 或 "f.txt"(前者的 ./ 表示当前目录下,后者意为 f.txt 与 python 源文件同目录)
- 打开模式:
文件打开模式 | 说明 |
---|---|
' r ' | 只读模式(默认打开模式) 若文件不存在,返回FileNotFoundError |
' w ' | 覆盖写模式 若文件存在,则完全覆盖原文件内容 若文件不存在,则创建文件 |
' x ' | 创建模式 若文件存在,返回FileExistsError 若文件不存在,则创建文件 |
' a ' | 追加写模式 若文件存在,则在文件最后追加写入内容 若文件不存在,则创建文件 |
' b ' | 二进制方式读取文件模式 |
' t ' | 文本方式读取文件模式(默认模式) |
' + ' | 与 r/w/x/a 一同使用,在原功能上增加读功能 |
文件关闭:
<变量名>.close()
注:若程序中只打开文件而没有关闭文件,那么文件将一直处于打开状态,当程序正常退出时,python解释器自动将文件关闭。
1.3 文件内容的读取
1.3.1 读文件方法( .read()、.readline()、.readlines() )
方法 | 说明 |
---|---|
<a>.read(size=-1) | 默认读入文件 a 的全部内容,形成一个长字符串 若 size 给定,则读入前 size 长度的信息 |
<a>.readline(size=-1) | 默认读入文件操作指针指向的那一行内容,形成一个字符串 若 size 给定,则读入该行前 size 长度的信息 |
<a>.readlines(hint=-1) | 默认读入文件 a 的所有行内容,并以每行为元素形成列表 若 hint 给定,则读入前 hint 行的信息 |
1.3.2 文件的全文本操作(全读统一处理、按数量读逐一处理)
1. 法一:
- 优点:一次读入,统一处理
- 缺点:文件太大则耗费时间和内存
fname = input("请输入要打开文件的绝对路径:\n\r")
fo = open(fname, 'rt') # 只读、文本形式
txt = fo.read()
# 对全文txt进行处理
fo.close()
2. 法二:
- 优点:按数量读入,逐步处理
fname = input("请输入要打开文件的绝对路径:\n\r")
fo = open(fname, 'rt') # 只读、文本形式
txt = fo.read(2)
while txt != "":
# 对2个字符txt进行处理
txt = fo.read(2)
fo.close()
1.3.3 文件的逐行操作(全读分行处理、分行读分行处理)
1. 法一:
- 优点:一次读入,逐行处理
- 缺点:文件太大则耗费时间和内存
fname = input("请输入要打开文件的绝对路径:\n\r")
fo = open(fname, 'rt') # 只读、文本形式
for line in fo.readlines():
# 对一行txt进行处理
fo.close()
2. 法二:
- 优点:分行读入,逐行处理
fname = input("请输入要打开文件的绝对路径:\n\r")
fo = open(fname, 'rt') # 只读、文本形式
for line in fo: # 从 文件操作指针指向的当前位置 到 文件结尾 遍历行
# 对一行txt进行处理
fo.close()
1.4 数据的文件写入( .write()、.writelines()、.seek() )
方法 | 说明 |
---|---|
<a>.write(s) | 向文件 a 中写入一个字符串 s 或字节流 s |
<a>.writelines(ls) | 将列表 ls 的元素直接拼接并写入文件 a ,列表 ls 的元素要全是字符串 |
<a>.seek(offset) | 改变当前文件操作指针的位置,offset含义: 0:指向文件开头 1:指向当前位置 2:指向文件结尾 |
二、一维数据的格式化和处理
一维数据间关系对等,线性方式组织。对应列表、数组、集合概念。
2.1 一维数据的表示(有序列表、无序集合)
- 若数据间有序,使用列表类型表示,for 循环遍历每一个数据
- 若数据间无序,使用集合类型表示,for 循环遍历每一个数据
2.2 一维数据的存储(空格、逗号、其他)
- 空格分隔:使用一个或多个空格分隔数据进行存储,不换行。缺点是数据中不能有空格。
- 英文逗号:使用英文逗号分隔数据进行存储,不换行。缺点是数据中不能有英文逗号。
- 其他方式:使用符号或符号组合分隔数据进行存储,建议采用特殊符号,避免使用数据中有的符号。缺点是与数据特点有关,通用性差。
2.3 一维数据的处理(读、写)
- 打开文件,读取一维数据
# 打开并读取一维数据为字符串
txt = open(fname).read()
# 以字符串中的空格为间隔,分隔出各个元素并返回列表类型
ls1 = txt.split()
'''
# 以字符串中的英文逗号为间隔,分隔出各个元素并返回列表类型
ls2 = txt.split(",")
# 以字符串中的特殊符号$为间隔,分隔出各个元素并返回列表类型
ls3 = txt.split("$")
'''
f.close()
- 写入一维数据到文件
ls = ['中国', '美国', '法国', '俄罗斯']
# 以覆盖写模式打开文件
f = open(fname, 'w')
# 使用.join方法在ls的每一个元素(最后一个元素除外)后面添加一个空格
f.wirte(' '.join(ls))
'''
# 使用.join方法在ls的每一个元素(最后一个元素除外)后面添加一个英文逗号
f.wirte(','.join(ls))
# 使用.join方法在ls的每一个元素(最后一个元素除外)后面添加一个特殊字符$
f.wirte('$'.join(ls))
'''
f.close()
三、二维数据的格式化和处理
由多个一维数据构成,对应表格等概念(表头是二维数据的一部分)。
3.1 二维数据的表示(二维列表)
使用二维列表类型表达二维数据。如:[ [1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12] ] 。
for 循环遍历列表中每一个元素,再一次 for 循环遍历元素中的每一个数据。(外层列表中每一个元素可以对应一行,也可以对应一列)
3.2 CSV数据存储格式
- CSV(Comma-Separated Values),是用英文逗号分隔值的一种方式,一般以.csv为扩展名
- 每行一个一维数据,一维数据内部用英文逗号分隔;文件无空行
- 如果某个元素缺失,逗号仍要保留
- 二维数据表头可以作为数据存储,也可以另行存储
- 逗号与数据之间无额外空格
- Excel和一般编辑软件都可以读入或另存为csv文件
3.3 二维数据的存储(行列)
- 可以按行存,也可以按列存
- 一般索引习惯:ls[row][column],先索引行再索引列
3.4 二维数据的处理(读、写、遍历)
- 打开文件,读取二维数据
fo = open(fname)
# 创建二维数据空列表
ls = []
# 以字符串形式遍历每一行(每一行 = 一个一维数据)
for line in fo:
# 将字符串最后的换行转义符去掉
line = line.replace("\n","")
# 以字符串中的逗号为分隔划分成一个列表,再将列表加到ls中
ls.append(line.split(","))
fo.colse()
- 写入二维数据到文件
ls = [[], [], [], []]
# 以覆盖写模式打开文件
f = open(fname, 'w')
# 遍历每一个一维数据
for item in ls:
# 使用.join方法在ls的每一个元素(最后一个元素除外)后面添加一个英文逗号,并在最后加入换行转义符
f.write(','.join(item) + '\n')
f.close()
- 遍历二维数据
ls = [[1, 2], [3, 4], [5, 6]]
# 二层循环
for row in ls:
for column in row:
print('{}, '.format(column))
print('\n\r')
# 索引循环
for i in range(len(ls)):
print('{}, {}'.format(ls[i][0], ls[i][1]))
print('\n\r')
四、“自动轨迹绘制”实例
需求:根据脚本绘制图形
思路:1. 自定义数据文件格式(文件与程序之间的接口)
2. 编写程序,根据文件接口解析参数绘制图形
3. 编写数据文件
4.1 自定义数据文件格式(文件与程序之间的接口)
自定义:<海龟行进距离>,<转向判断(0左1右)>,<转向的绝对角度>,<红色通道(0~1浮点数)>,<蓝色通道(0~1浮点数)>,<绿色通道(0~1浮点数)>
例如:300,0,144,1,0,0 或 300,1,144,0,1,0
4.2 编写程序,根据文件接口解析参数绘制图形
import turtle
# 生成绘画环境
turtle.title("自动轨迹绘制")
turtle.setup(800,600,0,0)
turtle.pencolor("red")
turtle.pensize(5)
# 读取数据
txt = open("data.txt")
datas = [] # 准备一个空列表
for line in txt: # 以字符串形式获得文件的每一行
# 将一行结尾处的换行符去掉
line = line.replace("\n", "")
# 根据英文逗号分隔字符串->
# map()将eval()作用于每个元素上,去掉每个数据两侧的引号->
# 形成一个列表拼接到列表datas中
datas.append(list(map(eval, line.split(","))))
txt.close()
# 自动绘制
for i in range(len(datas)):
turtle.pencolor(datas[i][3], datas[i][4], datas[i][5]) # 颜色设置
turtle.right(datas[i][2]) if datas[i][1] else turtle.left(datas[i][2]) # 角度设置
turtle.forward(datas[i][0]) # 前进控制
turtle.hideturtle()
turtle.done()
4.3 编写数据文件
300,0,72,0,0,0
300,1,144,0,0,1
300,1,144,0,1,0
300,1,144,0,1,1
300,1,144,1,0,0
185.41,1,108,1,0,1
185.41,1,72,1,0.5,0.5
185.41,1,72,0.9,0.5,0.9
185.41,1,72,0.1,0.5,0.9
185.41,1,72,0.9,0.5,0.1
文件保存为.txt格式,存放于python源代码目录下。

总结:
- 自动化思维:数据与功能分离,数据驱动的自动运行
- 接口化设计:格式化设计接口,清晰明了
- 二维数据应用:应用维度组织数据,二维数据最常用
- 接口的扩展:增加更多的接口;功能扩展:增加弧形绘制;需求扩展:自动绘制动画