1. 文件的基本操作
1.1 文件的类型
- 文本文件:采用统一字符编码(如 UTF-8、GBK),以字符为单位存储,可直接用文本编辑器查看。
- 二进制文件:没有统一的字符编码,以字节为单位存储(如图片、音频、视频、可执行文件等),需要特定程序解析。
1.2 文件的操作流程
标准流程:打开文件(open()) → 读/写操作 → 关闭文件(close())
1.2.1 打开文件 —— open() 函数
语法:
1
| <变量名> = open(<文件路径及文件名>, <打开模式>, encoding=<编码>)
|
encoding 参数仅在文本模式下有效,用于指定字符编码(如 "utf-8")。
打开模式详解:
| 模式 |
描述 |
'r' |
只读模式(默认)。文件必须存在,否则抛出 FileNotFoundError。 |
'w' |
覆盖写模式。文件不存在则创建,存在则完全覆盖原有内容(清空后写入)。 |
'x' |
创建写模式。文件不存在则创建,存在则抛出 FileExistsError(防止意外覆盖)。 |
'a' |
追加写模式。文件不存在则创建,存在则在文件末尾追加新内容。 |
'b' |
二进制模式,需与其他模式组合(如 'rb'、'wb')。 |
't' |
文本模式(默认),可省略。 |
'+' |
读写模式,与 r/w/x/a 结合,增加读写功能(如 'r+' 可读可写,文件必须存在)。 |
常用组合示例:
'r':只读文本,文件必须存在。
'r+':读写文本,文件必须存在,写入从文件开头覆盖(不会截断)。
'w':写入文本,覆盖原文件或新建。
'a+':追加读写,文件不存在则创建,写入追加到末尾,也可读取。
'rb':只读二进制(如图片)。
1.2.2 文件的读取方法
| 方法 |
说明 |
f.read(size) |
读取 size 个字符(文本模式)或字节(二进制模式)。不指定 size 则读取全部内容。 |
f.readline(size) |
读取一行(包括换行符 \n)。size 可选,表示最多读取该行前 size 个字符。 |
f.readlines(hint) |
读取所有行,返回字符串列表(每行作为一个元素)。hint 可选,表示读取大约 hint 行。 |
注意:read() 和 readlines() 会一次性将内容加载到内存,大文件建议逐行读取以节省内存。
1.2.3 文件的写入方法
| 方法 |
说明 |
f.write(s) |
将字符串(文本模式)或字节串(二进制模式)写入文件。返回写入的字符数/字节数。 |
f.writelines(lines) |
将字符串列表 lines 写入文件,不会自动添加换行符,需要手动在元素中包含 \n。 |
1.2.4 文件路径说明
- 同一级目录:直接写文件名,如
"内容.txt"。
- 绝对路径:如
"C:\\Users\\用户名\\Desktop\\code\\内容.txt"(Windows 注意转义),或使用原始字符串 r"C:\Users\用户名\Desktop\code\内容.txt",或用正斜杠 "C:/Users/用户名/Desktop/code/内容.txt"(Python 支持跨平台)。
- 相对路径:相对于当前工作目录,如
"a\\b\\内容.txt"。
1.2.5 文件指针移动 —— seek()
f.seek(offset, whence):移动文件指针到指定位置。
offset:偏移量(字节数)。
whence:起始位置,0 表示文件开头,1 表示当前位置,2 表示文件末尾。
- 文本模式下通常只支持
whence=0(从头开始偏移)。
- 示例:
1.2.6 读取示例
1 2 3 4 5 6 7 8 9 10 11 12 13
| f = open("内容.txt", "r", encoding="utf-8")
s = f.read() print(s)
f.seek(0) s1 = f.readline() print(s1)
f.close()
|
1.2.7 写入示例
1 2 3 4 5 6 7 8 9 10
| f = open("news.txt", "w", encoding="utf-8") f.write("静夜思\n") f.write("床前明月光,\n") f.write("举头望明月,\n") f.write("低头思故乡。\n")
ls = ["静夜思\n", "床前明月光,\n", "疑是地上霜。\n"] f.writelines(ls)
f.close()
|
最佳实践:使用 with 语句自动管理文件上下文,避免忘记关闭:
1 2 3
| with open("内容.txt", "r", encoding="utf-8") as f: data = f.read()
|
1.3 CSV 文件读写
1.3.1 CSV 文件是什么?
- 全称:逗号分隔值(Comma-Separated Values),纯文本文件。
- 一行是一条记录,逗号分隔字段。
- 字段内含逗号或换行时,需用引号括起来(csv 模块会自动处理)。
- 适合存储 一维数据(一行或一列)和 二维表格数据。
1.3.2 csv 模块读写二维数据
1. 读取 CSV 文件:csv.reader
1 2 3 4 5
| import csv with open('data.csv', 'r', encoding='utf-8', newline='') as f: reader = csv.reader(f) for row in reader: print(row)
|
2. 写入 CSV 文件:csv.writer
1 2 3 4 5 6 7 8 9
| data = [ ['姓名', '年龄', '城市'], ['张三', '20', '北京'], ['李四', '22', '上海'] ] with open('out.csv', 'w', encoding='utf-8', newline='') as f: writer = csv.writer(f) writer.writerows(data)
|
1.3.3 一维数据的 CSV 读写
一维数据(如列表 [1, 2, 3])在 CSV 中通常存为一行多列,或一列多行。
- 存为一行:
writer.writerow([1, 2, 3])
- 存为一列:每行一个元素
1 2 3 4 5
| data = [1, 2, 3] with open('1d.csv', 'w', newline='') as f: writer = csv.writer(f) for x in data: writer.writerow([x])
|
读取时,每行是一个单元素列表。
1.3.4 必会参数与函数总结
| 函数 / 参数 |
说明 |
csv.reader(f) |
创建 reader 对象,可迭代,每行返回 列表 |
csv.writer(f) |
创建 writer 对象,通过 writerow/writerows 写入 |
writer.writerow(列表) |
写入一行(参数为一维列表) |
writer.writerows(二维列表) |
写入多行(参数为二维列表) |
open() 中的 newline='' |
必须设置,否则写入时会出现多余空行 |
delimiter=',' |
指定分隔符,默认逗号,可改为其他符号 |
encoding='utf-8' |
推荐指定编码,避免中文乱码 |
1.3.5 易错点与考试陷阱
| 易错点 |
正确做法 |
忘记写 newline='' |
打开文件必须加上,否则写入会有多余空行 |
写一行却用 writerows,把一维列表当二维用 |
writerow([1,2,3]) 正确;若用 writerows([1,2,3]) 会把 1,2,3 当成三个列表,报错 |
| 读写编码不一致 |
读写都用 encoding='utf-8' 或对应编码 |
| reader 对象只能遍历一次 |
如需多次使用,先转为列表:rows = list(reader) |
用 split(',') 处理复杂 CSV 会出错 |
字段内含逗号时,使用 csv 模块才能正确解析 |
2. 常用第三方库
2.1 jieba 库 —— 中文分词
2.1.1 安装
2.1.2 常用方法
| 方法 |
说明 |
jieba.lcut(s) |
精确模式:返回一个列表,将句子最精确地切开,适合文本分析。 |
jieba.lcut(s, cut_all=True) |
全模式:返回一个列表,把句子中所有可以成词的词语都扫描出来,速度较快,但存在冗余。 |
jieba.lcut_for_search(s) |
搜索引擎模式:在精确模式基础上,对长词再次切分,提高召回率,适用于搜索引擎分词。 |
jieba.add_word(w) |
向分词词典中添加新词 w,使分词更准确。 |
示例:
1 2 3 4 5 6 7 8 9 10 11 12
| import jieba
s = "大家好,我是阿福课堂的阿福老师,欢迎关注阿福课堂!" jieba.add_word("阿福课堂") jieba.add_word("阿福老师")
print(jieba.lcut(s))
print(jieba.lcut(s, cut_all=True))
print(jieba.lcut_for_search(s))
|
注意:lcut 直接返回列表,cut 返回生成器,可按需选择。
2.2 turtle 库 —— 海龟绘图
2.2.1 窗体函数
turtle.setup(width, height, startx, starty)
width:窗口宽度(像素)
height:窗口高度(像素)
startx:窗口与屏幕左侧的距离(像素)
starty:窗口与屏幕顶部的距离(像素)
2.2.2 画笔状态函数
| 方法 |
说明 |
pendown() |
放下画笔,移动时绘制线条。 |
penup() |
提起画笔,移动时不绘制。 |
pensize(width) |
设置画笔线条粗细(宽度)。 |
pencolor(color) |
设置画笔颜色(颜色名称或RGB值)。 |
color(pencolor, fillcolor) |
同时设置画笔颜色和填充颜色。 |
begin_fill() |
开始填充图形(需配合 end_fill())。 |
end_fill() |
结束填充,填充起始点到终点的封闭区域。 |
filling() |
返回当前填充状态(True / False)。 |
clear() |
清除画布上的图形,海龟状态(位置/朝向)保持不变。 |
reset() |
清空画布并将海龟重置到原点,朝向东。 |
2.2.3 画笔运动函数
| 方法 |
说明 |
forward(distance) |
沿当前方向前进 distance 像素。 |
backward(distance) |
沿当前相反方向后退 distance 像素。 |
right(angle) |
向右(顺时针)旋转 angle 度。 |
left(angle) |
向左(逆时针)旋转 angle 度。 |
goto(x, y) |
移动到绝对坐标 (x, y) 处。 |
setx(x) |
只修改横坐标,纵坐标不变。 |
sety(y) |
只修改纵坐标,横坐标不变。 |
setheading(angle) |
设置当前朝向为 angle 度(0 为东,90 为北,等)。 |
home() |
回到原点(0,0),朝向正东。 |
circle(radius) |
绘制半径为 radius 的圆(圆心在海龟左侧)。 |
简单示例(画正方形):
1 2 3 4 5 6 7 8
| import turtle turtle.setup(400, 300) turtle.pensize(3) turtle.pencolor("red") for _ in range(4): turtle.forward(100) turtle.right(90) turtle.done()
|
2.3 time 库
time库是Python标准库之一,提供各种与时间相关的函数,常用于时间获取、时间格式化和程序计时。
2.3.1 时间的三种表示方式
| 表示方式 |
类型 |
说明 |
| 时间戳 |
浮点数(秒) |
从1970年1月1日00:00:00(UTC)开始到现在的秒数,如 1558741178.5478582 |
| 时间元组 |
struct_time对象 |
包含年、月、日、时、分、秒等信息的结构化对象 |
| 格式化时间 |
字符串 |
按指定格式显示的时间字符串,如 'Sat May 25 07:39:38 2019' |
struct_time 时间元组结构
1 2 3 4 5 6 7 8 9 10 11
| time.struct_time( tm_year=2019, tm_mon=5, tm_mday=7, tm_hour=7, tm_min=5, tm_sec=38, tm_wday=1, tm_yday=127, tm_isdst=-1 )
|
2.3.2 常用时间获取函数
| 函数 |
返回值 |
说明 |
time.time() |
浮点数(时间戳) |
返回当前时间的时间戳 |
time.localtime([sec]) |
struct_time(当地时间) |
将时间戳转换为本地时间元组,无参时获取当前本地时间 |
time.gmtime([sec]) |
struct_time(UTC时间) |
将时间戳转换为UTC时间元组 |
time.ctime([sec]) |
字符串 |
将时间戳转换为可读的字符串格式(如 'Sat May 25 07:39:38 2019') |
time.asctime([t]) |
字符串 |
将时间元组转换为可读的字符串格式 |
2.3.3 时间格式化
1. 格式化输出(时间元组 → 字符串)
1
| time.strftime(format[, t])
|
将时间元组按指定格式转换为字符串,无 t 时格式化当前时间。
2. 格式化解析(字符串 → 时间元组)
1
| time.strptime(string[, format])
|
将时间字符串按指定格式解析为时间元组。
3. 格式控制符(二级考试重点)
| 格式符 |
含义 |
值范围/示例 |
%Y |
完整年份 |
0001~9999,如 1900 |
%y |
两位年份 |
00~99,如 19 |
%m |
月份(数字) |
01~12,如 10 |
%B |
月份(全称) |
January~December |
%b |
月份(缩写) |
Jan~Dec,如 Apr |
%d |
日期 |
01~31,如 25 |
%A |
星期(全称) |
Monday~Sunday |
%a |
星期(缩写) |
Mon~Sun,如 Wed |
%H |
小时(24小时制) |
00~23,如 12 |
%I |
小时(12小时制) |
01~12,如 7 |
%M |
分钟 |
00~59,如 26 |
%S |
秒 |
00~59,如 26 |
%p |
上/下午 |
AM 或 PM |
2.3.4 程序计时相关函数
| 函数 |
说明 |
time.sleep(seconds) |
让程序暂停执行指定的秒数(常用于延时) |
time.perf_counter() |
返回一个高精度计时器的值(以秒为单位),起点为随机值,常用于测量短时间间隔 |
time.monotonic() |
返回从开机到当前的时间值(单调递增,不受系统时间修改影响) |
典型用法——计算代码执行时间:
1 2 3 4 5
| import time start = time.perf_counter()
end = time.perf_counter() print(end - start)
|
2.4 PyInstaller 库
- 作用:将
.py 源程序打包成独立的可执行文件(Windows 下为 .exe),使未安装 Python 解释器的电脑也能直接运行。
- 依赖:打包时会自动分析并捆绑所需的依赖库和 Python 解释器。
2.4.1 基本打包流程
在命令行中运行:
成功后,会产生几个重要目录/文件:
dist 目录:存放最终打包好的程序(考试常问“可执行文件在哪个目录下”)。
build 目录:存放临时文件,可删除。
源文件.spec:打包配置文件,可重复使用。
2.4.2 必考常用参数(重点记忆)
| 参数 |
完整形式 |
作用与说明 |
-F |
--onefile |
生成单一可执行文件(考试最常考,所有内容打包进一个 .exe) |
-D |
--onedir |
生成包含多个文件的目录(默认选项,文件之间依赖关系可见) |
-w |
--windowed / --noconsole |
关闭控制台窗口(适用于带 GUI 界面的程序,如 tkinter 等) |
-c |
--console |
显示控制台窗口(默认,适合命令行程序) |
-i |
--icon |
指定生成 exe 的图标(后跟图标文件路径,Windows 下常用 .ico 文件) |
-n |
--name |
指定生成文件的名字(不指定则使用源文件名) |
--clean |
无简短形式 |
打包前清理 build 和临时文件,避免缓存问题 |
记忆口诀:F单D多,w窗c台,i图标n命名。
2.5 基本 NumPy 库
- 核心:NumPy 中的多维数组对象,所有元素必须是同类型。
- 优点:比 Python 列表更节省内存,运算速度更快。
2.5.1 数组的创建(必考,参数要记准)
| 函数 |
说明与示例 |
np.array([列表]) |
从列表创建,可指定 dtype。np.array([1, 2]) |
np.arange(起, 止, 步长) |
类似 range,步长可为小数,不含终值。np.arange(5) → [0 1 2 3 4] |
np.linspace(起, 止, 个数) |
生成等差数列,默认包含终值。np.linspace(0, 1, 5) → [0. 0.25 0.5 0.75 1.] |
np.zeros(形状) |
全 0 数组,形状用元组。np.zeros((2, 3)) |
np.ones(形状) |
全 1 数组 |
np.eye(n) 或 np.identity(n) |
创建 n 阶单位矩阵 |
np.full(形状, 值) |
用指定值填充数组。np.full((2, 2), 7) |
2.5.2 数组属性(选择题高频)
| 属性 |
含义 |
arr.ndim |
数组维度数(几维) |
arr.shape |
形状,返回元组 (行, 列) |
arr.size |
元素总个数 |
arr.dtype |
元素数据类型,如 int32 |
2.5.3 形状变换
arr.reshape(新形状):返回新形状数组,元素总数需一致。可用 -1 表示自动计算,如 arr.reshape(-1, 1)。
arr.flatten():将多维数组展平为一维,返回副本。
arr.ravel():同样展平,但多数情况返回视图(修改会影响原数组)。
arr.T 或 arr.transpose():转置(行列互换)。
2.5.4 索引与切片(重点:切片是视图)
- 一维:与列表类似,
a[2:5]。
- 二维:
a[行, 列]。
a[1, 2] 定位一个元素。
a[:, 0] 取第一列全部行。
a[0:2, 1:3] 切片取子矩阵。
- 布尔索引:
a[a > 5] 可筛选出满足条件的元素。
关键:NumPy 切片得到的是原数组的视图,修改切片会改变原数组;Python 列表切片则是副本。这点判断题极爱考。
2.5.5 基本运算与统计函数
- 数组与标量运算:会广播到每个元素(
a + 2)。
- 数组间运算:对应位置元素运算,形状需满足广播规则。
- 矩阵乘法:
A @ B 或 A.dot(B)(对应位置相乘用 *)。
- 常用统计函数(可指定
axis):
arr.sum()、arr.mean()、arr.max()、arr.min()、arr.std()。
arr.argmax()(最大值的索引)、arr.argmin()。
np.median(arr) 中位数。
- 默认是对所有元素计算,
axis=0 沿列方向(行归约),axis=1 沿行方向(列归约)。
2.5.6 随机数模块(np.random)
| 函数 |
作用 |
np.random.rand(d0, d1, ...) |
生成 [0, 1) 均匀分布,给定形状 |
np.random.randn(d0, d1, ...) |
生成标准正态分布(均0方1) |
np.random.randint(low, high, size) |
生成指定范围整数,不含 high |
np.random.seed(值) |
设置随机种子,保证每次随机结果相同 |
2.6 random 库
- 作用:生成随机数,或对序列做随机操作。
- 导入:
import random,属于 Python 标准库,无需安装。
- 原理:生成的是伪随机数,由特定算法(梅森旋转)生成,起始于“种子”值。种子一样,随机序列就完全一样。
2.6.1 必考函数分类速记
1. 基本随机数函数
| 函数 |
说明 |
random.seed(a=None) |
设置随机种子。若 a 相同,后续生成的随机数序列完全一致。常用于测试复现。 |
random.random() |
生成一个 [0.0, 1.0) 范围内的随机浮点数。无参数。 |
2. 整数随机函数
| 函数 |
说明 |
random.randint(a, b) |
返回一个 [a, b] 范围内的随机整数,包含两端。 |
random.randrange(start, stop[, step]) |
从 range(start, stop, step) 中随机选一个整数。不包含 stop。 |
random.getrandbits(k) |
返回一个具有 k 个随机比特位的非负整数(考试较少考,了解即可)。 |
3. 浮点数随机函数
| 函数 |
说明 |
random.uniform(a, b) |
返回一个 [a, b] 或 [b, a] 范围内的随机浮点数(a、b 大小无关)。 |
4. 序列操作函数(高频考点)
| 函数 |
说明 |
random.choice(seq) |
从非空序列 seq(列表、元组、字符串等)中随机选一个元素。 |
random.shuffle(seq) |
将序列 seq 原地随机打乱,返回 None。只能用于可变序列(如列表)。 |
random.sample(population, k) |
从总体 population 中不重复抽取 k 个元素,返回新列表。原序列不变。 |
2.6.2 关键区别对比
| 对比项 |
不同点 |
randint vs randrange |
randint(a, b) 包含 b;randrange(start, stop) 不含 stop,用法和 range 一样。 |
shuffle vs sample |
shuffle 改变原列表,返回 None;sample 不改变原序列,返回新列表。 |
random vs uniform |
random() 无参数,返回 [0.0, 1.0);uniform(a, b) 可指定范围,返回浮点数。 |
2.6.3 典型考试示例
1 2 3 4 5 6 7 8 9 10 11 12 13
| import random
random.seed(10) print(random.random())
print(random.randint(1, 3)) print(random.randrange(1, 3))
list1 = [1, 2, 3, 4] random.shuffle(list1) print(list1)
print(random.sample(list1, 2))
|