首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

file | 某文件夹【解耦合】下的文件查找功能实现及功能单元测试

  • 25-03-08 00:43
  • 3168
  • 13145
blog.csdn.net

文件查找工具

  • 概要
  • 思路
  • OS模块 --- 学习版
    • os.getcwd()
    • os.path.dirname(os.getcwd())
    • os.path.dirname() 和 os.path.basename()
  • OS模块 — 实战版
      • 单元测试
        • 解耦合

概要

  • 梳理业务主逻辑:
  1. 查看存放被采集JSON数据的文件夹内的文件列表【所有 包含文件夹下的文件夹下的文件】
    这是本节内容聚焦的点
  2. 和MySQL内记录的信息做比对,判断哪些文件是新文件,需要采集的。
  3. 读取JSON文件,执行ETL操作(读取->写入CSV->写入MySQL(目的地库))。
  4. 将被处理的JSON信息,记录到MySQL数据库(元数据库)

思路

读取某个文件中的文件名--------------------set()

读取数据库中已经处理过的文件名称-----set()
做处理 – 得到未处理过的文件名-----------set()-set()

如何处理?

  • 思路1:集合相减得到的结果是在第一个集合且不在第二个集合中的元素
  • 思路2: for循环

在这里插入图片描述

OS模块 — 学习版

  • 耦合

和固定路径绑定在一起,若是将这部分代码给其他人,他们需要创建对应文件夹才可以使用

# 学习OS 接口模块
import os

# 输出文件下的子文件  - 不包括子文件下的文件 仅返回子文件夹的名称
files = os.listdir(r'E:\pythonProject\ETL\day04_商品数据采集\04_数据\采集JSON')
print(files)

# 输出文件下的子文件 包括子文件夹呢?
# 递归调用
def read_dir(dir):
    results =[]
    files = os.listdir(dir)
    for file in files:
        # 判断是否是目录
        if os.path.isdir(file):
            results += read_dir(dir+'/'+file)
        else:
            results.append(dir+'/'+file)

    return results
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 调用

print(read_dir(os.getcwd()))

['E:\\pythonProject\\pythonetl\\learning/learning_os.py', 'E:\\pythonProject\\pythonetl\\learning/learning_time.py', 'E:\\pythonProject\\pythonetl\\learning/learning_unittest.py', 'E:\\pythonProject\\pythonetl\\learning/learn_logging.py', 'E:\\pythonProject\\pythonetl\\learning/log_t1.py', 'E:\\pythonProject\\pythonetl\\learning/mycode.py']

  • 1
  • 2

当前路径E:\pythonProject\pythonetl\learning\learning_os.py,在learning_os.py中执行以下代码

os.getcwd()

print('getcwd',os.getcwd())
  • 1

getcwd E:\pythonProject\pythonetl\learning

os.path.dirname(os.getcwd())

print('dirname',os.path.dirname(os.getcwd()))
  • 1

dirname E:\pythonProject\pythonetl

os.path.dirname() 和 os.path.basename()

stra = ['E:\pythonProject\pythonetl']
for i in stra:
    print(os.path.dirname(i))
    print(os.path.basename(i))
  • 1
  • 2
  • 3
  • 4

E:\pythonProject
pythonetl

OS模块 — 实战版

  • 在until文件夹下创建filr_until.py文件
import os

def get_dir_files_list(path="./",recursive=False):
    # 判断文件夹下面,有哪些文件
    # :param path:被判断的文件夹的路径,默认当前路径
    # :param recursive:是否递归读取,默认不递归
    # :return:1ist对象,list里面存储的是文件的路径

    #os.listdir这个API返回的是你给定的path下面有哪些`文件和文件夹`、
    dir_names = os.listdir(path)
    # print('dir_names',dir_names)
    # if not dir_names:
    #     return os.path.basename(path)
    files =[]
    #定义一个list,用来记录文件
    for dir_name in dir_names:
        absolute_path = f"{path}/{dir_name}"
        if not os.path.isdir(absolute_path):
            # print('not a dir')
            #如果进来这个if,表明这个是:文件
            files.append(absolute_path)
        else:
            # print('is a dir')
            #表明是文件夹
            if recursive:
                #如果recursive是True,表明要进到文件夹里面继续找文件
                files += get_dir_files_list(absolute_path,recursive)
    return files
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

单元测试

  • test文件夹下的test_file_until.py文件
    在这里插入图片描述
import os.path
from unittest import TestCase
from util.file_util import get_dir_files_list


class TestFileUtil(TestCase):
    # 确定手动创建的测试目录的绝对路径
    def setUp(self) -> None: # 测试前需要提前执行的代码  例如连接数据库
        self.project_root_path = os.path.dirname(os.getcwd())
        print('解耦合获得路径:',self.project_root_path)
        pass

    def test_myfunc(self): # 要以test开头运行
        # 测试get_dir_files_list 函数
        # 该以哪一个作为我们的测试目录
        # 解耦合  ---
        '''
        请在工程根目录的test文件夹内建立:
        test_dir /
            inner1 /
                iner2 /
                    innner3/
                    5
                3
                4
            1
            2
        的目录结构用于进行此方法的单元测试
        不递归结果应该是1和2
        递归结果应该是1, 2, 3, 4, 5
        '''

        # 测试没有开启递归调用的代码
        result1 = get_dir_files_list(
            path = self.project_root_path + '/' + 'test_dir',
            recursive=False
        )

        predicted_result= ['1', '2']
        # self.assertEqual(results, predicted_result)
        result_1 = []
        for p in predicted_result:
            result_1.append(self.project_root_path + '/' + 'test_dir'+'/'+p)

        # 排除顺序对结果的影响
        result1.sort()
        result_1.sort()
        # 这里断言 函数获得的结果和预期的结果路径是一致的
        self.assertEqual(result1, result_1)


        # 测试开启递归调用的代码  不包括inner3这种情况
        result2 = get_dir_files_list(
            path = self.project_root_path + '/' + 'test_dir',
            recursive=True
        )
        predicted_result = ['1', '2','inner1/3','inner1/4','inner1/inner2/5',]
        # 若是  'inner1/4','inner1/3'  则会出现错误   因此 我们要加上一道保险  调整顺序
        # 使用sort()函数  没有返回值
        result_2 = []
        for p in predicted_result:
            result_2.append(self.project_root_path + '/' + 'test_dir'+'/'+p)

        result2.sort()
        result_2.sort()
        self.assertEqual(result2, result_2)


        # 测试开启递归调用的代码  测试空文件夹  针对 inner3这种情况
        '''
        实际上输出  不应该出现  'E:\\pythonProject\\pythonetl/test_dir/inner1/inner2/inner3'这种情况
        因为我们遍历的是可以用的文件   而非目录     所以想办法排除目录
        '''
        result3 = get_dir_files_list(
            path = self.project_root_path + '/' + 'test_dir',
            recursive=True
        )
        predicted_result = ['1', '2','inner1/3','inner1/4','inner1/inner2/5','inner1/inner2/inner3'] #
        # 若是  'inner1/4','inner1/3'  则会出现错误   因此 我们要加上一道保险  调整顺序
        # 使用sort()函数  没有返回值
        result_3 = []
        for p in predicted_result:
            result_3.append(self.project_root_path + '/' + 'test_dir'+'/'+p)
            #
            if os.path.isdir(result_3[-1]):
                if not os.listdir(result_3[-1]):
                    result_3.pop(-1)

        result3.sort()
        result_3.sort()
        self.assertEqual(result3, result_3)

    def tearDown(self)-> None: # 收尾工作
        pass
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
解耦合

在软件开发中,解耦合(Decoupling)是指减少或去除系统中各组件之间的相互依赖关系,以提高系统的灵活性和可维护性。

解耦合的目标是创建松散耦合的系统,其中每个组件或模块都可以独立于其他组件进行开发、测试和维护。

例如:

我的一个系统的文件路径是绝对路径, 若是我将该系统给另一个人,他会因为文件夹是否存在的问题而出现报错的风险,因此我们要做解耦合的措施

胜天半月子
微信公众号
讲述自己学习过程的心得、体会!
注:本文转载自blog.csdn.net的胜天半月子的文章"https://blog.csdn.net/HG0724/article/details/141895467"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

127
测试
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top