7.1文件的使用
7.1.1文件的类型
- 文件时数据的抽象和集合
——文件是存储在辅助存储器上的数据序列
——文件是数据存储的一种形式
——文件展现形态:文本文件和二进制文件
- 文本文件 vs 二进制文件
——文本文件和二进制文件只是文件的展示方式
——本质上,所有文件都是二进制形式存储
——形式上,所有文件采用两种方式展示
- 什么是文本文件?
—— 由单一特定编码组成的文件,如UTF-8编码是文本文件
——由于存在编码,也被看成是存储着的长字符串
——适用于例如:.txt文件,.py文件
- 什么是二进制文件?
——直接由比特0和1组成,没有统一字符编码
——一般存在二进制0和1的组织结构,即文件格式
——适用于:例如.png文件、.avi文件
- 所有文件都以二进制存储,有统一编码的称为文本文件,任何文件都能以二进制形式打开
- 文本形式打开文件代码
首先要在Python的文件存储下建f.txt文件并输入内容保存。
tf = open("f.txt", "rt", encoding="utf-8")
print(tf.readline())
tf.close()
bf = open("f.txt", "rb")
print(bf.readline())
bf.close()
7.1.2文件的打开和关闭
- 文件处理的步骤:打开-操作-关闭
文件的存储状态—a.open(,)—>文件的占用状态;
文件的占用状态—a.close()—>文件的存储状态;
- Python提供了三个常用的读文件函数:a.read(size)、a.readline(size)、a.readlines(hint)
————三个常用的写文件函数:a.write(size)、a.writelines(lines)、a.seek(offset)
- 文件的打开
<变量名> = open(<文件名>, <打开模式>)
文件名:文件路径和名称,源文件同目录可省略路径,打开模式:文本or二进制(读 or 写)。
文件路径四种方式:绝对路径下:D:\PYE\f.txt 需要写成"D:/PYE/f.txt" 或“D:\PYE\f.txt”
————————相对路径:与当前程序间的相对路径"./PYE/f.txt",从可执行程序的当前目录起,找PYE目录,程序与文件在相同目录里时,可以直接写成文件名称"f.txt"
- 文件的打开模式
文件打开模式 |
描述 |
‘r’ |
只读模式,默认值,如果文件不存在,fanhuiFileNotFoundError |
‘w’ |
覆盖写模式,文件不存在则创建,存在则完全覆盖 |
‘x’ |
创建写文件,文件不存在则创建,存在则返回FileExistsError |
‘a’ |
追加写模式,文件不存在则创建,存在则在文件最后追加内容 |
‘b’ |
二进制文件模式 |
‘t’ |
文本文件模式,默认值 |
‘+’ |
与r/w/x/a一同使用,在原功能基础上增加同时读写功能 |
f = open("f.txt")
f = open("f.txt","rt")
f = open("f.txt", "w")
f = open("f.txt", "a+")
f = open("f.txt", "x")
f = open("f.txt", "b")
f = open("f.txt", "wb")
<变量名>.close()
7.1.3文件内容的读取
操作方法 |
描述 |
< f >.read(size = -1) |
读入全部内容,如果给出参数,读入前size长度。如s = f.read(2), 中国 |
< f >.readline(size = -1) |
读入一行内容,如果给出参数,读该行前size长度。s = f.readline() 中国是一个伟大的国家 |
< f >.readlines(hint = -1) |
读入文件所有行,以每行为元素形成列表,如果给出参数,读入前hint行。s = f.readlines(),结果为[‘中国是个伟大的国家!’] |
- 遍历全文本——方法1——一次读入,统一处理
fname = input("请输入要打开的文件名称")
fo = open(fname, "r")
txt = fo.read()
fo.close()
弊端:文本文件体量特别大时,一次性读入代价很大。
2. **遍历全文本:**方法2——**按数量读入,逐步处理,**适用于较大的文件
fname = input("请输入要打开的文件名称")
fo = open(fname, "r")
while txt != "":
txt = fo.read(2)
fd.close()
- 遍历全文本:逐行遍历方法1——适用分行存储的文件。一次读入,分行处理
fname = input("请输入要打开的文件名称")
fo = open(fname, "r")
for line in fo.readlines():
print(line)
fo.close()
- 逐行遍历文件:方法二
fname = input("请输入要打开的文件名称")
fo = open(fname, "r")
for line in fo:
print(line)
fo.close()
7.1.4数据的文件写入
- 操作方法
操作方法 |
描述 |
< f >.write(s) |
向文件写入一个字符串或字节流。f.write(“中国是一个伟大的国家!”) |
< f >.writelines(lines) |
将一个元素全为字符串的列表写入文件,将各元素拼接后写入,无空格和换行ls = [“中国”,“法国”,“美国”],f.writelines(ls) |
< f >.seek(offset) |
改变当前文件操作指针的位置,offset含义如下:0-文件开头;1-当前位置,2-文件结尾。f.seek(0) #回到文件开头 |
fo = open("output.txt", "w+")
ls = ["中国", "法国", "美国"]
fo.writelines(ls)
fo.seek(0)
for line in fo:
print(line)
fo.close()
7.2实例:自动轨迹绘制
- 问题分析:
——需求:根据脚本来绘制图形
——不是写代码而是写数据绘制轨迹
——数据脚本是自动化最重要的第一步
需求:读取文件——解析数据——绘制图形
- 基本思路:
——步骤1:定义数据文件格式(接口)
——步骤2:编写程序,根据文件接口解析参数绘制图形
——步骤3:编制数据文件
数据接口:300,1,144,0,1,0 其中300指行进距离,1为转向判断,0:左转,1:右转;144指转向角度,后三个参数为RGB三个通道颜色,0——1之间的浮点数
程序:
import turtle as t
t.title("自动轨迹绘制")
t.setup(800, 600, 0 , 0)
t.pencolor("red")
t.pensize(5)
datals = []
f = open("data.txt")
for line in f:
line = line.replace("\n", "")
datals.append(list(map(eval, line.split(","))))
f.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.right(datals[i][2])
else:
t.left(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
- 理解方法思维
——自动化思维:数据和功能分离,数据驱动的自动运行
——接口化设计:格式化设计接口,清晰明了
——二维数据应用:应用维度组织数据,二维数据最常用
- 应用问题扩展
——扩展接口设计,增加更多控制接口
——扩展功能设计,增加弧形等更多功能
——扩展应用需求,发展自动轨迹绘制到动画绘制
7.3一维数据的格式化和处理
7.3.1数据组织的维度
- 一维数据:**由对等关系的有序或无序数据构成,采用线性方式组织。**例如传统python中的列表、数组和集合等概念
- 二维数据:由多个一维数据构成,是一维数据的组合形式。
——表格是典型的二维数据
——其中,表头是二维数据的一部分
- 多维数据:由一维或二维数据在新维度上扩展形成
- 高维数据:仅利用最基本的二元关系展开数据间的复杂结构,键值对
- 数据的操作周期
存储<——>表示<——>操作
数据存储指数据在磁盘中的存储状态,在数据存储中,我们关心的是数据的存储格式
数据表示指程序表达数据的方式,数据表示中,关心的是数据类型
7.3.2一维数据的表示和存储
- 如果数据间有序:使用列表类型
——列表类型可以表达一维有序数据
——for 循环可以遍历数据,进而对每个数据进行处理
- 如果数据间无序:使用集合类型
——集合类型可以表达一维无序数据
——for循环可以遍历数据,进而对每个数据进行处理
- 一维数据的存储
——存储方式一:空格分隔,不换行;缺点:数据中不能存在空格,否则无法区分空格是数据之间还是数据内部
——存储方式二:逗号分隔,不换行,缺点:数据中不能存在逗号,原因同上
——其他存储方式:特殊符号分隔,缺点:根据定义选择不会出现的特殊符号,通用性差
7.3.3一维数据的处理
- 一维数据的读操作
>>> txt = open("a.txt",encoding="utf-8").read()
>>> ls = txt.split()
>>> ls
- 一维数据的写入操作
>>> ls = ['中国', '美国', '日本']
>>> ls
['中国', '美国', '日本']
>>> f = open("f.txt",'w',encoding="utf-8")
>>> f.write(' '.join(ls))
8
>>> f.close()