目录
9.os与文件的相关操作
9.1搜索文件
搜索文件方法 – 递归、深度遍历、广度遍历
9.1.1递归遍历搜索
递归遍历--- 接近深度,但是是通过调用自身
代码示例:
import os
path_a = './a'
def get_all_file(path):
# 判断path对应的路径是否是真实存在的
if os.path.exists(path):
# 获取子文件名
filenames = os.listdir(path)
# 遍历
for fn in filenames:
# 拼接
join_path = os.path.join(path, fn)
# 判断是不是文件
if os.path.isfile(join_path) and os.path.splitext(join_path)[-1] in ('.py', '.mp4'):
print(join_path)
elif os.path.isdir(join_path):
# 调用自己 完成新的一轮的获取
get_all_file(join_path)
else:
print(f'{path}这个路径不存在')
9.1.2深度遍历搜索
深度遍历--- 沿着某一分支将数据遍历完成再去遍历下一个分支
栈数据结构--- 先进后出
使用列表来进行模拟栈结构
把要进行遍历的文件夹存在栈中要进行遍历的时候就在栈中把文件夹取出来
直到什么情况下不用进行遍历了当栈中没有 内容的时候结束遍历
代码示例:
import os
from collections import deque
def get_all_files_depth(path):
print("深度遍历路径:", path)
# 先声明一个栈 把要遍历的文件放在栈中
stack = [path]
while len(stack):
# 获取要进行遍历的文件夹
show_path = stack.pop()
filenames = os.listdir(show_path)
# 遍历
for filename in filenames:
# 拼接出完整路径
join_path = os.path.join(show_path, filename)
# 判断是否是文件
if os.path.isfile(join_path):
# 是 打印文件路径
print(join_path)
else:
# 不是 路径压如栈中
stack.append(join_path)
9.1.3广度遍历搜索
广度遍历--- 先把平级的遍历完成 再去进行下一级遍历
队列结构--单向队列
单向队列---有序的序列 先进先出 [类似于排队]
双向队列--- 两头都可以进也可以出
代码示例:
import os
from collections import deque
def get_all_files_span(path):
print("广度遍历路径:", path)
# 先声明一个单向队列 把要遍历的文件放在单向队列中
queue = deque([path])
while len(queue):
# 获取要进行遍历的文件夹
show_path = queue.popleft()
filenames = os.listdir(show_path)
# 遍历
for filename in filenames:
# 拼接出完整路径
join_path = os.path.join(show_path, filename)
# 判断是否是文件
if os.path.isfile(join_path):
# 是 打印文件路径
print(join_path)
else:
# 不是 路径压如栈中
queue.append(join_path)
9.1.4删除文件夹
注意:删除文件夹 删除的只能删除空目录
代码示例:
import os
def delete_dir(path):
if os.path.exists(path):
filenames = os.listdir(path)
# 遍历
for filename in filenames:
# 拼接
join_path = os.path.join(path, filename)
# 判断是否是文件
if os.path.isfile(join_path):
# 是 删除本文件
os.remove(join_path)
print("删除文件", join_path, "成功!")
else:
# 不是 递归删除文件夹内文件
delete_dir(join_path)
# 遍历完成 删除目标文件夹
os.rmdir(path)
else:
print(f'{path} 目录不存在')
9.2.文件读写
文件读写莫过于做以下操作:
1.打开文件
2.操作文件
3.保存文件
python的操作方式如下
9.2.1打开文件
open(文件路径, 操作文件的模式, 文件的编码方式)
打开文件并返回一个流。失败时引发操作错误。
操作文件的模式:
r -> read 对文件进行只读 文件不存在会报错
w -> write 对文件操作写的行为 文件不存在会先进行创建
注意:文件存在文件内容会被清空
a -> append 对文件操作写的行为文件不存在 会先进行创建文件存在 不做操作m默认为你写的时候内容是在原来的基础上追加的
注意:以r w a这种模式在程序中打开的话 在程序中是以字符串的数据来跟文件进行交流的
但是有些文件[图片音频视频]这些不能用字符串数据与其进行交互,需要采用字节数据, 使用字节模式时操作模式需要设置成 rb wb ab 以字节形式走的时候 文件的编码方式不设置
注意:
文件对于程序来说属于外界资源的,当不使用文件时 注意要进行关闭
9.2.2读取文件操作
方法演示:
read(size) 不给size赋值,默认读取文件内的所有内容
给size赋值:
以字符串数据进行交互, size表示的是读取字符的个数
以字节数据进行交互, size表示的是读取字节的个数
readline()
读取一行数据
readlines()
将文件中的数据按行全部读取出来,并且把每一行当做一个元素存放在列表中
readlines(hint)
hint
以字符串数据进行交互hint表示的是字符的个数
以字节数据进行交互hint表示的是字节的个数
还是读取行,读取到hint个数据所在的行数 把这些行的数据每一行当做一个元素放在列表中
分批读取文件:
import os
path = r'a.mp4'# 文件路径
file = open(path, 'rb')
# 获取文件的大小
filesize = os.path.getsize(path)
# 设置接受累计字节数的变量
has_read = 0
# 循环读取
while has_read < filesize:
data = file.read(1024 * 100)
print(data)
has_read += (1024 * 100)
file.close()
9.2.3.向文件中写入数据
write(数据)
如果是字符交流的话数据就是字符串类型
如果是以字节交接的话数据就是字节类型
writelines (列表)
在列表中放的要写入的多个数据[一个元素表示一个数据]
如果是字符交流的话元素就是字符串类型
如果是以字节交接的话元素就是字节类型
flush()
刷新缓存区加速写入
读写操作结合 -> 拷贝:
import os
with open(src_path, 'rb') as rfile, open(dest_path, 'wb') as wfile:
while has_read < file_size:
data = rfile.read(102400)
# 写
wfile.write(data)
wfile.flush()
has_read += 102400
9.2.4. with语句
为了解决手动关闭的问题的
使用with语句打开的文件不需要再手动关闭,操作完成之后会自行关闭的
格式:
with open() as 变量别名,open() as 变量别名 ...:
读写的操作
9.3.数据持久化
数据持久化 -> 将数据存储在磁盘文件上
Python提供了两个格式 pickle 和 json
9.3.1区别于特点:
1. JSON是一种文本序列化格式(它输出unicode文本,虽然大部分时间它被编码utf-8),而pickle是二进制序列化格式;
2.JSON是人类可读的,而pickle则不是;
3. JSON是可互操作的,并且在Python生态系统之外广泛使用,而pickle是特定于Python的;
pickle
以字节的形式存储任意格式的文件的所以打开文件的时候 要以字节模式打开
“Pickling”是将Python对象层次结构转换为字节流的过程, “unpickling”是反向操作,
代码示例:
import pickle
# with open('./data.txt', 'wb') as file:
# # 1. 写入的数据
# # 2. 写入到哪个文件
# pickle.dump(10 ,file)
# pickle.dump('10', file)
# pickle.dump([10, 20, 30], file)
'''
先写进去的 就先读出来
'''
with open('./data.txt', 'rb') as file:
# 在指定文件中加载数据
data = pickle.load(file)
print(data)
data = pickle.load(file)
print(data)
data = pickle.load(file)
print(data)
# EOFError: Ran out of input 读的多于写的了
# data = pickle.load(file)
# print(data)
json
一种轻量级的数据交换格式
js对象简谱 => JavaScript Object Notation
采用比较独立的编程语言以及数据格式来存储数据
9.3.2数据类型:
数据类型 Python数据
JSON对象 字典
JSON数组 列表
字符串 字符串
数值类型 数值
布尔类型 布尔
空对象null None
9.3.3json数据转换:
格式转换方面
json数据解析成python数据 json.loads (字符串格式的json数据)
python数据转化成json数据 json.dumps (Python数据)
和文件打交道的
把数据以json形式存储在文件中 json.dump(数据,文件)
在json文件中把数据读取解析成python数据 json.1oad(文件)
代码示例:
参照我的另外博客, 文件操作几个例子第三个
第五个json保存文件到本地
注意:
以json形式存储时 对象数据得是json可识别的
跟文件打交道时 是以字符的形式交流的
序列化
把程序中的数据存储在文件中的过程称为序列化
反序列化
将文件中的数据加载到程序中的过程称为反序列化