Python基础之 文件和数据格式化

  一、文件的使用

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

  文件的存储形式:二进制

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

  文本文件:由单一特定编码(如UTF-8编码)组成,可以被看成是长字符串。如.txt文件、.py文件

  二进制文件:无统一的字符编码,直接由0/1组成。如.png文件、.avi文件

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

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

  

 

  图1-1

  文件打开:

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

  文件路径和名称:

  绝对路径 "E:/Python_Module/f.txt" 或 "E:\\Python_Module\\f.txt"(斜杠和反斜杠的区别)

  相对路径 "./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 读文件方法

  方法说明

  .read(size=-1)默认读入文件 a 的全部内容,形成一个长字符串

  若 size 给定,则读入前 size 长度的信息

  .readline(size=-1)默认读入文件操作指针指向的那一行内容,形成一个字符串

  若 size 给定,则读入该行前 size 长度的信息

  .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 写文件方法

  方法说明

  .write(s)向文件 a 中写入一个字符串 s 或字节流 s

  .writelines(ls)将列表 ls 的元素直接拼接并写入文件 a ,列表 ls 的元素要全是字符串

  .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:枣庄人流医院哪个好 http://mobile.3635555.cn/

  # 使用.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源代码目录下。

  总结:

  自动化思维:数据与功能分离,数据驱动的自动运行

  接口化设计:格式化设计接口,清晰明了

  二维数据应用:应用维度组织数据,二维数据最常用

  接口的扩展:增加更多的接口;功能扩展:增加弧形绘制;需求扩展:自动绘制动画

posted @ 2021-03-02 15:51  网管布吉岛  阅读(482)  评论(0编辑  收藏  举报