零基础学Python:Day13!文件操作与IO:读写文件就这么简单
昨天我们学习了面向对象进阶知识点,掌握了魔法方法、property属性和继承进阶,先来对一下昨天的作业答案~
📋 昨日作业答案
1. 给你昨天写的Rectangle类添加__str__魔法方法,打印对象的时候输出长和宽,更友好
class Rectangle:def __init__(self, length, width):self.length = lengthself.width = widthdef area(self):return self.length * self.widthdef perimeter(self):return 2 * (self.length + self.width)def __str__(self):return f"Rectangle(length={self.length}, width={self.width})"rect = Rectangle(5, 3)print(rect) # 输出:Rectangle(length=5, width=3)
现在打印对象就能直接看到长和宽,调试起来方便多了。
2. 给Person类的年龄属性添加property,设置年龄的时候做校验(必须1-120之间),像普通属性一样访问年龄
class Person:def __init__(self, name, age):self.name = nameself._age = age @propertydef age(self):return self._age @age.setterdef age(self, new_age):if 1 <= new_age <= 120:self._age = new_ageelse:raise ValueError("年龄必须在1-120之间")p = Person("张三", 20)print(p.age) # 20p.age = 25print(p.age) # 25# p.age = 150 # 抛出异常
完美,用property实现了优雅的属性访问和校验。
3. 定义一个Shape父类,有计算面积area方法(默认返回0),然后定义Rectangle子类和Circle子类,继承自Shape,分别实现自己的area方法
class Shape:def area(self):return 0class Rectangle(Shape):def __init__(self, length, width):self.length = lengthself.width = widthdef area(self):return self.length * self.widthclass Circle(Shape):def __init__(self, radius):self.radius = radiusdef area(self):import mathreturn math.pi * self.radius ** 2rect = Rectangle(5, 3)print(rect.area()) # 15circle = Circle(5)print(circle.area()) # 78.5398...
多态的体现,不同形状都有area方法,实现不同,完美。
好了,对完答案,我们开始今天的内容:文件操作!在编程中,我们经常需要读写文件,比如读取配置文件、保存程序数据、处理文本文件等等,Python操作文件非常简单,今天我们就来学习一下。
📂 打开文件:open()函数
Python中打开文件用内置函数open(),基本语法:
f = open("文件名", "打开模式")# 操作文件...f.close()
打开模式有哪些呢?最常用的:
w:写入模式,会覆盖原有内容,如果文件不存在会创建a:追加模式,在文件末尾追加内容,不会覆盖原有内容rb/wb:二进制读写模式,用来处理图片、视频等二进制文件
注意:打开文件之后一定要记得close()关闭文件,不然会占用系统资源。
🌟 推荐写法:with语句自动关闭文件
Python给我们提供了with语句,它会自动帮我们关闭文件,不用我们手动调用close(),非常方便,推荐大家都用这种写法:
with open("test.txt", "r", encoding="utf-8") as f:# 在with块里操作文件 content = f.read()print(content)# with块结束,文件自动关闭
encoding="utf-8"指定编码,处理中文的时候不会乱码,一定要加上哦!
📖 读取文件的几种方法
读取文件有几种常用方法,我们一个个来看:
1. read():读取整个文件内容
with open("test.txt", "r", encoding="utf-8") as f: content = f.read()print(content) # 整个文件内容都读到content变量里
适合小文件,一下子读完很方便。
2. readline():一次读取一行
with open("test.txt", "r", encoding="utf-8") as f: line = f.readline()while line: # 读到空字符串说明读完了print(line, end="") line = f.readline()
适合大文件,一次读一行不会占太多内存。
3. readlines():读取所有行,返回列表
with open("test.txt", "r", encoding="utf-8") as f: lines = f.readlines()for line in lines:print(line, end="")
每一行是列表的一个元素,方便遍历处理。
4. 直接遍历文件对象
更简洁的写法,直接遍历文件对象,一次读一行:
with open("test.txt", "r", encoding="utf-8") as f:for line in f:print(line, end="")
这是最常用的写法,简洁又高效。
✍️ 写入文件的几种方法
写入文件也很简单,两种常用方法:
1. write():写入字符串
# w模式打开,覆盖原有内容with open("test.txt", "w", encoding="utf-8") as f: f.write("第一行内容\n") f.write("第二行内容\n") f.write("第三行内容\n")
注意:write不会自动加换行,需要你自己写\n。
2. writelines():写入多行,传入列表
lines = ["第一行\n", "第二行\n", "第三行\n"]with open("test.txt", "w", encoding="utf-8") as f: f.writelines(lines)
同样,每一行结尾需要自己加\n。
追加写入:用a模式
如果你想在文件末尾追加内容,不覆盖原来的内容,用a模式:
with open("test.txt", "a", encoding="utf-8") as f: f.write("我是追加的第四行\n")
打开之后直接在文件最后加内容,原来的内容保留。
📁 常用的文件和目录操作
除了读写文件内容,我们还经常需要操作文件本身,比如删除文件、重命名、创建目录等等,这些功能在os模块和pathlib模块里,我们来看几个最常用的:
使用os模块:
import os# 判断文件或目录是否存在print(os.path.exists("test.txt")) # True/False# 获取文件大小(字节)print(os.path.getsize("test.txt"))# 删除文件os.remove("test.txt")# 创建目录os.mkdir("my_folder")# 列出目录下所有文件和目录print(os.listdir(".")) # .代表当前目录
更现代的写法:pathlib(Python 3.4+推荐)
pathlib面向对象,用起来更舒服:
from pathlib import Path# 创建Path对象p = Path("test.txt")# 判断是否存在print(p.exists())# 获取文件大小print(p.stat().st_size)# 删除文件p.unlink()# 创建目录Path("my_folder").mkdir(exist_ok=True)# 遍历目录下所有py文件for file in Path(".").glob("*.py"):print(file)
语法更简洁直观,推荐大家用pathlib。
🎯 实战:统计文本文件中单词出现的次数
我们来做一个实用的小案例,统计一个文本文件中每个单词出现了多少次:
from collections import Counterdef count_words(filename): counter = Counter()with open(filename, "r", encoding="utf-8") as f:for line in f:# 简单处理:分割单词,转小写 words = line.strip().split() words = [word.lower().strip('.,!?') for word in words] counter.update(words)return counterif __name__ == "__main__": result = count_words("test.txt")# 输出出现次数最多的前10个单词for word, count in result.most_common(10):print(f"{word}: {count}")
这个小程序用到了我们之前学的collections.Counter,非常方便,直接就能统计次数。
⚠️ 常见异常处理
操作文件的时候经常会遇到异常,比如文件不存在,权限不够等等,我们可以用try...except捕获异常,让程序更健壮:
try:with open("not_exist.txt", "r") as f: content = f.read()except FileNotFoundError:print("错误:文件不存在!")except PermissionError:print("错误:没有权限读取这个文件!")
处理完异常程序不会崩溃,还能给用户友好提示,这在实际开发中非常重要。
📝 今日小结
今天我们学习了Python文件操作,总结一下核心知识点:
- 打开关闭文件:推荐用
with语句,自动关闭文件,不用手动close() - 读取文件:
read()读全部,readline()读一行,直接遍历文件对象逐行读取最常用 - 写入文件:
w模式覆盖写入,a模式追加写入,记得换行要加\n - 文件操作:
os和pathlib都可以操作文件和目录,pathlib更简洁推荐 - 异常处理:捕获文件不存在、权限不足等异常,让程序更健壮
文件操作是非常基础又常用的知识点,我们保存程序数据、读取配置都离不开它,一定要掌握。
🏋️ 今日作业
动手写代码,今天的作业:
1. 创建一个文本文件hello.txt,写入三行文字:"Hello Python"、"File Operation"、"I love Python",然后读取这个文件内容打印出来
2. 写一个程序,复制一个文本文件,把a.txt的内容复制到b.txt中
3. 写一个程序,统计一个Python源代码文件一共有多少行代码(忽略空行)
4. 拓展练习:写一个程序,把用户每次输入的内容追加写到日记文件里,用户输入exit退出程序
今天我们学习了文件操作,明天就是我们这个零基础教程的最后一天了,我们来做一个完整的综合实战项目,把我们这十几天学的所有知识点都整合起来,打造一个实用的小工具,敬请期待~