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
    f.seek(0)      # 移动到文件开头
    f.seek(5, 0) # 从开头向后移动5个字节

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()
# 离开 with 块后文件自动关闭

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) # 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) # 写入多行(二维列表)
# writer.writerow(['王五', '21', '广州']) # 写入单行

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 安装

1
pip install jieba

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, # 月份 1~12
tm_mday=7, # 日期 1~31
tm_hour=7, # 小时 0~23
tm_min=5, # 分钟 0~59
tm_sec=38, # 秒 0~61(闰秒)
tm_wday=1, # 星期 0~6(0=周一)
tm_yday=127, # 一年中的第几天 1~366
tm_isdst=-1 # 夏令时标志(1=是,0=否,-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 基本打包流程

在命令行中运行:

1
pyinstaller [选项] 源文件.py

成功后,会产生几个重要目录/文件:

  • 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([列表]) 从列表创建,可指定 dtypenp.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.Tarr.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 @ BA.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) 包含 brandrange(start, stop) 不含 stop,用法和 range 一样。
shuffle vs sample shuffle 改变原列表,返回 Nonesample 不改变原序列,返回新列表。
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()) # 输出 0.5714025946899135(固定)

print(random.randint(1, 3)) # 可能输出 1, 2, 3
print(random.randrange(1, 3)) # 可能输出 1, 2 (不含3)

list1 = [1, 2, 3, 4]
random.shuffle(list1) # list1 被原地打乱
print(list1) # 例如 [3, 1, 4, 2]

print(random.sample(list1, 2)) # 随机抽取2个不重复元素,原列表不变