前言

上回我们搞定了列表——能装、能改、能删、能排序,简直无所不能。但 Python 里还有一种“亲兄弟”,叫元组(tuple),长得和列表几乎一模一样,就是多了一道“紧箍咒”:一旦创建,打死不能改。

你可能会问:还有这种奇葩?不能改要来干嘛?

别急,就像火锅店里的“固定套餐”——菜单上写死了就是那几样,你不能说“把毛肚换成鸭肠”。但正因为不能改,它才安全、可靠、省内存,适合存那些永远不会变的数据,比如一年 12 个月份、RGB 颜色值、身份证号……这些东西要是被不小心改了,麻烦就大了。

学完元组,我们再整点更实用的——文件操作。程序跑完数据不能丢吧?得存下来。open() 和 os 就是干这个的,让数据从“内存里跑一圈就没了”变成“硬盘里永久扎根”。

这一篇分两章:第一章,元组第二章,文件操作(open + os

开整!🔥


第一章:元组 —— 列表的“固定套餐版”

1.1 元组长啥样?

元组用圆括号 () 表示,元素用逗号隔开:

python

# 空元组
t1 = ()
print(t1, type(t1))   # () <class 'tuple'>

# 单个元素的元组 —— 逗号不能省!不然就是普通数字了
t2 = (10,)
print(t2, type(t2))   # (10,) <class 'tuple'>

# 不加逗号试试
t3 = (10)
print(type(t3))       # <class 'int'> !变成了整数

⚠️ 记住:单元素元组后面一定要加逗号 ,,不然 Python 会把它当成普通变量。就像你点了一杯“美式咖啡”,必须说清楚“热的”,不然服务员可能给你一杯冰的。

1.2 元组里能装啥?

跟列表一样,什么都能装

python

t4 = (10, 3.14, "hello", True, None, [1, 2, 3], (1, 2, 3))
print(t4, type(t4))

1.3 怎么取数据?用索引!

和列表、字符串一样,元组也是用 [索引] 取值:

python

t4 = (10, 3.14, "hello", True, None, [1, 2, 3], (1, 2, 3))

print(t4[0])      # 10
print(t4[6][2])   # 3(元组里的元组的第2个元素)

1.4 怎么遍历?和列表一样!

python

t4 = (10, 3.14, "hello", True, None, [1, 2, 3], (1, 2, 3))

# 方式一:直接遍历
for e in t4:
    print(e)

# 方式二:通过索引遍历
for i in range(len(t4)):
    print(i, t4[i])

1.5 切片也支持

python

t4 = (10, 3.14, "hello", True, None, [1, 2, 3], (1, 2, 3))
print(t4[2:5])    # ('hello', True, None)

1.6 元组的“紧箍咒”——不可变

这是元组和列表最大的区别

python

t5 = (1, 2, 3)
t5[2] = 30   # ❌ 报错!TypeError: 'tuple' object does not support item assignment

字符串也一样不可变:

python

s5 = "hello world"
# s5[6] = "x"   # ❌ 报错!字符串也不支持修改

# 想改只能重新赋值,原来的字符串还在内存里没动
s6 = s5.replace("hello", "hi")
print(s5)    # hello world(原字符串没变)
print(s6)    # hi world(新字符串)

那元组真的完全不能改吗? 如果元组里装了个列表,这个列表本身是可以变的:

python

t7 = (1, 2, [10, 20])
t7[2][0] = 999   # 可以!改的是列表里的元素
print(t7)        # (1, 2, [999, 20])

📌 记住:元组不可变是指它里面装着什么东西不能换——你不能把第 0 个元素从 1 换成 100。但如果第 2 个元素本身是个列表,你可以改列表里的内容,这属于“动了盒子里面的东西,没换盒子”。

1.7 元组的常用方法(就俩!)

元组因为不可变,方法少得可怜,就两个:

方法 作用
count(元素) 统计某个元素出现的次数
index(元素) 查找某个元素的位置,找不到报错

python

t6 = (10, 20, 30, 20, 20)

print(t6.count(20))   # 3(20 出现了 3 次)

if 300 in t6:
    print(t6.index(300))   # 没找到就不执行

1.8 那元组到底有啥用?

  1. 保护数据:不想被别人不小心改掉的数据,用元组装起来

  2. 字典的键:列表不能当字典的键,元组可以(后面学字典就知道了)

  3. 性能略好:元组比列表省内存,速度也稍快

  4. 函数返回多个值:本质上返回的就是一个元组

第二章:文件操作 —— 让数据“永久落户”

程序跑完,数据不能丢。总得有个地方存下来,下次打开还能继续用。这时候就要靠文件操作了。

Python 里文件操作主要靠两个东西:

 open():打开文件,读或写

 os 模块:判断文件存不存在、重命名、删除等

2.1 打开和关闭:open() + close()

python

# 打开文件
f = open("xxx.txt", mode="r")

# 读写操作...

# 关闭文件(必须关!不然资源被占着)
f.close()

⚠️ 记着关文件!就像你进了一个房间,出来时得把门带上,不然门一直开着(资源被占用)。

2.2 三种最常用的模式

模式 全称 作用 文件不存在时
'r' read(读) 读取文件内容 报错
'w' write(写) 写入内容(覆盖原来的) 新建
'a' append(追加) 在末尾追加内容 新建

2.3 写文件:write() 和 writelines()

python

# 写模式:没有文件会自动创建
f = open("36.txt", mode="w", encoding="utf-8")

print(f.writable())   # True(检查是否可写)

f.write("hello world\n")
f.write("hi\n")

# writelines:写入多个字符串(注意:不会自动换行!)
f.writelines(["hi", "world"])

f.close()

打开 36.txt 看看内容:

text

hello world
hi
hiworld

2.4 追加文件:'a' 模式

python

f = open("36.txt", mode="a", encoding="utf-8")
f.write("666")
f.close()

原来的内容后面会多一个 666

2.5 读文件:'r' 模式

python

f = open("36.txt", mode="r", encoding="utf-8")
content = f.read()
print(content)
f.close()

2.6 二进制文件读写:'rb' 和 'wb'

图片、音频、视频这些不是文本,需要用二进制模式

python

# 读取一张图片
f = open("小猫.png", mode="rb")
content = f.read()
f.close()

# 写入一张新图片(相当于复制)
f2 = open("小猫_new.png", mode="wb")
f2.write(content)
f2.close()

📌 这就是用 Python 复制图片的原理——读出来的二进制数据原封不动写到另一个文件。

2.7 os 模块 —— 先判断文件存不存在

读文件之前最好先看一眼文件在不在,免得 open() 直接报错:

python

import os

# 确定文件是否存在
if os.path.exists("飞行库洛米.png"):
    f = open("飞行库洛米.png", mode="rb")
    content = f.read()
    f.close()

    f2 = open("飞行库洛米_new.png", mode="wb")
    f2.write(content)
    f2.close()
    print("复制成功!")
else:
    print("文件不存在,请检查文件名")

💡 os.path.exists(路径) 返回 True 或 False,让你在操作之前先“打个招呼”,避免程序突然崩溃。

🎯 一句话总结

概念 一句话
元组 列表的“固定套餐版”,创建后不能改,安全可靠
open() 读 'r' 模式读取文本,'rb' 读取图片等二进制文件
open() 写 'w' 覆盖写,'a' 追加写,'wb' 写二进制
close() 用完一定要关,别让“门”敞着
os.path.exists() 先检查文件在不在,再动手,优雅不报错

总结

今天你收获了 Python 里两样很实用的东西:

元组——看似“缩水版”的列表,功能少了一半,但恰恰因为少,才更安全、更可靠。你想想,有些东西这辈子都不该变:身份证号、经纬度、RGB 颜色值……用元组存,放心。

文件操作——学会了让数据“久住硬盘”,而不是在内存里“一日游”。以后你写的爬虫、日志系统、数据导出工具,全都要靠 open() 和 os 来兜底。

回到生活里想想:

python

# 你的咖啡订单,下了单就改不了了——元组
order = ("美式", "大杯", "少冰", "加一份浓缩")

# 你的外卖记录,每天都会新增一笔——文件追加
f = open("takeout.txt", mode="a", encoding="utf-8")
f.write("2026-07-17 黄焖鸡米饭 ¥28\n")
f.close()

# 你手机里的所有照片,全是二进制文件——`'rb'` 读取,`'wb'` 写入

把代码和生活串起来,你会发现这些知识点一点都不陌生。

今天学到的东西,明天就能用上。你写的每一行代码,都在解决一个真实世界的问题。

下期我们搞 字典——Python 里最像“现实世界”的数据结构,带标签的储物柜,一找就准。咱们下期见~ 👋🐍


Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐