一、文件操作
1. open(文件路径,mode=“”,encoding=“”)
1.1 文件路径:
-
绝对路径
d:/test/xxxx.txt
在项目迁移/部署时候会有坑, -
相对路径
相对于当前你的程序所在的文件夹
…/ 上一层文件夹
举例:在09_wenjiancaozuo.py中输入指令打开haha.txt
open("../first_lesson/haha.txt")
先输入…/返回上个文件夹(pythonProject)然后进入(first_lesson)最终进入(haha.txt)
1.2 mode
符号 | 含义 |
---|---|
r | read 读取 |
w | write 写 |
a | append 追加写入 |
b | 读写的是非文本文件 -> bytes |
1.2.1 r:read 读取
读取方式 | 语句 | 备注 |
---|---|---|
全部读取 | content = f.read() | |
按行读取 | line = f.readline() | 默认从首行开始读取,可以重复读取(详见示例2),但读取结果是两行,因为读取文件中存在换行符 |
全部读取,存在列表中 | line = f.readlines() | 示例:[‘缓缓飘落的枫叶像思念\n’, ‘我点燃烛火温暖岁末的秋天’]。从\n可以看出换行符的存在 |
循环读取 | for line in f: | 最重要的一种读取方式(必须掌握),见示例3 |
示例1:读取xixi.txt的内容
f = open("xixi.txt", mode="r", encoding="utf-8")
content = f.read() # 全部读取
print(content)
示例2:按行读取xixi.txt内容
line = f.readline()
print(line)
line = f.readline()
print(line)
读出结果发现存在自动换行,因为print里面自带换行,如果想不带换行,可以使用之前学到的strip(),支持去掉字符串左右两端的空白、空格、换行,制表符
line = f.readline().strip()
print(line)
line = f.readline().strip()
print(line)
示例3:用循环读取xixi.txt内容
for line in f: # 从f中读取每一行数据
print(line.strip())
1.2.2 w:write 写
1.2.2.1 写入文件
w模式下,如果文件不存在,自动的创建一个文件
open("good.txt", mode="w", encoding="utf-8")
w模式下,每一次open都会清空文件中的内容
1.2.2.2 在文件中写入内容:
f = open("good.txt", mode="w", encoding="utf-8")
f.write("hello")
f.close()
每次操作之后养成好习惯,要关闭链接
练习:
准备一个列表,要求把列表中的每一项内容,写入到文件中
lst = ["hello", "world", "i", "love", "you"]
f = open("good.txt", mode="w", encoding="utf-8") # 大多数情况下要把open写循环外面
for i in lst:
f.write(i)
f.write("\n") # 换行符,将元素分行
f.close()
目标文件good.txt中出现了列表的每一个元素。
1.2.3 a:append 追加写入
f = open("good.txt", mode="a", encoding="utf-8")
f.write("all")
f.close()
1.3 with:上下文
1.3.1 用with打开文件
with open("good.txt", mode="r", encoding="utf-8") as f: # f = open()
for line in f:
print(line.strip())
使用with可以不用再每次完成操作后关闭文件,省去了f.close()
1.3.2 打开图片
在读写非文本文件的时候要加上b
with open("胡歌.jpeg", mode="rb") as f:
for line in f:
print(line)
返回结果还是字节,不能做编码操作
1.3.3 文件复制(到另一个文件夹)
with open("胡歌.jpeg", mode="rb") as file, \
open("../first_lesson/huge.jpeg", mode="wb") as f2:
for line in file:
f2.write(line)
# \ 代表下面一行代码和上面一行代码是同一行代码
看看效果:
1.3.4 文件修改
文件修改逻辑:(过程足够快)
- 从源文件(source)中读取内容
- 在内存中进行调整(修改)
- 把修改后的内容写入新文件(new)中
- 删掉源文件(source)
- 将新文件(new)重命名为源文件(source)实现替换效果
尝试将人名单中的陈姓都替换为张
修改内容:
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")
强调:
和操作系统相关的模块引入
import os
和时间相关的模块引入
import time
可以设置休眠时间,在文件资源管理器看到文件替换的过程
time.sleep(3) # 让程序休眠3秒钟
# 删除源文件
os.remove("人名单.txt")
time.sleep(3)
# 把副本文件重命名成源文件
os.rename("人名单_副本.txt", "人名单.txt")