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
# 读入全部内容,如果给出参数,读入前 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()

插播: with 关键字

with 语句用于封装代码块的执行,由**上下文管理器(Context Manager)**控制进入和退出时的行为。

关键保证:无论代码块正常结束还是异常抛出,退出时的清理操作必定执行。

语法形式

1
2
with expression as target:
statement_block

示例

1
2
3
4
# 多上下文
with open('a.txt') as f1, open('b.txt') as f2:
# 多个资源同时管理
data = f1.read() + f2.read()

一维数据的格式化和处理

一维数据

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

二维数据

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

多维数据

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

高维数据

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

数据的操作周期

一维数据的表示

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

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

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)

二维数据的格式化和处理

二维数据的表示

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

  • 使用两层 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()

使用 csv 库进行读写

如果要使用,需要先导入:import csv

  • 两种主要对象:
    • csv.reader —— 读取 CSV → 返回行迭代器(每行是列表)
    • csv.writer —— 写入 CSV → 接收可迭代数据

基础写入

1
2
3
4
5
6
7
8
import csv

data = [['name', 'age'], ['Tom', 18], ['Jerry', 20]]

# 必须加 newline='',否则 Windows 会多写空行!
with open('output.csv', 'w', encoding='utf-8', newline='') as f:
writer = csv.writer(f)
writer.writerows(data) # 一次性写多行。若写入单行,请使用 writerow(row)

从字典写入

1
2
3
4
5
6
7
8
9
10
11
fieldnames = ['name', 'age']
rows = [
{'name': 'Tom', 'age': 18},
{'name': 'Jerry', 'age': 20}
]

# 必须加 newline='',否则 Windows 会多写空行!
with open('data.csv', 'w', encoding='utf-8', newline='') as f:
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader() # 写表头
writer.writerows(rows) # 写数据行

基础读取

1
2
3
4
5
6
import csv

with open('data.csv', 'r', encoding='utf-8') as f:
reader = csv.reader(f)
for row in reader: # row 是列表 ['col1', 'col2', ...]
print(row)

模块 wordcloud 库使用案例

政府工作报告词云

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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")