一、介绍与一些路径基本符号
os即 operating system (操作系统),python 的os模块封装了常见的文件和目录操作
斜杠("/")是linux 系统下的路径分隔符,和反斜杠("\")是windows 系统下的路径分隔符。
os.path模块主要用于文件属性的获取
相对路径:用正斜杆'/'
先区分"./"、"../"、"/"等符号
"./":代表目前所在的目录
"../":代表上一层目录
"/":代表根目录
绝对路径:用反斜杠'\'
举例:C:\Users\23202\Desktop
绝对路径也可以用'\\'
举例:C:\\Users\\23202\\Desktop
一般来说 \\ 是用在C语言字符串中用作路径使用,由于"\"在C语言中表示转义字符,所以C语言中表示路径用"\\",
当然在C语言中也可以用"/"来表示路径,如绝对路径举例的第一种
二、一些os.path模块方法
1.os.path.exists(file_path)
使用方法:
它会返回是否存在该文件
2.os.makedirs(file_path)
使用方法:
os.mkdir()与os.makedirs(),os.mkdir()用于创建单层目录,os.makedirs()用于创建多层目录
举例:
text.txt文件夹不存在
在当前目录创建文件夹text.txt
在刚刚创建的text.txt文件夹里面创建1这个文件夹
在当前目录不存在的test文件夹中直接创建1文件夹
3.os.getcwd()
该函数不需要传递参数,它返回当前的目录。需要说明的是,当前目录并不是指脚本所在的目录,而是所运行脚本的目录。
4.os.path.join()
1)如果各组件名首字母不包含’/’,则函数会自动加上
2)第一个以“/”开头的参数开始拼接,之前的参数全部丢弃,当有多个时,从最后一个开始
3)如果最后一个组件为空,则生成的路径以‘/’分隔符结尾
对应举例:
1)
2)
3)
5.os.path.isdir()
作用:判断是否是路径,需要传入的参数是绝对路径
举例:
6.os.listdir()
用法:输出参数路径的文件和文件夹列表
三、实践(基于花数据集的划分代码)
import os
from shutil import copy, rmtree
import random
def mk_file(file_path: str):
if os.path.exists(file_path):
# 如果文件夹存在,则先删除原文件夹在重新创建
rmtree(file_path)
os.makedirs(file_path)
def main():
# 保证随机可复现
random.seed(0)
# 将数据集中10%的数据划分到验证集中
split_rate = 0.1
# 指向你解压后的flower_photos文件夹
cwd = os.getcwd() # 获得当前所运行脚本路径
data_root = os.path.join(cwd, "flower_data")
origin_flower_path = os.path.join(data_root, "flower_photos")
# assert用来检查文件夹是否存在,不存在就输出后面语句"path '{}' does not exist.".format(origin_flower_path)
# 这里不存在就会报错path...\flower_data\flower_photos does not exist 存在就继续正常运行
assert os.path.exists(origin_flower_path), "path '{}' does not exist.".format(origin_flower_path)
# 遍历花图片所在目录下文件,判断是否是目录,建立目录列表
flower_class = [cla for cla in os.listdir(origin_flower_path)
if os.path.isdir(os.path.join(origin_flower_path, cla))]
# 建立保存训练集的文件夹
train_root = os.path.join(data_root, "train")
mk_file(train_root) # 创建文件夹
for cla in flower_class:
# 建立每个类别对应的文件夹
mk_file(os.path.join(train_root, cla))
# 建立保存验证集的文件夹
val_root = os.path.join(data_root, "val")
mk_file(val_root)
for cla in flower_class:
# 建立每个类别对应的文件夹
mk_file(os.path.join(val_root, cla))
for cla in flower_class:
cla_path = os.path.join(origin_flower_path, cla)
images = os.listdir(cla_path) # 返回每一个花类图片文件索引列表
num = len(images) # 该列表长度,也即图片数量
# 随机采样验证集的索引
# sample(lisk, k)返回一个长度为list的新列表,列表里面为图片对应索引
eval_index = random.sample(images, k=int(num*split_rate))
# 分配该花类别的每一张图片
for index, image in enumerate(images):
if image in eval_index:
# 将分配至验证集中的文件复制到相应目录
image_path = os.path.join(cla_path, image)
new_path = os.path.join(val_root, cla) # 验证集中花类的路径
copy(image_path, new_path) # 把图片复制到验证集
else:
# 将分配至训练集中的文件复制到相应目录
image_path = os.path.join(cla_path, image)
new_path = os.path.join(train_root, cla) # 训练集中花类的路径
copy(image_path, new_path) # 把图片复制到训练集
print("\r[{}] processing [{}/{}]".format(cla, index+1, num), end="") # processing bar
print()
print("processing done!")
if __name__ == '__main__':
main()