Python初学14——文件和数据格式化

目录

一、文件的使用

1.1 文件的类型(文本、二进制)

1.2 文件的打开和关闭( open()、.close() )

1.3 文件内容的读取

1.3.1 读文件方法( .read()、.readline()、.readlines() )

1.3.2 文件的全文本操作(全读统一处理、按数量读逐一处理)

1.3.3 文件的逐行操作(全读分行处理、分行读分行处理)

1.4 数据的文件写入( .write()、.writelines()、.seek() )

二、一维数据的格式化和处理

2.1 一维数据的表示(有序列表、无序集合)

2.2 一维数据的存储(空格、逗号、其他)

2.3 一维数据的处理(读、写)

三、二维数据的格式化和处理

3.1 二维数据的表示(二维列表)

3.2 CSV数据存储格式

3.3 二维数据的存储(行列)

3.4 二维数据的处理(读、写、遍历)

四、“自动轨迹绘制”实例

4.1 自定义数据文件格式(文件与程序之间的接口)

4.2 编写程序,根据文件接口解析参数绘制图形

4.3 编写数据文件


回顾:字符串格式化——将字符串按照一定的规格和样式进行规范。字符串格式化参考“Python初学4”第五章。

一、文件的使用

1.1 文件的类型(文本、二进制)

文件的存储形式:二进制

文件的展示方式:文本文件、二进制文件

  • 文本文件:由单一特定编码(如UTF-8编码)组成,可以被看成是长字符串。如.txt文件、.py文件
  • 二进制文件:无统一的字符编码,直接由0/1组成。如.png文件、.avi文件

1.2 文件的打开和关闭( open()、.close() )

文件处理三步走:打开 -> 处理 -> 关闭

图1-1

文件打开:

<变量名> = open(<文件路径和名称>, <打开模式>)

  • 文件路径和名称:
  1. 绝对路径 "E:/Python_Module/f.txt" 或 "E:\\Python_Module\\f.txt"(斜杠和反斜杠的区别)
  2. 相对路径 "./Python_Module/f.txt" 或 "f.txt"(前者的 ./ 表示当前目录下,后者意为 f.txt 与 python 源文件同目录)
  • 打开模式:
表1-1 文件打开模式
文件打开模式说明
' r '

只读模式(默认打开模式)

若文件不存在,返回FileNotFoundError

' w '

覆盖写模式

若文件存在,则完全覆盖原文件内容

若文件不存在,则创建文件

' x '

创建模式

若文件存在,返回FileExistsError

若文件不存在,则创建文件

' a '

追加写模式

若文件存在,则在文件最后追加写入内容

若文件不存在,则创建文件

' b '二进制方式读取文件模式
' t '文本方式读取文件模式(默认模式)
' + '与 r/w/x/a 一同使用,在原功能上增加读功能

文件关闭:

<变量名>.close()

注:若程序中只打开文件而没有关闭文件,那么文件将一直处于打开状态,当程序正常退出时,python解释器自动将文件关闭。

1.3 文件内容的读取

1.3.1 读文件方法( .read()、.readline()、.readlines() 

表1-2 读文件方法
方法说明
<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() )

表1-3 写文件方法
方法说明
<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为扩展名
  • 每行一个一维数据,一维数据内部用英文逗号分隔;文件无空行
  1. 如果某个元素缺失,逗号仍要保留
  2. 二维数据表头可以作为数据存储,也可以另行存储
  3. 逗号与数据之间无额外空格
  • 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源代码目录下。

图4-1

总结:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

觅道無涯-千知

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值