问题小记--第2篇: os常用模块

1. 创建文件夹

import os

1. 创建文件夹
os.makedirs(new_dir)

实例:
os.makedirs("./data")

函数:
# 判读路径下是否存在文件夹,没有则创建
def makedir(new_dir):
    if not os.path.exists(new_dir):
        os.makedirs(new_dir)

2. 目录与路径拼接

import os

1. 返回当前目录
	os.getcwd()
	
2. 判断路径是否为目录
	os.path.isdir(path) 

3. 判断路径是否为文件
	os.path.isfile(path) 

4. 路径拼接
	os.path.join(path)

实例:
os.path.join("..","data", "RMB_data")
# 拼接结果
'../data/RMB_data'  

5. 获取路径下的文件名列表,返回列表形式
	os.listdir(path)

实例:
os.listdir(os.path.join("..", "data"))
# 获取文件名结果
['0NP96EGY.jpg', '0GRZFSDG.jpg', '08C3EHPG.jpg', '0DRZXTK3.jpg', '0GPYRDQM.jpg', '01LNYXO4.jpg', '073LW92O.jpg', '0OFE6MSI.jpg', '0FA8LD9Z.jpg', '0MNY59BW.jpg']

3. 遍历目录与子文件

os.walk方法,主要用来遍历一个目录内各个子目录和子文件

语法:
	os.walk(top)
	top -- 是你所要遍历的目录的地址

功能:
	os.walk(top) 返回的是一个三元组(root,dirs,files)
参数:
    - root 所指的是当前正在遍历的这个文件夹的本身的地址
    - dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录)
    - files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)

实例:
for root, dirs, files in os.walk( dataset_dir ):
	print(root)
	print(dirs)
	print(files)

# 结果,有两个文件夹,循环3次
/home/guofeng/桌面/pytorch学习/DataLoader/split_data/test_data
['1', '100']
[]

/home/guofeng/桌面/pytorch学习/DataLoader/split_data/test_data/1
[]
['0NP96EGY.jpg', '0GRZFSDG.jpg', '08C3EHPG.jpg', '0DRZXTK3.jpg', '0GPYRDQM.jpg', '01LNYXO4.jpg', '073LW92O.jpg', '0OFE6MSI.jpg', '0FA8LD9Z.jpg', '0MNY59BW.jpg']

/home/guofeng/桌面/pytorch学习/DataLoader/split_data/test_data/100
[]
['04W3GHSB.jpg', '0LIKD2CE.jpg', '02OE5LH4.jpg', '05NY9E4L.jpg', '0WRGMZ5Y.jpg', '0PDHIO85.jpg', '0NR17KZY.jpg', '06NEIRC4.jpg', '0R6X4SO8.jpg', '0ZA9M8E2.jpg']

4. 过滤序列后缀

功能:
	用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表.
语法:
	filter(function, iterable)
	第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到新列表中.

实例:
	imgs = os.listdir(os.path.join(root, sub_dir))      # 返回文件夹下的文件名列表
	imgs = list( filter( lambda x: x.endswith('.jpg'), imgs ) )  # 过滤掉不是以.jpg结尾的文件

其中, endswith() 方法用于判断字符串是否以指定后缀结尾,如果以指定后缀结尾返回True,否则返回False

5. copy文件

import shutil

copy文件函数:
	shutil.copy(src_path, target_path)
参数:
	src_path  表示原始文件(包含路径);
	target_path表示目标文件(包含路径);

实例: 
src_path = os.path.join("/home/wind/src_data/1.jpg") # 原始图像文件
target_path = os.path.join("/home/wind/target_data/1.jpg")    # 目标文件 

shutil.copy(src_path, target_path)   # 实现copy

6. 数据分割实例

import os
import random
import shutil

random.seed(1)  # 设置随机数种子,保证每次运行的随机数都相同

# 判读路径下是否存在文件夹,没有则创建
def makedir(new_dir):
    if not os.path.exists(new_dir):
        os.makedirs(new_dir)

if __name__ == "__main__":
    
    dataset_dir = os.path.join("..", "data", "RMB_data")   # 原始数据存放路径
    split_dir = os.path.join(".", "split_data")            # 划分后数据集的李静
    train_dir = os.path.join(split_dir, "train_data")      
    vaild_dir = os.path.join(split_dir, "vaild_data")
    test_dir = os.path.join(split_dir, "test_data")

    train_pct = 0.7
    vaild_pct = 0.2
    test_pct = 0.1

    # os.walk(), 会获取文件夹的路径, 以及路径下的文件夹目录名, 文件名
    for root, dirs, files in os.walk( dataset_dir ):
        for sub_dir in dirs:

            imgs = os.listdir(os.path.join(root, sub_dir))      # 返回文件夹下的文件名列表
            imgs = list( filter( lambda x: x.endswith('.jpg'), imgs ) )  # 过滤掉不是以.jpg结尾的文件
            random.shuffle(imgs)   # 随机打乱列表的顺序
            img_count = len(imgs)  # 统计列表中的数量

            train_point = int(img_count * train_pct)  # 划分训练集的数量
            vaild_point = int(img_count * vaild_pct)  # 划分验证集的数量
            
            for i in range(img_count):
                if i < train_point:
                    out_dir = os.path.join(train_dir, sub_dir)
                elif i < (train_point + vaild_point):
                    out_dir = os.path.join(vaild_dir, sub_dir)
                else :
                    out_dir = os.path.join(test_dir, sub_dir)

                makedir(out_dir)

                src_path = os.path.join(root, sub_dir, imgs[i]) # 原始图像文件的路径
                target_path = os.path.join(out_dir, imgs[i])    # 创建copy的目标文件

                shutil.copy(src_path, target_path)   # 从一个路径到另一个路径copy文件
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值