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

⭐️ 导言

在软件开发中,经常需要处理各种类型的文件,包括文本文件(如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)

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/467953.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Windows 常用工具系列 15 -- VMWARE ubuntu 安装教程】

文章目录 安装教程镜像下载 工具安装 安装教程 安装教程参考链接:https://blog.csdn.net/Python_0011/article/details/131619864 https://linux.cn/article-15472-1.html 激活码 VMware 激活码连接:https://www.haozhuangji.com/xtjc/180037874.html…

工控MCGS触摸屏Hacking勒索部署

https://github.com/MartinxMax/Mo0n_V1.2 !!不关注点赞收藏,以后没好东西了奥!! 端口扫描-获取信息 $python Mo0n.py -scan x.x.x.0/24 or $nmap -sS -Pn -T4 x.x.x.0/24 -p 127 MCGS编程软件 发现触摸屏受到密码保护 Oops!!! echo /\_…

基于深度学习YOLOv8+Pyqt5的工地安全帽头盔佩戴检测识别系统(源码+跑通说明文件)

wx供重浩:创享日记 对话框发送:318安全帽 获取完整源码源文件7000张已标注的数据集训练好的模型配置说明文件 可有偿59yuan一对一远程操作配置环境跑通程序 效果展示(图片检测批量检测视频检测摄像头检测) 基于深度学习YOLOv8Pyqt…

【Excel自动化办公】使用openpyxl对Excel进行读写操作

目录 一、环境安装 1.1 创建python项目 1.2 安装openpyxl依赖 二、Excel数据读取操作 三、Excel数据写入操作 3.1 创建空白工作簿 3.2 写数据 四、设置单元格样式 4.1 字体样式 4.2 设置单元格背景填充色 4.3 设置单元格边框样式 4.4 单元格对齐方式 4.5 数据筛选…

B008-springcloud alibaba 短信服务 sms

目录 短信服务介绍短信服务使用准备工作阿里云官网实名认证开通短信服务申请认证秘钥申请短信签名申请短信模板 短信服务API介绍短信发送(SendSms)短信查询(QuerySendDetails)功能测试 下单之后发送短信 短信服务介绍 短信服务(Short Message Service)是…

08-热点文章-定时计算-黑马头条

xxl-Job分布式任务调度 1 今日内容 1.1 需求分析 目前实现的思路:从数据库直接按照发布时间倒序查询 问题1: 如何访问量较大,直接查询数据库,压力较大 问题2: 新发布的文章会展示在前面,并不是热点文章 …

SpringCloud搭建微服务之Micrometer分布式链路追踪

1. 概述 由于Spring Cloud Sleuth最新版本只支持Spring Boot 2.7.x,核心项目已经迁移到Micrometer Traceing项目,Spring Boot 3.x版本要实现分布式链路追踪需要集成Micrometer。更多详情可以参阅Micrometer官网 本文将以Spring Boot 3.2.x和Spring Clo…

Cinema 4D 2024 for mac/Win:开启三维动画与建模新纪元

在数字化时代,三维动画与建模已成为影视、游戏、广告等多个领域不可或缺的创作工具。而Cinema 4D,作为这一领域的佼佼者,始终以其卓越的性能和创新的功能引领着行业的发展。如今,Cinema 4D 2024的发布,更是为我们带来了…

【command not found】原因分析及解决

在使用Linux时,会经常遇到 “command not found” 的错误。错误信息提示的是:Linux没有找到该命令。原因主要分类有: 1.命令拼写错误 2.软件路径配置错误 3.Linux 系统就没有安装该命令。 一、确认命令没有拼写错误 Linux 中的所有命令都是…

使用CSS的object-position实现图片在img标签中的定位

在CSS中&#xff0c;object-position属性它允许我们精确地控制替换元素&#xff08;如<img>、<video>等&#xff09;内容在其容器内的位置。通过指定水平和垂直方向的偏移量&#xff0c;可以轻松地调整元素内容在容器内的起始点&#xff0c;实现精准定位。 1 语法…

Poly Kernel Inception Network在遥感检测中的应用

摘要 https://export.arxiv.org/pdf/2403.06258 遥感图像&#xff08;RSI&#xff09;中的目标检测经常面临一些日益严重的挑战&#xff0c;包括目标尺度的巨大变化和多样的上下文环境。先前的方法试图通过扩大骨干网络的空间感受野来解决这些挑战&#xff0c;要么通过大核卷积…

嵌入式-4种经典继电器驱动电路-单片机IO端口/三极管/达林顿管/嵌套连接

文章目录 一&#xff1a;继电器原理二&#xff1a;单片机驱动电路三&#xff1a;经典继电器驱动电路方案3.1 继电器驱动电路方案一&#xff1a;I/O端口灌电流方式的直接连接3.1.1 方案一的继电器特性要求3.1.2 方案一可能会损坏I/O口 3.2 继电器驱动电路方案二&#xff1a;三极…

深度学习-part3(反向传播、GAN)

5. 反向传播 5.1 什么是反向传播&#xff1f;‍ 通俗解释&#xff1a;类比几个人站成一排&#xff0c;第一个人看一幅画&#xff08;输入数据&#xff09;&#xff0c;描述给第二个人&#xff08;隐层&#xff09;……依此类推&#xff0c;到最后一个人&#xff08;输出&…

EDI在汽车主机厂配送流程中的应用

汽车主机厂的汽车配送流程始于汽车 “生产结束 ” &#xff0c;止于 “交付给经销商 ” 。在这个流程中&#xff0c;企业作为主机厂的下游供应商&#xff0c;与主机厂的物流服务供应商之间的信息交换将会变得十分重要。 配送流程&#xff1a;运输订单以及报告 汽车主机厂提供预…

Elasticsearch8.x版本Java客户端Elasticsearch Java API 如何并发修改

前言 并发控制&#xff0c;一般有两种方案&#xff0c;悲观锁和乐观锁&#xff0c;其中悲观锁是默认每次更新操作肯定会冲突&#xff0c;所以每次操作都要先获取锁&#xff0c;操作完毕再释放锁&#xff0c;适用于写比较多的场景。而乐观锁是默认每次更新操作都不会冲突&#…

完成系统支持Github三方登录

文章目录 1、需求2、在对接系统中完成客户端注册3、创建客户端应用4、CommonOAuth2Provider SpringSecurity OAuth2.0文档&#xff1a; https://docs.spring.io/spring-security/reference/servlet/oauth2/index.html 1、需求 对接Github&#xff0c;在自己系统实现支持Githu…

【C++初阶】第七站:string类的初识(万字详解、细节拉满)

前言&#xff1a; &#x1f4cd;本文知识点&#xff1a;string的初识 本专栏&#xff1a;C 目录 一、什么是STL 二、STL的六大组件 三、STL的缺陷 四、为什么学习string类&#xff1f; 五、标准库中的string类 1、string类(了解) 2、string类的常用接口说明&#xff08;…

Trent电源设计那些事儿教学

本课程将深入探讨Trent电源设计的关键概念与技术。学生将学习功率电子器件和拓扑、电路保护、稳压技术以及EMI滤波等内容。通过理论和实践相结合的教学方式&#xff0c;帮助学员掌握Trent电源设计的原理与应用。 课程大小&#xff1a;12.5G 课程下载&#xff1a;https://down…

计算机网络——物理层(物理传输介质和物理层的设备)

计算机网络——物理层&#xff08;物理传输介质和物理层的设备 物理传输介质导向性传输介质双绞线同轴电缆光纤 非导向性传输介质无线电波多径效应 微波地面微波通信ISM 频段 卫星通信 物理层设备中继器集线器中继器和集线器的区别 我们今天进入物理层的物理传输介质和物理层的…

idea项目配置文件中文乱码

问题&#xff1a; 解决方案&#xff1a;修改字符编码。在IntelliJ IDEA的设置中&#xff0c;依次选择File、Settings、Editor、File Encodings&#xff0c;将Global Encoding、Project Encoding、Default encoding for properties files设置为UTF-8 问题解决~~