1 文件使用流程
1.1 打开
- 打开文件函数
# open("文件", "模式")
f = open("a.text", "r")
# 文件:指定文件路径
# 模式:控制操作模式
- 模式
模式 | r | w | a | r+ | w+ | a+ |
---|---|---|---|---|---|---|
读 | √ | √ | √ | √ | ||
写 | √ | √ | √ | √ | √ | |
创建文件 | √ | √ | √ | √ | ||
覆盖内容 | √ | √ | ||||
指针在开头 | √ | √ | √ | √ | ||
指针在末尾 | √ | √ | ||||
默认模式 | √ |
r、w、a 默认用于处理文本文件
b :以二进制格式进行操作文件读写。如果文件是二进制文件,则选择此项。如:图片、视频、音频
所以,rb、wb、ab 模式就是用于处理二进制文件的,权限与 r、w、a 一样。
- 注意,如果对同一文件先进行 读 操作,然后进行写操作的话。此时写入的内容是以追加方式进行的。因为读操作会移动指针到末尾。
1.2 读写
- 定位
f.seek(offset, whence)
# offset 指定开始位置从1开始
# whence 取值范围 0,1,2
# 0 代表开头,默认值
# 1 代表当前位置
# 2 代表文件末尾
# 注意
* 文本文件的操作模式下(不带b),只能写0
* 如果想要写1或2,必须在二进制文件操作模式下(带b)
通过cmd+点击跳进函数方法,seek 函数没有描述,则可以通过下面步骤查看 seek 函数描述
- 查看指针位置
f.tell()
- 读
content = f.read()
# f.read(字节数)
# 字节数默认是文件内容长度
# 下标会自动后移
content = f.readline()
# f.readline([limit])
# 读取一行数据
# limit
# 限制的最大字节数
content = f.readlines()
# f.readlines()
# 会自动的将文件按换行符进行处理
# 将处理好的每一行组成一个列表返回
f.readable()
# 判断是否可读
- 注意
- 通过 open() 返回的句柄 f 是一个迭代器,可通过 isinstance(f, collection.iterator) 进行判断,需要导入 collection 模块。
- 因为文件句柄 f 是迭代器,那么它的数据处理并不是马上生成所有数据,而是需要的时候才产生(参考迭代器的使用)
- read() 和 readlines()方法都是读取全部内容,对于处理大容量文件要小心内存,但正因为全部加载进内存,也方便了后续多次对数据的处理
- readline() 逐行读取,for in 方法遍历 句柄 f等,它们适用于处理大数据文件
- 假设文件的内容并没有换行符,此时,使用的 readline() 或 for in 方法都是读取整个文件的,那么最保险的做法即使通过 read(n) 方法来指定读取字节数来分段处理
- 写
writeContent = f.write("xxxyyyy")
# 返回值是写入的字节长度
# 写完后,指针位置在文件末尾
f.writeable()
# 判断是否可写
1.3 关闭
f.close()
# 关闭一个打开的文件
# 关闭的原因:
* 可以释放系统资源
* 会立即清空缓冲区的数据,立即将内容写入到磁盘文件(因为写入的内容并非立即写入文档的,这样的机制是用于减少 I/O 频率)
* 如果不关闭的话,会存在丢失数据的风险
f.flush()
# 立即将缓冲区内容写入到文件中
1.4 相关例子代码
# 1. 打开文件
# 相对路径, 相对于哪一个目录下面的指定文件
f = open("a.txt", "r+")
# 2. 读写操作
content = f.read()
print(content)
f.write("88888")
# 3. 关闭文件
f.close()
2 文件相关操作
- 模块
improt os
- 重命名
os.rename(src, dst)
# os.rename("b.text", "xx.text")
# os.rename("wenjianjia", "wenjianjia2")
# 修改单级文件、文件夹名称
os.renames(old, new)
# os.renames("one/b.text", "two/bb.text")
# 修改多级文件、文件夹名称
- 删除
删除文件
os.remove(path)
# 文件不存在会报错
删除目录
os.rmdir(path)
# 不能递归删除目录,os.rmdir(one/two), 只删除 two
# 如果文件夹非空,会报错
os.removedirs(path)
# 可以递归删除目录,os.rmdir(one/two), 删除one 和 one 内的 two
# 如果文件夹非空,会报错
- 创建文件夹
os.mkdir("文件夹名"[, mode])
# 不能递归创建
# 只能创建第一级目录
# mode 指数字模式权限,默认 mode:int = 0o777
一般分为三组
* 文件拥有者
- 读:r -> 4
- 写:w -> 2
- 可执行:x -> 1
* 同组用户
- 读
- 写
- 可执行
* 其他用户
- 读
- 写
- 可执行
- 获取当前目录
os.getcwd()
- 改变默认目录
os.chdir("目标目录")
- 获取目录内容列表
os.listdir("./")
# 列举一级目录
# ./ 当前所在目录
# ../ 当前目录所在的上一级目录
3 参考案例
- 将一个文件内容复制到另一个文件内
import os
os.chdir("files")
# 1. 只读模式, 打开要复制的文件
# 追加模式, 打开副本文件
# 编码格式一定要统一,所以会手动指定,如果不指定,默认就是 utf-8
source_file = open("d.txt", "r", encoding="utf-8")
dst_file = open("d_bat.txt", "a", encoding="utf-8")
# 2. 从源文件中读取内容
# 写入到目标文件中
#content = source_file.read()
#dst_file.write(content)
# 优化读取
while True:
content = source_file.read(1024)
if len(content) == 0:
break
print("----", content)
dst_file.write(content) # 因为读取操作,指针会自动移动到读取位置,所以内容是连续写入的
#3. 关闭源文件和目标文件
source_file.close()
dst_file.close()
- 文件分类,并生成一个文件清单
步骤分析
1. 给定一批文件
a.avi、b.jpg、c.jpg、d.text、e.avi、f.text
2. 按照文件后缀名,划分到不同的文件里
* 文件夹命名:后缀名
* 结果:
avi - a.avi、e.avi
jpg - b.jpg、c.jpg
text - d.text、f.text
3. 生成 text 格式的文件清单
将在 files 文件夹下的文件按后缀名分类
# 0, 获取所有的文件名称列表
import os
import shutil
path = "files"
if not os.path.exists(path):
exit()
os.chdir(path)
file_list = os.listdir("./")
# print(file_list)
# 1. 遍历所有的文件(名称)
for file_name in file_list:
# print(file_name)
# 2. 分解文件的后缀名
# 2.1 获取最后一个.的索引位置 xx.oo.txt
index = file_name.rfind(".")
if index == -1:
continue
# print(index)
# 2.2 根据这个索引位置, 当做起始位置, 来截取后续的所有字符串内容
extension = file_name[index + 1:]
print(extension)
# 3. 查看一下, 是否存在同名的目录
# 4. 如果不存在这样的目录 -> 直接创建一个这样名称的目录
if not os.path.exists(extension):
os.mkdir(extension)
# 5, 目录存在 -> 移动过去
shutil.move(file_name, extension)
按目录分类后,生成清单
import os
# file_list = os.listdir("files")
# print(file_list)
# 通过给定的文件夹, 列举出这个文件夹当中, 所有的文件,以及文件夹, 子文件夹当中的所有文件
def listFilesToTxt(dir, file):
# 1. 列举出, 当前给定的文件夹, 下的所有子文件夹, 以及子文件
file_list = os.listdir(dir)
# print(file_list)
# 2. 针对于, 列举的列表, 进行遍历
for file_name in file_list:
new_fileName = dir + "/" + file_name
# 判定, 是否是目录, listFiles
if os.path.isdir(new_fileName):
# print(new_fileName)
file.write(new_fileName + "\n")
listFilesToTxt(new_fileName, file)
else:
# 打印下, 文件名称
# print("\t" + file_name)
file.write("\t" + file_name + "\n")
# print("")
file.write("\n")
f = open("list.txt", "a")
listFilesToTxt("files", f)
网友评论