python文件处理结果缓存装饰器

作者: VxCoder | 来源:发表于2017-06-12 16:34 被阅读180次

0.起因

在python处理的各类杂活中,文件格式转换类工作通常占大多数比例,比如:
+ 小王啊, 这个.txt帮忙转成xls格式
+ 小张啊, 把这个xls里面xx数据提取出来,搞个xml文件
+ 小周啊, 解析下这个xml文件,转成.txt给我.

通常这种的代码结构可以分成两块:
1. 原始文件解析, 保存为内部数据
2. 将内部数据转换成要求的新文件格式
这篇文件主要是优化第一步. 因为接到一个杂活,要处理大概1000多个xls文件, 而且文件大小比较对不起硬盘,转换逻辑有点绕, 第一步的解析过程可能要花10分钟左右, 并且只要一个文件更新后,就要重新生成.OK, 问题就是这样了.

1.经过

为了解决这个问题,我决定保存第一步的内部数据, 对于这种功能,pickle就是你想要的了. 为了通用性和易用性,决定做个装饰器.所以代码如下:

import os
from functools import wraps

try:
    import cPickle as pickle
except ImportError:
    import pickle

def file_cache(parse_func):

    def _check_cache_valid(parse_file, cache_file):
        if not os.path.isfile(cache_file):
            return False

        if os.path.getmtime(parse_file) > os.path.getmtime(cache_file):
            return False

        return True

    @wraps(parse_func)
    def _wrap(*args, **kwargs):
        parse_file = kwargs.get('parse_file', '')
        parse_result = None
        cache_file = '.'.join([parse_file, 'cache'])
        if _check_cache_valid(parse_file, cache_file):
            with open(cache_file) as cache_fd:
                parse_result = pickle.load(cache_fd)
        else:
            parse_result = parse_func(*args, **kwargs)
            with open(cache_file, 'w') as cache_fd:
                pickle.dump(parse_result, cache_fd)

        return parse_result

    return _wrap

几点说明:

  1. 要解析的文件名,必须通过parse_file参数指明
  2. 每个文件的缓存文件为文件名加.cahce
  3. 通过判断原文件和缓冲文件的修改时间来确定,是否要更新缓存文件

应用场景

  @file_cache
   def _parse_translate_info(self, parse_file=None):
        translate_info = {}
        with open(parse_file) as fin:
            for line in fin:
                match = self.TRANSLATE_LINE.match(line)
                if match:
                    translate_info[match.group('en')] = match.group('cn').decode('utf8')

        return translate_info

对于老的一些脚本, 要想支持这功能, 少量改动代码就可以了.装饰器大法好啊.

2.结果

引入缓存后,解析速度就是 咻咻咻. (缓存是计算机科学里最NB的发明)

3.警告

以上代码只是处理简单任务的版本,缺少各类异常情况的处理,使用时出现问题概不负责的说。

相关文章

  • python文件处理结果缓存装饰器

    0.起因 在python处理的各类杂活中,文件格式转换类工作通常占大多数比例,比如:+ 小王啊, 这个.txt帮忙...

  • Python 高级编程系列(二)

    Python 装饰器常见用法 装饰器与spring 中的AOP类似 通过装饰器可以实现面向切面的注入 一:缓存 ...

  • 装饰器

    """@装饰器- 普通装饰器- 带参数的装饰器- 通用装饰器- 装饰器装饰类- 内置装饰器- 缓存装饰器- 类实现...

  • Python ☞ day 5

    Python学习笔记之 装饰器& 偏函数 & 异常处理 & 断言 & 文件读写 &编码与解码 装饰器 概念:是一个...

  • PYTHON部分基础D4

    Decorator装饰器 装饰器自己可以有参数 内置函数 文件读写 Python3的继承机制 成员保护和访问限制 ...

  • Mybatis的这两个缓存装饰器不要忽略

    Mybatis的这两个缓存装饰器不要忽略这篇文章继续介绍聊聊Mybatis的缓存的其他装饰者 引用的缓存装饰器So...

  • 缓存

    本地数据库缓存在settings文件中添加: 2.在终端: 在view中使用:也用了装饰器 使用redis缓存: ...

  • 说说 Python 的 lru_cache 装饰器

    Python 的 lru_cache 装饰器是一个为自定义函数提供缓存功能的装饰器。其内部会在下次以相同参数调用该...

  • 装饰器模式

    介绍 在python装饰器学习 这篇文章中,介绍了python 中的装饰器,python内置了对装饰器的支持。面向...

  • python中的装饰器

    python装饰器详解 Python装饰器学习(九步入门) 装饰器(decorator) 就是一个包装机(wrap...

网友评论

    本文标题:python文件处理结果缓存装饰器

    本文链接:https://www.haomeiwen.com/subject/ktglqxtx.html