首页 > 其他分享 >迭代器索引记录器

迭代器索引记录器

时间:2023-04-06 11:00:27浏览次数:38  
标签:index 记录器 迭代 item self 索引 path

说明

有时候有一些东西需要迭代处理(比如临时需要采集一些数据),有时候中间会失败,就需要创建一个可持久化的索引。

因此简单的写入到 txt 文件进行存储。好几次之后,经常需要很重复写一些代码,变得很不好看。

所以花了一点点时间抽出来这些重复代码。

Code

# coding=utf-8
# @Author: 二次蓝
# @Created at 2023/4/6 9:55
import os.path


class Pointer:

    def __init__(self, file_path: str, pad: int = 20, only_item: bool = False):
        """
        创建一个可持久化的记录可迭代对象的索引的文件,
        从第0行开始,每次返回一个索引对应的item,达到步长,就会写入磁盘持久化索引。

        【存储的是上一次返回的索引】

        :param file_path: 需要操作的索引文件路径
        :param pad: 步长,每过几个索引则写入磁盘
        :param only_item: 迭代时,只返回item,不返回index
        """
        self.file_path = file_path
        self.pad = pad
        self.only_item = only_item

    def read(self) -> int:
        if os.path.exists(self.file_path):
            with open(self.file_path, encoding="utf-8", mode="rt") as f:
                return int(f.read())
        else:
            return -1

    def save(self, pointer_num: int):
        with open(self.file_path, encoding="utf-8", mode="wt") as f:
            f.write(str(pointer_num))
        return pointer_num

    def iter(self, iterable):
        """
        迭代一个可迭代对象,会从已存储索引+1开始迭代。

        :param iterable: 一个可迭代对象
        """
        wrote_index = self.read()
        continue_index = wrote_index + 1
        should_query_flag = False

        index = 0
        for index, item in enumerate(iterable):
            if not should_query_flag:
                if index < continue_index:
                    continue
                else:
                    should_query_flag = True

            if (index + 1) % self.pad == 0:
                wrote_index = self.save(index)
            if self.only_item:
                yield item
            else:
                yield index, item

        if wrote_index != index:
            self.save(index)


if __name__ == '__main__':
    pointer = Pointer("./test_pointer.txt")
    for i in pointer.iter(range(105)):
        print(i)

使用示例:

df = pd.read_csv(input_txt)
pinter = Pointer(pointer_txt, only_item=True)

logger.info(f"程序启动")
for index, row in pinter.iter(df.iterrows()):  # iterrows()本身就返回了index
    logger.info(f"读取第几行:{index + 1}")

这样就可以实现,程序中断后,再次运行可以继续迭代执行了,不再需要管内部逻辑。

通过设置 pad 步长参数可以减少写入磁盘的次数,但是如果在步长期间发生异常,那么就会丢失期间的已使用索引。

可以自行捕获异常,使用 pointer.save(num) 保存当时已使用的索引。或者直接把步长设为 1,每迭代一个都写入磁盘。

标签:index,记录器,迭代,item,self,索引,path
From: https://www.cnblogs.com/ercilan/p/17292132.html

相关文章

  • 31.mysql查看所有索引
    当对大表进行数据迁移时,往往索引是个大问题,不但用时较长,且容易造成锁表,此时针对某些情况,就可以先备份索引信息,然后删除原表索引,数据迁移完成之后,再重建索引SELECTCONCAT('ALTERTABLE`',TABLE_NAME,'`',......
  • MySQL(十一)索引的分类和创建原则
    索引的创建与设计原则1索引的声明与使用1.1索引的分类​ MySQL索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引按照逻辑结构划分,主要有四种:普通索引、唯一性索引、主键索引和全文索引按照物理实现方式划分,主要有两种:聚簇索引和非聚簇索引按照作......
  • Kafka消息与索引详解
    前言以kafka_2.13-2.8.0为例,分析Kafka消息在磁盘上的存储结构、配置以及如何通过索引找到具体的消息数据。分区目录一个分区(Partition)有1到多个副本(Replica),是主从结构,主(Leader)负责处理读写请求,从(Follower)只负责同步数据并在主宕机的时候顶替主实现高可用。在Kafka数据目录下存......
  • (第六篇)__iter__、__next__及for循环执行原理(可迭代对象、迭代器、生成器)
    摘要:只要有__iter__,那么这个对象就是可迭代对象,若对象有__iter__和__next__两种方法,则这个对象为迭代器对象。一、概念什么是迭代?迭代就是重复,但是每一次重复都与上一次有关联,这就是迭代。"""这不是迭代,这是简单的重复"""whileTrue:print(1)"""这是迭代。每一......
  • 一个Web报表项目的性能分析和优化实践(四):MySQL建立索引,唯一索引和组合索引
    先大致介绍下项目的数据库信息。数据库A:主要存放的通用的表,如User、Project、Report等。数据库B、C、D:一个项目对应一个数据库,而且这几个项目的表是完全一样的。数据库表的特点A中的表:数据量几乎都比较小,比如User表中用户数,顶多也就几百上千。B中的表:X/Y/Z3张表几乎是确定的,Data表......
  • 基于PSO的最优路径优化仿真,带GUI界面,可以设置粒子数目,迭代次数,优化目标,输出最优
    1.算法描述PSO从这种模型中得到启示并用于解决优化问题。PSO中,每个优化问题的解都是搜索空间中的一只鸟。我们称之为“粒子”。所有的粒子都有一个由被优化的函数决定的适应值(fitnessvalue),每个粒子还有一个速度决定他们飞翔的方向和距离。然后粒子们就追随当前的最优粒子在解空......
  • 基于PSO的最优路径优化仿真,带GUI界面,可以设置粒子数目,迭代次数,优化目标,输出最优
    1.算法描述        PSO从这种模型中得到启示并用于解决优化问题。PSO中,每个优化问题的解都是搜索空间中的一只鸟。我们称之为“粒子”。所有的粒子都有一个由被优化的函数决定的适应值(fitnessvalue),每个粒子还有一个速度决定他们飞翔的方向和距离。然后粒子们就追随当前......
  • MySQL索引
    一、索引的概念定义:索引是对数据库表中一列或多列的值进行排序的一种结构,索引可以提高检索效率。数据库像书籍,索引就如目录。优点:索引可以减少服务器需要扫描的数据量,从而加快检索速度;索引可以帮助服务器避免排序(orderby)和创建临时表(join)缺点:创建和维护索引需要耗费时间;索......
  • 分布式搜索引擎Elasticsearch的架构分析
    一、写在前面 ES(Elasticsearch下文统一称为ES)越来越多的企业在业务场景是使用ES存储自己的非结构化数据,例如电商业务实现商品站内搜索,数据指标分析,日志分析等,ES作为传统关系型数据库的补充,提供了关系型数据库不具备的一些能力。ES最先进入大众视野的是其能够实现全文搜索的能力,也......
  • 搜索引擎关键词采集,联系任务采集,网址采集
    使用搜索引擎进行关键词的采集,可以让我们获得更多的信息并准确地找到我们所需要的内容。通过使用搜索引擎,我们可以快速搜索全球各地的网页、文章、资料以及其他文档。除此之外,搜索引擎还提供与主题相关的相关性排序,这样可以更快速有效地了解当前所要访问的内容。在工作场景下,使用......