07. 文件和数据格式化

文件的使用

文件是数据的抽象和集合

  • 文件是存储在辅助存储器上的数据序列
  • 文件是数据存储的一种形式
  • 文件展现形态:文本文件和二进制文件

文本文件 vs. 二进制文件

  • 文件文件和二进制文件只是文件的展示方式
  • 本质上,所有文件都是二进制形式存储
  • 形式上,所有文件采用两种方式展示

文本文件

文件是数据的抽象和集合

  • 由单一特定编码组成的文件,如 UTF-8 编码
  • 由于存在编码,也被看成是存储着的长字符串
  • 适用于例如:.txt 文件、.py 文件等

二进制文件

文件是数据的抽象和集合

  • 直接由比特 0 和 1 组成,没有统一字符编码
  • 一般存在二进制 0 和 1 的组织结构,即文件格式
  • 适用于例如:.png 文件、.mp4 文件等

文件的打开: open(<fileName>, <mode>)
fileName的几种取值:

1
2
3
4
"D:/PYE/f.txt"
"D:\\PYE\\f.txt"
"f.txt"
"./PYE/f.txt"
文件的打开模式 描述
‘r’ 只读模式,默认值,如果文件不存在,返回FileNotFoundError
‘w’ 覆盖写模式,文件不存在则创建,存在则完全覆盖
‘x’ 创建写模式,文件不存在则创建,存在则返回FileExistsError
‘a’ 追加写模式,文件不存在则创建,存在则在文件最后追加内容
‘b’ 二进制文件模式
‘t’ 文本文件模式(默认值)
‘+’ 与 r/w/x/a 一同使用,在原功能基础上增加同时读写功能

文件的关闭:<变量名>.close()
文件的读取:

1
2
3
4
5
6
7
8
9
10
# 读入全部内容,如果给出参数,读入前size长度
<f>.read(size=-1)

# 读入一行内容,如果给出参数,读入该行前size长度
<f>.readline(size=-1)

<f>.readlines(hint=-1)
# 读入文件所有行,以每行为元素形成**列表**
如果给出参数,读入前hint行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 文件的全文本操作
## 遍历全文本:方法一(对全文txt进行处理)
print('方法一:')
file = open("data.txt")
txt = file.read()
file.close()

# 按数量读入,逐步处理
print('方法二:')
file = open("data.txt")
txt = file.read(128)
while txt != "":
txt = file.read(128)
file.close()

# 一次读入,分行处理
print('方法三:')
file = open("data.txt")
for line in file.readlines():
print(line)
file.close()

# 分行读入,逐行处理
print('方法四:')
file = open("data.txt")
for line in file:
print(line)
file.close()

文件的数据写入:

1
2
3
4
5
# 向文件写入一个字符串或字节流
<f>.write(s)

# 将一个元素全为字符串的列表写入文件
<f>.writelines(lines)
1
2
# 改变当前文件操作指针的位置,offset含义如下:0 – 文件开头; 1 – 当前位置; 2 – 文件结尾
<f>.seek(offset)
1
2
3
4
5
6
7
fo = open("output.txt","w+")
ls = ["China", "France", "German"]
fo.writelines(ls)
fo.seek(0)
for line in fo:
print(line)
fo.close()

2 实例 11: 自动轨迹绘制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#AutoTraceDraw.py
import turtle as t
t.title('自动轨迹绘制')
t.setup(800, 600)
t.pencolor("red")
t.pensize(5)
#数据读取
datals = []
f = open("data.txt")
for line in f:
line = line.replace("\n","")
# map将第一个元素作用于第二个元素
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.rt(datals[i][2])
else:
t.lt(datals[i][2])

3 一维数据的格式化和处理

一维数据

  • 由对等关系的有序或无序数据构成,采用线性方式组织
  • 对应列表、数组和集合等概念

二维数据

由多个一维数据构成,是一维数据的组合形式
表格是典型的二维数据。其中,表头是二维数据的一部分

多维数据

由一维或二维数据在新维度上扩展形成

高维数据

仅利用最基本的二元关系展示数据间的复杂结构

数据的操作周期

一维数据的表示

  • 如果数据间有序:使用列表类型
  • 如果数据间无序:使用集合类型

一维数据的存储
空格、逗号等其他分隔

1
2
3
4
5
6
7
8
9
10
# 一维数据的写入处理
ls = ['中国', '土耳其', '瑞典']
file = open("data.txt", "w")
file.write(",".join((ls)))
file.close()

# 从逗号分隔的文件中读入数据
file = open("data.txt")
ls = file.read().split(',')
print(ls)

4 二维数据的格式化和处理

二维数据的表示

列表类型可以表达二维数据

  • 使用两层for循环遍历每个元素
  • 外层列表中每个元素可以对应一行,也可以对应一列

CSV数据存储格式

CSV: Comma-Separated Values

  • 国际通用的一二维数据存储格式,一般.csv扩展名

  • 每行一个一维数据,采用逗号分隔,无空行

  • Excel软件可读入输出,一般编辑软件都可以产生

  • 如果某个元素缺失,逗号仍要保留

  • 二维数据的表头可以作为数据存储,也可以另行存储

  • 逗号为英文半角逗号,逗号与数据之间无额外空格

按行存?按列存?

  • 按行存或者按列存都可以,具体由程序决定
  • 一般索引习惯:ls[row][column],先行后列
  • 根据一般习惯,外层列表每个元素是一行,按行存
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 从CSV格式的文件中读入数据
fo = open(fname)
ls = []
for line in fo:
# 去掉`\n` 以及 分割符号的操作
line = line.replace("\n","")
ls.append(line.split(","))
fo.close()

# 将数据写入CSV格式的文件
ls = [[], [], []] #二维列表
f = open(fname, 'w')
for item in ls:
# 加入分割符号的操作 和 添加'\n'的操作
f.write(','.join(item) + '\n')
f.close()

5 模块6: wordcloud库的使用

6 实例12: 政府工作报告词云

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#GovRptWordCloudv1.py
import jieba
import wordcloud
f = open("新时代中国特色社会主义.txt", "r", encoding="utf-8")

t = f.read()
f.close()
ls = jieba.lcut(t)

txt = " ".join(ls)
w = wordcloud.WordCloud( \
width = 1000, height = 700,\
background_color = "white",
font_path = "msyh.ttc"
)
w.generate(txt)
w.to_file("grwordcloud.png")