精准读取CSV/Excel数据 - 灵活指定行列范围的 Python 解决方案

文章目录

  • 源代码
  • 项目简介
  • 导入相关库
  • __file_exists 装饰器
  • 函数的签名和注释
  • 主要功能的实现
  • 运行演示
  • 读取 Excel 文件

源代码

https://github.com/ma0513207162/PyPrecip。pyprecip\reading\read_api.py 路径下。

项目简介

PyPrecip 是一个专注于气候数据处理的 Python 库,旨在为用户提供方便、高效的气候数据处理和分析工具。该库致力于处理各种气候数据,并特别关注于降水数据的处理和分析。

在这里插入图片描述

导入相关库

在这里,读取 csv 和 excel 文件分别使用 csv 库和 openpyxl 库。utits 路径下是笔者自定义的一些工具函数,在源码中可以找到。

import os, csv 
from openpyxl import load_workbook
from ..utits.except_ import RaiseException as exc 
from ..utits.warn_ import RaiseWarn as warn 
from ..utits.sundries import check_param_type

__file_exists 装饰器

一个简易的 python 装饰器 __file_exists,用于检测 path 参数有无正常输入,否则抛出自定义异常。

def __file_exists(func):def wrapper(*args, **kwargs):     if not args and not kwargs:exc.raise_exception("The file path is required.", TypeError) return func(*args, **kwargs)return wrapper 

函数的签名和注释

  • 以 read_csv 函数为示例,定义了一些必要的参数。
  • by_row 参数表示是否按行读取数据。
  • 其中 row_indices 和 column_indices 参数为 tuple 类型时,表示指定行索引或列索引。指定为 list 类型时,表示指定行范围或列范围。
  • check_param_type 函数负责检查参数的类型。
@__file_exists    
def read_csv(path: str, by_row: bool = False, row_indices: (tuple|list) = (), column_indices: (tuple|list) = ()): """     Reads data for specified rows and columns from a CSV file.Parameters:- path: indicates the path of the CSV file- row_indices: Specifies the read row range (list length 2) or row index (tuple)- column_indices: specifies the read column range (list length 2) or column index (tuple)- by_row: If True, read the file by rows (default). If False, read the file by columns.Returns:- Dictionary. The key indicates the file name and the value indicates the read data"""# 检查参数类型 check_param_type(path, str, "path");check_param_type(row_indices, (tuple|list), "row_indices"); check_param_type(column_indices, (tuple|list), "column_indices");

主要功能的实现

根据传入的 row_indices 和 column_indices 参数搭配 zip 函数进行行列的转换, 使用切片和索引操作从原始 CSV 数据中提取指定的行列数据区域。这里最大的特点就是避免了使用大量的 for 循环进行同样功能的实现。

	read_csv_result: dict = {}; with open(path, "r", encoding="gbk") as csv_file:reader_csv = list(csv.reader(csv_file)) # 指定行范围  if isinstance(row_indices, list) and row_indices != []:if len(row_indices) == 2:start, end = row_indices[0], row_indices[1]reader_csv = reader_csv[start-1: end]else:warn.raise_warning("The row_indices parameter must contain only two elements, otherwise it is invalid.") # 指定行索引 if isinstance(row_indices, tuple) and row_indices != ():row_idx_list = []for idx in row_indices:if idx >= 1 and idx <= len(reader_csv):row_idx_list.append(reader_csv[idx-1]) else:exc.raise_exception("The index must be greater than 0 and less than the sequence length.", IndexError)reader_csv = row_idx_list; # list 类型指定行范围reader_csv = list(zip(*reader_csv)) if isinstance(column_indices, list) and column_indices != []:if len(column_indices) == 2:start, end = column_indices[0], column_indices[1]; reader_csv = reader_csv[start-1: end]else:warn.raise_warning("The column_indices parameter must contain only two elements, otherwise it is invalid.") # tuple 类型指定列索引 if isinstance(column_indices, tuple) and column_indices != ():col_idx_list = [] for idx in column_indices:if idx >= 1 and idx <= len(reader_csv):col_idx_list.append(reader_csv[idx-1]); else:exc.raise_exception("The index must be greater than 0 and less than the sequence length.", IndexError)reader_csv = col_idx_list;# 按行读取 if by_row:reader_csv = list(zip(*reader_csv)) # 封装 dict 对象file_name = os.path.splitext(os.path.basename(path))[0]; read_csv_result[file_name] = reader_csv; return read_csv_result;

运行演示

# 以主进程的方式运行 
if __name__ == "__main__": path = "./static/test_data.xlsx"read_result = read_excel(path=path, row_indices=(1,3), column_indices=[1,5]);for key in read_result:for value in read_result[key]:print(value)

在这里插入图片描述

读取 Excel 文件

同样的逻辑,也适用于读取 Excel 文件。

@__file_exists    
def read_excel(path: str, by_row: bool = False,  sheet_names: tuple = (), row_indices: (tuple|list) = (),column_indices: (tuple|list) = ()) -> dict: """Reads data from a specified worksheet, row, and column from an Excel file.Parameters:- path: indicates the Excel file path- sheet_names: A tuple of sheet names to be read. If empty, the active sheet is read- row_indices: Specifies the read row range (list length 2) or row index (tuple)- column_indices: specifies the read column range (list length 2) or column index (tuple)- by_row: If True, read the file by rows (default). If False, read the file by columns.Return:- Dictionary. The key is the name of the worksheet and the value is the read data"""# 检查参数类型 check_param_type(path, str, "path");check_param_type(sheet_names, tuple, "sheet_names");check_param_type(row_indices, (tuple|list), "row_indices"); check_param_type(column_indices, (tuple|list), "column_indices");workbook = load_workbook(filename = path, data_only = True) # Gets the specified worksheet sheet_list = []if sheet_names != ():for sheet_name in sheet_names:sheet_list.append(workbook[sheet_name])else:sheet_list.append(workbook.active) read_excel_result: dict = {}; # 遍历工作簿 sheet_listfor sheet in sheet_list:sheet_iter_rows: list = list(sheet.iter_rows(values_only = True)) # 指定行范围 if isinstance(row_indices, list) and row_indices != []:if len(row_indices) == 2:start, end = row_indices[0], row_indices[1] sheet_iter_rows = sheet_iter_rows[start-1: end]else:warn.raise_warning("The row_indices parameter must contain only two elements, otherwise it is invalid.") # 指定行索引 if isinstance(row_indices, tuple) and row_indices != ():temp_iter_rows = []for idx in row_indices:if idx >= 1 and idx <= len(sheet_iter_rows):temp_iter_rows.append(sheet_iter_rows[idx-1]) else:exc.raise_exception("The index must be greater than 0 and less than the sequence length.", IndexError)sheet_iter_rows = temp_iter_rows   # list 类型指定行范围sheet_iter_cols = list(zip(*sheet_iter_rows)) if isinstance(column_indices, list) and column_indices != []:if len(column_indices) == 2:start, end = column_indices[0], column_indices[1]; sheet_iter_cols = sheet_iter_cols[start-1: end]  else:warn.raise_warning("The column_indices parameter must contain only two elements, otherwise it is invalid.")   # tuple 类型指定列索引 if isinstance(column_indices, tuple) and column_indices != ():col_idx_list = [] for idx in column_indices:if idx >= 1 and idx <= len(sheet_iter_cols):col_idx_list.append(sheet_iter_cols[idx-1]); else:exc.raise_exception("The index must be greater than 0 and less than the sequence length.", IndexError)sheet_iter_cols = col_idx_list; # 是否按行读取 if by_row:sheet_iter_cols = list(zip(*sheet_iter_cols)) read_excel_result[sheet.title] = sheet_iter_cols; return read_excel_result;  

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring 当中的Bean 作用域

Spring 当中的Bean 作用域 文章目录 Spring 当中的Bean 作用域每博一文案1. Spring6 当中的 Bean的作用域1.2 singleton 默认1.3 prototype1.4 Spring 中的 bean 标签当中scope 属性其他的值说明1.5 自定义作用域&#xff0c;一个线程一个 Bean 2. 总结:3. 最后&#xff1a; 每…

蓝桥杯练习系统(算法训练)ALGO-947 贫穷的城市

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 某城市有n个小镇&#xff0c;编号是1~n。由于贫穷和缺乏城市规划的人才&#xff0c;每个小镇有且仅有一段单向的公路通往别…

【数学】三角函数相关

目录 一、三角函数 二、诱导公式 1.介绍 2.示例 三、其它重要公式 ID&#xff1a;HL_5461 一、三角函数 对于如图所示三角形&#xff1a; 三角函数公式表达其它关系正弦函数/余弦函数/正切函数余切函数正割函数余割函数 二、诱导公式 1.介绍 奇变偶不变&#xff0c;符…

微信小程序 手机号授权登录

手机号授权登录 效果展示 这里面用的是 uni-app 官方的登录 他支持多端发布 https://zh.uniapp.dcloud.io/api/plugins/login.html#loginhttps://zh.uniapp.dcloud.io/api/plugins/login.html#login 下面是代码 <template><!-- 授权按钮 --><button v-if&quo…

Spring+Vue的卓越托管中心管理系统的设计与实现+PPT+论文+讲解+售后

相比于以前的传统手工管理方式&#xff0c;智能化的管理方式可以大幅降低运营人员成本&#xff0c;实现了卓越托管中心管理系统的标准化、制度化、程序化的管理&#xff0c;有效地防止了卓越托管中心管理系统的随意管理&#xff0c;提高了信息的处理速度和精确度&#xff0c;能…

DI-engine强化学习入门(十又二分之一)如何使用RNN——数据处理、隐藏状态、Burn-in

一、数据处理 用于训练 RNN 的 mini-batch 数据不同于通常的数据。 这些数据通常应按时间序列排列。 对于 DI-engine, 这个处理是在 collector 阶段完成的。 用户需要在配置文件中指定 learn_unroll_len 以确保序列数据的长度与算法匹配。 对于大多数情况&#xff0c; learn_un…

神经网络极简入门

神经网络是深度学习的基础&#xff0c;正是深度学习的兴起&#xff0c;让停滞不前的人工智能再一次的取得飞速的发展。 其实神经网络的理论由来已久&#xff0c;灵感来自仿生智能计算&#xff0c;只是以前限于硬件的计算能力&#xff0c;没有突出的表现&#xff0c;直至谷歌的A…

mysql workbench如何导出insert语句?

进行导出设置 导出的sql文件 CREATE DATABASE IF NOT EXISTS jeesite /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */ /*!80016 DEFAULT ENCRYPTIONN */; USE jeesite; -- MySQL dump 10.13 Distrib 8.0.28, for Win64 (x86_64) -- -- Host: 127.0…

如何使用dockerfile文件将项目打包成镜像

要根据Dockerfile文件来打包一个Docker镜像&#xff0c;你需要遵循以下步骤。这里假设你已经安装了Docker环境。 1. 准备Dockerfile 确保你的Dockerfile文件已经准备就绪&#xff0c;并且位于你希望构建上下文的目录中。Dockerfile是一个文本文件&#xff0c;包含了用户可以调…

顺序表的实现(迈入数据结构的大门)(1)

什么是数据结构 数据结构是由&#xff1a;“数据”与“结构”两部分组成 数据与结构 数据&#xff1a;如我们所看见的广告、图片、视频等&#xff0c;常见的数值&#xff0c;教务系统里的&#xff08;姓名、性别、学号、学历等等&#xff09;&#xff1b; 结构&#xff1a;当…

线性表--数据结构设计与操作

单链表 1.单链表的定义&#xff1a; typedef struct LNode{Elemtype data;struct Lnode *next; }LNode ,*LinkList;//单链表的数据结构&#xff08;手写&#xff09; #include<iostream> #include<vector> #include<algorithm>typedef int TypeElem; //单链表…

OpenAI API搭建的智能家居助手;私密大型语言模型(LLM)聊天机器人;视频和音频文件的自动化识别和翻译工具

✨ 1: GPT Home 基于Raspberry Pi和OpenAI API搭建的智能家居助手 GPT Home是一个基于Raspberry Pi和OpenAI API搭建的智能家居助手&#xff0c;功能上类似于Google Nest Hub或Amazon Alexa。通过详细的设置指南和配件列表&#xff0c;用户可以自行组装和配置这个设备&#x…

Ansible自动运维工具之playbook

一.inventory主机清单 1.定义 Inventory支持对主机进行分组&#xff0c;每个组内可以定义多个主机&#xff0c;每个主机都可以定义在任何一个或多个主机组内。 2.变量 &#xff08;1&#xff09;主机变量 [webservers] 192.168.10.14 ansible_port22 ansible_userroot ans…

使用sqlmodel实现唯一性校验

代码&#xff1a; from sqlmodel import Field, Session, SQLModel, create_engine# 声明模型 class User(SQLModel, tableTrue):id: int | None Field(defaultNone, primary_keyTrue)# 不能为空&#xff0c;必须唯一name: str Field(nullableFalse, uniqueTrue)age: int | …

Flutter弹窗链-顺序弹出对话框

效果 前言 弹窗的顺序执行在App中是一个比较常见的应用场景。比如进入App首页&#xff0c;一系列的弹窗就会弹出。如果不做处理就会导致弹窗堆积的全部弹出&#xff0c;严重影响用户体验。 如果多个弹窗中又有判断逻辑&#xff0c;根据点击后需要弹出另一个弹窗&#xff0c;这…

大数据Scala教程从入门到精通第五篇:Scala环境搭建

一&#xff1a;安装步骤 1&#xff1a;scala安装 1&#xff1a;首先确保 JDK1.8 安装成功: 2&#xff1a;下载对应的 Scala 安装文件 scala-2.12.11.zip 3&#xff1a;解压 scala-2.12.11.zip 4&#xff1a;配置 Scala 的环境变量 在Windows上安装Scala_windows安装scala…

docker搭建代码审计平台sonarqube

docker搭建代码审计平台sonarqube 一、代码审计关注的质量指标二、静态分析技术分类三、sonarqube流程四、快速搭建sonarqube五、sonarqube scanner的安装和使用 一、代码审计关注的质量指标 代码坏味道 代码规范技术债评估 bug和漏洞代码重复度单测与集成 测试用例数量覆盖率…

node报错——解决Error: error:0308010C:digital envelope routines::unsupported——亲测可用

今天在打包vue2项目时&#xff0c;遇到一个报错&#xff1a; 最关键的代码如下&#xff1a; Error: error:0308010C:digital envelope routines::unsupportedat new Hash (node:internal/crypto/hash:80:19)百度后发现是node版本的问题。 在昨天我确实操作了一下node&…

Ansible——Playbook剧本

目录 一、Playbook概述 1.Playbook定义 2.Playbook组成 3.Playbook配置文件详解 4.运行Playbook 4.1Ansible-Playbook相关命令 4.2运行Playbook启动httpd服务 4.3变量的定义和引用 4.4指定远程主机sudo切换用户 4.5When——条件判断 4.6迭代 4.6.1创建文件夹 4.6.2…

[Linux][网络][TCP][四][流量控制][拥塞控制]详细讲解

目录 1.流量控制2.拥塞控制0.为什么要有拥塞控制&#xff0c;不是有流量控制么&#xff1f;1.什么是拥塞窗口&#xff1f;和发送窗口有什么关系呢&#xff1f;2.怎么知道当前网络是否出现了拥塞呢&#xff1f;3.拥塞控制有哪些算法&#xff1f;4.慢启动5.拥塞避免6.拥塞发生7.快…