Python——第二章:文件操作
文件操作
1. 找到这个文件. 双击打开它
open(文件路径, mode="", encoding="")
文件路径:
1. 绝对路径
d:/test/xxxx.txt
2. 相对路径
相对于当前你的程序所在的文件夹
../ 上一层文件夹
mode:
r : read 读取
w : write 写
a : append 追加写入
b : 读写的是非文本文件 -> bytes
with: 上下文, 不需要手动去关闭一个文件
修改文件:
1. 从源文件中读取内容.
2. 在内存中进行调整(修改)
3. 把修改后的内容写入新文件中
4. 删除源文件. 将新文件重命名成源文件
5. 最后要执行f.close()——操作完成后,不要忘记关闭文件!
在Python中,当你打开一个文件进行读写操作时,操作系统会为这个文件分配一些资源(如内存空间)。如果文件使用完毕后不及时关闭,可能会导致资源浪费,甚至出现数据错误或丢失的情况。
因此,执行f.close()是为了在完成文件操作后及时关闭文件,释放系统资源,并确保数据的完整性和安全性。这是一种良好的编程习惯,也是Python中推荐的文件操作方式。
使用with语句可以更方便地处理文件关闭问题。with语句会自动管理文件对象的生命周期,在代码块执行完毕后自动关闭文件,无需手动调用f.close()方法。但是,在某些特殊情况下,比如需要提前结束文件操作时,手动调用f.close()也是可以的。
打开文件:open("文件路径", mode="r", encoding="utf-8")
文件路径分为:绝对路径 or 相对路径:
绝对路径:
open ("/opt/db/abc.txt", mode="r", encoding="utf-8")
相对路径:
#和程序同层级目录
open ("国产自拍.txt", mode="r", encoding="utf-8")
#在本程序上一层目录下的其他目录
open ("../葫芦娃.txt", mode="r", encoding="utf-8")
#上一层目录下的/代码/目录
open ("../01_初识python/代码/倚天屠龙记.txt", mode="r", encoding="utf-8")
完整的打开格式open("国产自拍.txt", mode="r", encoding="utf-8")
f = open("国产自拍.txt", mode="r", encoding="utf-8")
content = f.read() # 全部读取
print(content)
f.close()
#运行结果
葫芦娃
葫芦娃
一根藤上七朵花
风吹雨打都不怕
啦啦啦啦啦.........
*注意事项
- 在操作文本文档时,
encoding="utf-8"
这条代码可以不写,但是建议写上,因为不写的时候根据你的操作系统默认标记.(MAC操作系统默认是utf-8,Windows中文版本默认是GBK) mode="r"
可以被缩写成"r"
如:open("国产自拍.txt", "r", encoding="utf-8")
- 在读写非文本文件的时候要加上b,比如读取读取图片,非文本
mode="rb"
,并且图片在计算机里是二进制存储的(01010110),不能带encoding="utf-8"
编码参数。 - 执行
f.read()
或f.write()
这类操作之前,必须先打开文件,要执行open - 执行
f.close()
后文件关闭,也不能再执行读or写操作 - 使用with用法后,文件会自动关闭,with外也不能再执行读写操作,还需要执行open
- 在Python中,双引号
""
和单引号''
都用于表示字符串,它们在大多数情况下是可以互相替代的,没有本质的区别。你可以根据个人偏好或者特定的语境选择其中之一。
在不指定encoding
参数的情况下,open
函数会使用默认的系统编码。最好还是明确指定encoding="utf-8"
参数,以确保正确处理文本文件。
- Windows 10英文版系统,它的默认编码通常是CP1252(Windows-1252)
- Windows 10中文版系统,它的默认编码通常是GBK(CP936)
- Windows 10台版本系统,它的默认编码通常是Big5-HKSCS 编码(Big5 字符集的扩展)
- MAC操作系统默认是UTF-8(中文&英文)
读取文件:r模式mode ="r"
执行读取的几种方法:
content = f.readable()
可以读取到内容content = f.read()
全部读取content = f.readlines()
把所有行都打印出来content = f.readline()
一行一行读取content = f.readline().strip()
去掉字符串左右两端的空白:空格, 换行, 制表符
为了方便解释,我们先执行content = f.readlines()
这个操作是把原文的每一行都拿出来,然后放入列表里.
f = open("国产自拍.txt", mode="r", encoding="utf-8")
content = f.readlines() #把所有行都打印出来
print(content)
f.close()
#执行结果
['葫芦娃\n', '葫芦娃\n', '一根藤上七朵花\n', '风吹雨打都不怕\n', '啦啦啦啦啦.........']
对比原文和content = f.readlines()
我们可以看到,其实每个字段后面都是跟着\n的,\n其实就是换行。
对比来看content = f.readline()
这是一行一行读取的操作命令,并且每执行一次,程序的指针会自动换到下一行
f = open("国产自拍.txt", mode="r", encoding="utf-8")
line = f.readline()
print(line)
line = f.readline()
print(line)
line = f.readline()
print(line)
f.close()
#运行结果
葫芦娃
葫芦娃
一根藤上七朵花
*这里需要解释一下,文本中本身就存在\n
换行。再加上python程序每执行一次print(*)
命令后,内部会默认执行一次end='\n'
换行,因此会出现多1次换行的现象。
为此,需要增加content = f.readline().strip()
命令来去掉字符串左右两端的空白。包括:空格,换行,制表符。这里程序本身的换行,是靠print(*)
命令内部实现的。
f = open("国产自拍.txt", mode="r", encoding="utf-8")
line = f.readline().strip() # 去掉字符串左右两端的空白,包括(空格, 换行, 制表符)
print(line)
line = f.readline().strip()
print(line)
line = f.readline().strip()
print(line)
f.close()
#运行结果
葫芦娃
葫芦娃
一根藤上七朵花
存在这些读取方式的区别是因为,如果文件足够大(10GB),那会严重影响程序的内存占用率,
因此这两种操作方式,都可能使内存占满
content = f.read()
全部读取content = f.readlines()
把所有行都打印出来
为此,应采取readline()的操作方式去使用,会更加安全
content = f.readline()
一行一行读取content = f.readline().strip()
去掉字符串左右两端的空白:空格, 换行, 制表符
但是为了便捷打印多行,python允许把f (open操作)加入循环
*最重要的一种文本读取方式(必须掌握)
f = open("国产自拍.txt", mode="r", encoding="utf-8")
for line in f: # 从f中读取到每一行数据
print(line.strip()) #必须加入.strip,不然会多换行
f.close() # 不要忘记关闭文件!
这是一种很公用的,大多数的通用读取方案.
写入文件:w模式mode ="w"
w模式下. 如果文件不存在. 自动的创建一个文件
w模式下. 每一次open都会清空掉文件中的内容
f = open("嫩模.txt", mode="w", encoding="utf-8")
f.write("胡辣汤")
f.close() # 每次操作之后养成好习惯.要关闭链接
准备一个列表.要求把列表中的每一项内容. 写入到文件中
lst = ['张无忌', "汪峰", "章子怡", "赵敏"]
f = open("打架.txt", mode="w", encoding="utf-8") # 大多数情况下要把open写循环外面
for item in lst:
f.write(item)
f.write("\n")
f.close() # 不要忘记关闭文件!
如果不加入"\n",就不会换行
写入文件:a模式mode ="a"
——在末尾追加
f = open("打架.txt", mode="a", encoding="utf-8")
f.write("你好厉害")
f.close() # 不要忘记关闭文件!
with用法: with open() as *:
它是一种上下文管理器,能够确保在这部分代码块执行完成后文件会被正确关闭,即便是后面的脚本发生了异常也没关系。with
语句会在代码块执行前自动打开文件,并在代码块执行完毕后自动关闭文件。这样可以确保文件在使用完毕后被及时关闭,是一种更安全的文件处理方式。
不需要手动去关闭一个文件,但是with后要以冒号结束,并且下一行需要缩进排版,缩进的命令代表在with内部。如果命令和with并排,代表在with动作外。with执行完成后,文件会自动被关闭。
总之,推荐使用 with
语句,因为它能够提供更好的代码健壮性,确保资源在正确的时候被释放。
使用with
语句的版本:
with open("国产自拍.txt", mode="r", encoding="utf-8") as f:
for line in f:
print(line.strip())
这种写法就等效于使用open
和close
的版本:
f= open("国产自拍.txt", mode="r", encoding="utf-8")
for line in f:
print(line.strip())
f.close()
这个版本手动调用了f.close()
来关闭文件。虽然这样也可以正常工作,但是如果在文件操作过程中发生异常,可能导致文件没有被关闭,因为close
语句可能不会被执行。因此,使用with
语句可以更好地确保文件的正确关闭,尤其是在处理文件时可能发生异常的情况下。
验证实验:在with外增加f.readline()
这些读or写的操作,都会报错
with open("国产自拍.txt", mode="r", encoding="utf-8") as f:
for line in f:
print(line.strip())
print(f.readline())
提示ValueError: I/O operation on closed file.
文件关闭后不可以I/O输出
想要读取图片,在读写非文本文件的时候要加上b,比如读取非文本mode="rb"
,并且图片在计算机里是二进制存储的(01010110),不能带encoding="utf-8"
编码参数。
with open("胡一菲.jpeg", mode="rb") as f:
for line in f:
print(line)
想要完成文件的复制: 从源文件中读取内容. 写入到新路径去with open("源文件", mode="rb") as f1, open("新路径", mode="wb") as f2:
with open("胡一菲.jpeg", mode="rb") as f1, \
open("../01_初识python/胡二飞.jpeg", mode="wb") as f2:
for line in f1:
f2.write(line)
这里需要注意,因为一行代码太长,刻意使用到了\
符号,\
代表转行(未完待续),实际代码等效为with open("胡一菲.jpeg", mode="rb") as f1, open("../01_初识python/胡二飞.jpeg", mode="wb") as f2:
文件修改:
第1步,把文件中开头以"周" -> "张",然后存入临时副本中。
with open("人名单.txt", mode="r", encoding="utf-8") as f1, \
open("人名单_副本.txt", mode="w", encoding="utf-8") as f2:
for line in f1:
line = line.strip() # 去掉换行/n
if line.startswith("周"):
line = line.replace("周", "张") # 字符串操作不可变,需要重新赋值
f2.write(line)
f2.write("\n")
第2步,删除原始文件。把临时副本中的文件替换为原始文件。
import os # python要调用os操作系统相关的模块,要引用os
os.remove("人名单.txt") # 删除源文件
os.rename("人名单_副本.txt", "人名单.txt") # 把副本文件重命名成源文件
运行此命令时,程序瞬间执行完成,让用户感知不到整改操作过程,以为是对源文件进行的操作替换.
为此我们可以加入时间概念,让程序等待3秒再执行,格式为:
import time # python要调用和时间相关的模块,要引用time
time.sleep(3) # 让程序休眠3秒钟
因此整段代码应为:
import os
import time
with open("人名单.txt", mode="r", encoding="utf-8") as f1, \
open("人名单_副本.txt", mode="w", encoding="utf-8") as f2:
for line in f1:
line = line.strip() # 去掉换行
if line.startswith("周"):
line = line.replace("周", "张") # 重新赋值才可以替换
f2.write(line)
f2.write("\n")
time.sleep(3) # 让程序休眠3秒钟
os.remove("人名单.txt") # 删除源文件
time.sleep(3) # 让程序休眠3秒钟
os.rename("人名单_副本.txt", "人名单.txt") # 把副本文件重命名成源文件
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)