文件读取的高效方法与设计模式

简介: 文件读取的高效方法与设计模式

⭐️ 导言

软件开发中,经常需要处理各种类型的文件,包括文本文件(如JSON、CSV、TXT)、Excel 文件等。针对不同类型的文件,我们需要选择合适的方法来读取和处理文件内容。在本篇博客中,小编以python为例,设计一个读取不同文件的小案例。

⭐️ 文件读取方式

在 Python 中,我们通常使用内置的文件读取函数来读取不同类型的文件,例如:

使用 open() 函数来读取文本文件(如 TXT 文件)。

使用第三方库(例如 Pandas)来读取 Excel 文件、CSV 文件等。

⭐️ 设计模式和注册机制

设计模式和注册机制是软件工程中常用的技术手段,可以提高代码的可维护性、扩展性和灵活性。在处理文件读取问题时,设计模式和注册机制可以帮助我们更好地组织和管理文件读取器,使代码更加模块化和灵活。

工厂模式:

工厂模式是一种创建型设计模式,它通过工厂类来创建对象,而不需要在客户端直接实例化对象。在文件读取问题中,我们可以使用工厂模式来动态创建不同类型的文件读取器对象,根据文件类型动态选择合适的读取器。

class FileReaderFactory:
    def create_reader(self, file_extension):
        if file_extension == '.csv':
            return CsvFileReader()
        elif file_extension == '.json':
            return JsonFileReader()
        # 添加更多的文件类型和相应的读取器

注册机制:

注册机制是一种将对象注册到某个中心对象中的方法,然后在需要时根据标识符来获取相应的对象。在文件读取问题中,我们可以使用注册机制来注册和管理不同类型的文件读取器,然后根据文件类型获取相应的读取器。

class FileReaderRegistry:
    def __init__(self):
        self._readers = {}
    def register_reader(self, file_extension, reader):
        self._readers[file_extension] = reader()
    def get_reader(self, file_extension):
        reader = self._readers.get(file_extension)
        if reader is None:
            raise ValueError(f'不支持的文件类型: {file_extension}')
        return reader

通过使用工厂模式和注册机制,我们可以使代码更加灵活和可扩展,可以轻松地添加新的文件类型和相应的读取器,而不需要修改现有的代码。这种设计方式使得我们能够更好地应对变化和需求的变更,提高代码的可维护性和可扩展性。

⭐️ python装饰器

理解装饰器的原理对于理解如何在设计模式和注册机制中使用装饰器非常重要。装饰器是一种 Python 特性,允许在不修改原函数的情况下,为函数动态地添加额外的功能。其基本原理是将一个函数作为参数传递给另一个函数,并返回一个新的函数,该新函数包含了原函数的功能以及额外的功能。

在设计模式和注册机制中,我们可以使用装饰器来为类的方法添加额外的功能,例如日志记录、性能监控、权限验证等。这样可以使代码更加模块化和灵活,不需要修改原有的类和方法,就可以为其添加新的功能。

当我们在注册文件读取器时使用装饰器时,实际上是将原始的读取方法作为参数传递给装饰器函数,然后在装饰器函数中创建一个新的函数,该新函数包含了原始的读取方法以及额外的功能,例如日志记录。最后,装饰器函数返回这个新的函数,该新函数取代了原始的读取方法,实现了为读取方法添加额外功能的目的。

深度学习中,MMDetection框架也用到了注册机制,有兴趣的读者可以深入研究啊

⭐️ 完整代码

import json
import csv
import pandas as pd
class FileReaderRegistry:
    def __init__(self):
        self._readers = {}
    def register_reader(self, file_extension):
        def decorator(reader):
            self._readers[file_extension] = reader()
            return reader
        return decorator
    def get_reader(self, file_extension):
        reader = self._readers.get(file_extension)
        if reader is None:
            raise ValueError(f'不支持的文件类型: {file_extension}')
        return reader
registry = FileReaderRegistry()
@registry.register_reader('.json')
class JsonFileReader:
    def read(self, file_path):
        with open(file_path, 'r') as file:
            data = json.load(file)
        return data
@registry.register_reader('.csv')
class CsvFileReader:
    def read(self, file_path):
        data = []
        with open(file_path, 'r') as file:
            csv_reader = csv.reader(file)
            for row in csv_reader:
                data.append(row)
        return data
@registry.register_reader('.xlsx')
class ExcelFileReader:
    def read(self, file_path):
        data = pd.read_excel(file_path)
        return data
@registry.register_reader('.txt')
class TextFileReader:
    def read(self, file_path):
        with open(file_path, 'r') as file:
            data = file.read()
        return data
if __name__ == "__main__":
    # 使用注册机制读取文件
    file_path = 'temp.csv'
    file_extension = '.' + file_path.split('.')[-1]
    reader = registry.get_reader(file_extension)
    data = reader.read(file_path)
    print(f'文件 {file_path} 内容:', data)

文件在我的资源中可以找到。

笔者水平有限,若有不对的地方欢迎评论指正!

相关文章
|
10月前
|
设计模式 存储 Python
【从零学习python 】46. Python中的__new__和__init__方法解析及单例设计模式
【从零学习python 】46. Python中的__new__和__init__方法解析及单例设计模式
44 0
|
11月前
|
设计模式 C++
面向对象方法-大话设计模式+J2SE视频
面向对象方法-大话设计模式+J2SE视频
|
11月前
|
设计模式 算法 Java
Go 语言实现模版方法设计模式
在Go语言中,可以使用接口和组合来实现模板方法模式。模板方法模式是一种行为设计模式,它定义了一个算法的骨架,将一些步骤的实现延迟到子类中。下面是一个示例代码,演示了如何在Go中实现模板方法模式
148 0
|
设计模式 领域建模 数据库
提升代码质量的方法:领域模型、设计原则、设计模式
提升代码质量的方法:领域模型、设计原则、设计模式
|
设计模式 算法 Java
0202年了!你还不知道模版方法设计模式?
0202年了!你还不知道模版方法设计模式?
|
设计模式 安全 算法
Java多线程(二)、线程的生命周期、线程的同步、Synchronized的使用方法、同步代码块、同步方法、同步机制中的锁、同步的范围、Lock(锁、不会释放锁的操作、单例设计模式之懒汉式(线程安全)
Java多线程(二)、线程的生命周期、线程的同步、Synchronized的使用方法、同步代码块、同步方法、同步机制中的锁、同步的范围、Lock(锁、不会释放锁的操作、单例设计模式之懒汉式(线程安全)
Java多线程(二)、线程的生命周期、线程的同步、Synchronized的使用方法、同步代码块、同步方法、同步机制中的锁、同步的范围、Lock(锁、不会释放锁的操作、单例设计模式之懒汉式(线程安全)
|
设计模式 Kubernetes Java
提升代码质量的方法:领域模型、设计原则、设计模式
我们可以列举出非常多质量差的代码的表现现象,其中最影响代码质量的两个表现是命名名不副实、逻辑可扩展性差,当一个新人阅读代码时,有时发现方法命名与实际逻辑对不上,这就让人感到非常疑惑,这种现象在平时工作并不少见;另一个就是逻辑扩展性差,一个新业务需求提出来后,发现要在多处改动,需要回归的业务逻辑比较多,造成研发效率不高。
提升代码质量的方法:领域模型、设计原则、设计模式
|
设计模式 Java
Java中抽象类的应用——模版方法的设计模式
Java中抽象类的应用——模版方法的设计模式
82 0
|
设计模式 存储 Java
java7 --1 static关键字,main方法详解,单例设计模式,继承,super关键字,instanceof关键字,final关键字
java7 --1 static关键字,main方法详解,单例设计模式,继承,super关键字,instanceof关键字,final关键字
140 0
|
3天前
|
设计模式 存储 算法
设计模式学习心得之五种创建者模式(2)
设计模式学习心得之五种创建者模式(2)
12 2