Python 元组与文件操作:那些“不能改”和“要保存”的事
前言
上回我们搞定了列表——能装、能改、能删、能排序,简直无所不能。但 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 那元组到底有啥用?
-
保护数据:不想被别人不小心改掉的数据,用元组装起来
-
字典的键:列表不能当字典的键,元组可以(后面学字典就知道了)
-
性能略好:元组比列表省内存,速度也稍快
-
函数返回多个值:本质上返回的就是一个元组
第二章:文件操作 —— 让数据“永久落户”
程序跑完,数据不能丢。总得有个地方存下来,下次打开还能继续用。这时候就要靠文件操作了。
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 里最像“现实世界”的数据结构,带标签的储物柜,一找就准。咱们下期见~ 👋🐍
更多推荐


所有评论(0)