欢迎来到 WordMarker 的文档!

概述

WordMarker是一个文档生成器,他提供了以下主要的功能。

  1. 读写 .csv 文件。

    • 你可以使用 CsvTemplate 批量地读取 .csv 文件或者读取单个 .csv 文件转换为 DataFrame 类型的数据。

    • 你可以使用 CsvTemplateDataFrame 类型的数据转换为 .csv 文件。

  2. 读写数据库。

    • 你可以使用 PdbcTemplateDataFrame 类型的数据写入到数据库中。

    • 你可以使用 PdbcTemplate 将数据库中的数据转换为 DataFrame 类型的数据。

  3. 生成Word文档。

    • 你可以使用 WordTemplate 获取文本、图片、模板,通过模板生成固定格式的Word文档。

  4. 其他。

    • 提供了一些实用的工具类,可以简化开发,它们位于 wordmarker.utils 模块中,使用方法可以参考API文档。

参见

DataFrame 是pandas中的数据类型, 请访问 pandas官网 ,了解更多信息。

快速入门

快速入门

在快速入门中,你将使用 wordmarker 构建一个示例项目,它包含了 wordmarker 的基本使用。你可以在 GitHub 上找到该示例。

环境搭建

  1. Python 的版本 >= 3.7

  2. 下载并安装 最新版的 wordmarker

  3. 安装 postgresql 数据库

  4. 最好使用开发工具 PycharmVsCode

初始化项目

  1. 打开终端,进入项目的根目录,输入 wordmarker-quickstart 命令,按照提示完成项目的初始化

    欢迎使用 WordMarker 的脚手架,请按照提示完成项目的构建。
    -------------------------------------------------
    配置数据库
    -------------------------------------------------
    1. PostgreSQL
    2. MySql
    3. Oracle
    4. Microsoft
    数据库的类型,默认为 [1]: 1
    用户名,默认为 [postgres]:
    密码,默认为 [123456]: 123456
    主机,默认为 [localhost]:
    端口,默认为 [5432]:
    要连接的数据库: example
    -------------------------------------------------
    配置输入输出目录
    -------------------------------------------------
    是否启用默认的目录配置,默认为 [Y] [Y/n]: y
    成功创建data/in目录
    成功创建data/out目录
    成功创建template/in目录
    成功创建template/out目录
    成功创建img目录
    成功创建text目录
    
    成功构建项目 ^_^ !
    
  2. 生成的目录结构如下

    ../wordmarker-example/
                         /data/in
                         /data/out
                         /img
                         /template/in
                         /template/out
                         /text
                         /config.yaml
    
  3. config.yaml 文件中包含相关的配置

    # ======================================================================================================
    
    # ----------------------配置数据库信息
    #
    # 详细信息请查看 https://docs.sqlalchemy.org/en/14/core/engines.html
    # url:
    #    postgresql: "postgresql://username:password@localhost:5432/database"
    #    mysql: mysql+pymysql://username:password@localhost:3306/database
    # echo: 是否开启日志
    # encoding: 编码,默认utf-8
    # pool_size: 连接池大小
    # max_overflow: 连接的数量,以允许在连接池"溢出"
    # pool_recycle: 在给定的秒数过去之后,此设置将导致池回收连接。默认为-1。例如,设置为3600表示一小时后将回收连接
    # pool_timeout: 放弃从池中获得连接之前要等待的秒数
    # echo_pool: 是否开启日志
    pdbc:
      engine:
        url: postgresql://postgres:123456@localhost:5432/example
        echo: false
        encoding: utf-8
        pool_size: 5
        max_overflow: 10
        pool_recycle: -1
        pool_timeout: 30.0
        echo_pool: false
    
    # ======================================================================================================
    
    # ----------------------配置csv文件信息
    #
    # path: 文件的输入路径,可以是文件,也可以是目录
    #       路径分隔符为 '/' 或 '\'
    #       path的值为相对于当前yaml文件的路径
    # dir: 文件的输出目录
    #      路径分隔符为 '/' 或 '\'
    #      dir的值为相对于当前yaml文件的路径
    data:
      csv:
        input:
          path: data/in
        output:
          dir: data/out
      docx:
        input:
          path: template/in
        output:
          dir: template/out
      img:
        output:
          dir: img
      text:
        input:
          path: text
    
    # ======================================================================================================
    
  4. 创建 main.py 文件,最终生成的目录如下

    ../wordmarker-example/
                         /data/in
                         /data/out
                         /img
                         /template/in
                         /template/out
                         /text
                         /config.yaml
                         /main.py
    

编写脚本

  1. 初始化 WordMarker 上下文和相关模板

    from wordmarker.contexts import WordMarkerContext
    from wordmarker.templates import CsvTemplate, PdbcTemplate, WordTemplate
    
    if __name__ == '__main__':
        # 初始化上下文
        WordMarkerContext("config.yaml")
        # 读写csv文件的模板
        csv_tpl = CsvTemplate()
        # 读写数据库的模板
        pdbc_tpl = PdbcTemplate()
        # 读写word文档的模板
        word_tpl = WordTemplate()
    
  2. 下载 景气指数_加盐.csv 文件,将文件放入 ../wordmarker-example/data/in 目录中,编写代码从配置中获取 .csv 文件,类型为 DataFrame

    from wordmarker.contexts import WordMarkerContext
    from wordmarker.templates import CsvTemplate, PdbcTemplate, WordTemplate
    
    if __name__ == '__main__':
        # 初始化上下文
        WordMarkerContext("config.yaml")
        # 读写csv文件的模板
        csv_tpl = CsvTemplate()
        # 读写数据库的模板
        pdbc_tpl = PdbcTemplate()
        # 读写word文档的模板
        word_tpl = WordTemplate()
    
        # 从配置中获取.csv文件,类型为DataFrame
        csv_dict = csv_tpl.csv_to_df()
        prosperity_index_file = csv_dict['景气指数_加盐.csv']
        print(prosperity_index_file)
    
    输出结果
    
         起飞年  起飞星期      景气指数
    0    2015     1  89.57518
    1    2015    10  92.69366
    2    2015    11  92.43514
    3    2015    12  92.51584
    4    2015    13  92.45800
    ..    ...   ...       ...
    207  2018    53  85.67820
    208  2018     6  94.36436
    209  2018     7  94.22866
    210  2018     8  94.80134
    211  2018     9  94.37548
    
    [212 rows x 3 columns]
    
  3. 创建数据库 example ,将 DataFrame 类型的数据写入数据库

    from wordmarker.contexts import WordMarkerContext
    from wordmarker.templates import CsvTemplate, PdbcTemplate, WordTemplate
    
    if __name__ == '__main__':
        # 初始化上下文
        WordMarkerContext("config.yaml")
        # 读写csv文件的模板
        csv_tpl = CsvTemplate()
        # 读写数据库的模板
        pdbc_tpl = PdbcTemplate()
        # 读写word文档的模板
        word_tpl = WordTemplate()
    
        # 从配置中获取.csv文件,类型为DataFrame
        csv_dict = csv_tpl.csv_to_df()
        prosperity_index_file = csv_dict['景气指数_加盐.csv']
        print(prosperity_index_file)
    
        # 将DataFrame类型的数据写入数据库
        pdbc_tpl.update_table(prosperity_index_file, "t_prosperity_index")
    
  4. example 数据库中获取数据,类型为 DataFrame

    from wordmarker.contexts import WordMarkerContext
    from wordmarker.templates import CsvTemplate, PdbcTemplate, WordTemplate
    
    if __name__ == '__main__':
        # 初始化上下文
        WordMarkerContext("config.yaml")
        # 读写csv文件的模板
        csv_tpl = CsvTemplate()
        # 读写数据库的模板
        pdbc_tpl = PdbcTemplate()
        # 读写word文档的模板
        word_tpl = WordTemplate()
    
        # 从配置中获取.csv文件,类型为DataFrame
        csv_dict = csv_tpl.csv_to_df()
        prosperity_index_file = csv_dict['景气指数_加盐.csv']
        print(prosperity_index_file)
    
        # 将DataFrame类型的数据写入数据库
        pdbc_tpl.update_table(prosperity_index_file, "t_prosperity_index")
    
        # 从数据库中获取数据,类型为DataFrame
        prosperity_index_database = pdbc_tpl.query_table("t_prosperity_index")
        print(prosperity_index_database)
    
    输出结果
    
         起飞年  起飞星期      景气指数
    0    2015     1  89.57518
    1    2015    10  92.69366
    2    2015    11  92.43514
    3    2015    12  92.51584
    4    2015    13  92.45800
    ..    ...   ...       ...
    207  2018    53  85.67820
    208  2018     6  94.36436
    209  2018     7  94.22866
    210  2018     8  94.80134
    211  2018     9  94.37548
    
    [212 rows x 3 columns]
    
         起飞年  起飞星期      景气指数
    0    2015     1  89.57518
    1    2015    10  92.69366
    2    2015    11  92.43514
    3    2015    12  92.51584
    4    2015    13  92.45800
    ..    ...   ...       ...
    207  2018    53  85.67820
    208  2018     6  94.36436
    209  2018     7  94.22866
    210  2018     8  94.80134
    211  2018     9  94.37548
    
    [212 rows x 3 columns]
    
  5. DataFrame 类型的数据转换为 .csv 文件

    from wordmarker.contexts import WordMarkerContext
    from wordmarker.templates import CsvTemplate, PdbcTemplate, WordTemplate
    
    if __name__ == '__main__':
        # 初始化上下文
        WordMarkerContext("config.yaml")
        # 读写csv文件的模板
        csv_tpl = CsvTemplate()
        # 读写数据库的模板
        pdbc_tpl = PdbcTemplate()
        # 读写word文档的模板
        word_tpl = WordTemplate()
    
        # 从配置中获取.csv文件,类型为DataFrame
        csv_dict = csv_tpl.csv_to_df()
        prosperity_index_file = csv_dict['景气指数_加盐.csv']
        print(prosperity_index_file)
    
        # 将DataFrame类型的数据写入数据库
        pdbc_tpl.update_table(prosperity_index_file, "t_prosperity_index")
    
        # 从数据库中获取数据,类型为DataFrame
        prosperity_index_database = pdbc_tpl.query_table("t_prosperity_index")
        print(prosperity_index_database)
    
        # 将DataFrame类型的数据转换为.csv文件
        csv_tpl.df_to_csv({'景气指数_数据库.csv': prosperity_index_database})
    
    输出目录
    
    ../wordmarker-example/data/out/景气指数_数据库.csv
    
  6. 编写 example.yamlmeta.yaml 文件,将这两个文件放在 ../wordmarker-example/text/ 目录下

    example.yaml

    example:
      title: '景气指数'
      img_title: '图1 景气指数'
      explanation:
        - '2017年上半年民航全市场景气指数上涨:国内航线154,国际航线125,港澳台航线171。'
        - '2017年国内航线景气指数同比增幅放缓至0.40%,巿场稳步上升。'
        - '2017年国际航线景气指数增速上升,同比增幅与2016年放缓至0.40%,但春节峰值周景气指数超越2016年峰值,达到94.24,再创新高。'
    

    meta.yaml

    meta:
      author: '{{ author }}'
      email: 'chensixiang1234@gamil.com'
    
  7. meta.yaml 文件中 meta.author 对应的值包含插值表达式。要对表达式赋值,需要创建 AbstractConverter 类的实现类,并且创建实现类的对象

    from wordmarker.contexts import WordMarkerContext
    from wordmarker.templates import CsvTemplate, PdbcTemplate, WordTemplate, AbstractConverter
    
    class TextConverter(AbstractConverter):
        def __init__(self, word_tpl_: WordTemplate):
            super().__init__(word_tpl_)
    
        @staticmethod
        def author():
            return 'chensixiang'
    
    if __name__ == '__main__':
        # 初始化上下文
        WordMarkerContext("config.yaml")
        # 读写csv文件的模板
        csv_tpl = CsvTemplate()
        # 读写数据库的模板
        pdbc_tpl = PdbcTemplate()
        # 读写word文档的模板
        word_tpl = WordTemplate()
    
        # 从配置中获取.csv文件,类型为DataFrame
        csv_dict = csv_tpl.csv_to_df()
        prosperity_index_file = csv_dict['景气指数_加盐.csv']
        print(prosperity_index_file)
    
        # 将DataFrame类型的数据写入数据库
        pdbc_tpl.update_table(prosperity_index_file, "t_prosperity_index")
    
        # 从数据库中获取数据,类型为DataFrame
        prosperity_index_database = pdbc_tpl.query_table("t_prosperity_index")
        print(prosperity_index_database)
    
        # 将DataFrame类型的数据转换为.csv文件
        csv_tpl.df_to_csv({'景气指数_数据库.csv': prosperity_index_database})
    
        # 创建TextConverter对象,它继承了AbstractConverter,可以将yaml模板中的插值表达式进行转换
        text = TextConverter(word_tpl)
    
  8. 下载 default_tpl.docx 文件,将文件放入 ../wordmarker-example/template/in 目录中,下载 景气指数.png 文件,将文件放入 ../wordmarker-example/img 目录中,并修改 config.yaml 中的 data.docx.input.path 的配置,以及编写 content 字典

    config.yaml

    # ======================================================================================================
    
    # ----------------------配置数据库信息
    #
    # 详细信息请查看 https://docs.sqlalchemy.org/en/14/core/engines.html
    # url:
    #    postgresql: "postgresql://username:password@localhost:5432/database"
    #    mysql: mysql+pymysql://username:password@localhost:3306/database
    # echo: 是否开启日志
    # encoding: 编码,默认utf-8
    # pool_size: 连接池大小
    # max_overflow: 连接的数量,以允许在连接池"溢出"
    # pool_recycle: 在给定的秒数过去之后,此设置将导致池回收连接。默认为-1。例如,设置为3600表示一小时后将回收连接
    # pool_timeout: 放弃从池中获得连接之前要等待的秒数
    # echo_pool: 是否开启日志
    pdbc:
      engine:
        url: postgresql://postgres:123456@localhost:5432/example
        echo: false
        encoding: utf-8
        pool_size: 5
        max_overflow: 10
        pool_recycle: -1
        pool_timeout: 30.0
        echo_pool: false
    
    # ======================================================================================================
    
    # ----------------------配置csv文件信息
    #
    # path: 文件的输入路径,可以是文件,也可以是目录
    #       路径分隔符为 '/' 或 '\'
    #       path的值为相对于当前yaml文件的路径
    # dir: 文件的输出目录
    #      路径分隔符为 '/' 或 '\'
    #      dir的值为相对于当前yaml文件的路径
    data:
      csv:
        input:
          path: data/in
        output:
          dir: data/out
      docx:
        input:
          path: template/in/default_tpl.docx
        output:
          dir: template/out
      img:
        output:
          dir: img
      text:
        input:
          path: text
    
    # ======================================================================================================
    
    from wordmarker.contexts import WordMarkerContext
    from wordmarker.templates import CsvTemplate, PdbcTemplate, WordTemplate, AbstractConverter
    from docxtpl import InlineImage
    from docx.shared import Mm
    
    
    class TextConverter(AbstractConverter):
        def __init__(self, word_tpl_: WordTemplate):
            super().__init__(word_tpl_)
    
        @staticmethod
        def author():
            return 'chensixiang'
    
    if __name__ == '__main__':
        # 初始化上下文
        WordMarkerContext("config.yaml")
        # 读写csv文件的模板
        csv_tpl = CsvTemplate()
        # 读写数据库的模板
        pdbc_tpl = PdbcTemplate()
        # 读写word文档的模板
        word_tpl = WordTemplate()
    
        # 从配置中获取.csv文件,类型为DataFrame
        csv_dict = csv_tpl.csv_to_df()
        prosperity_index_file = csv_dict['景气指数_加盐.csv']
        print(prosperity_index_file)
    
        # 将DataFrame类型的数据写入数据库
        pdbc_tpl.update_table(prosperity_index_file, "t_prosperity_index")
    
        # 从数据库中获取数据,类型为DataFrame
        prosperity_index_database = pdbc_tpl.query_table("t_prosperity_index")
        print(prosperity_index_database)
    
        # 将DataFrame类型的数据转换为.csv文件
        csv_tpl.df_to_csv({'景气指数_数据库.csv': prosperity_index_database})
    
        # 创建TextConverter对象,它继承了AbstractConverter,可以将yaml模板中的插值表达式进行转换
        text = TextConverter(word_tpl)
    
        content = {
            # 直接赋值
            'title': '景气指数',
            # 从example.yaml模板中获取值
            'img_title': word_tpl.get_value("example.img_title"),
            # 图片
            'img': InlineImage(word_tpl.tpl, word_tpl.get_img_file('景气指数.png'),
                               width=Mm(100)),
            # 从example.yaml模板中获取值
            'explanation': word_tpl.get_value("example.explanation"),
            # 从meta.yaml模板中获取将插值表达式进行转换后的值
            'author': text.get_value("meta.author"),
            # 从meta.yaml模板中获取值
            'email': word_tpl.get_value("meta.email"),
        }
    
  9. 添加 content 到总的上下文中,并输出word文档

    from wordmarker.contexts import WordMarkerContext
    from wordmarker.templates import CsvTemplate, PdbcTemplate, WordTemplate, AbstractConverter
    from docxtpl import InlineImage
    from docx.shared import Mm
    
    
    class TextConverter(AbstractConverter):
        def __init__(self, word_tpl_: WordTemplate):
            super().__init__(word_tpl_)
    
        @staticmethod
        def author():
            return 'chensixiang'
    
    if __name__ == '__main__':
        # 初始化上下文
        WordMarkerContext("config.yaml")
        # 读写csv文件的模板
        csv_tpl = CsvTemplate()
        # 读写数据库的模板
        pdbc_tpl = PdbcTemplate()
        # 读写word文档的模板
        word_tpl = WordTemplate()
    
        # 从配置中获取.csv文件,类型为DataFrame
        csv_dict = csv_tpl.csv_to_df()
        prosperity_index_file = csv_dict['景气指数_加盐.csv']
        print(prosperity_index_file)
    
        # 将DataFrame类型的数据写入数据库
        pdbc_tpl.update_table(prosperity_index_file, "t_prosperity_index")
    
        # 从数据库中获取数据,类型为DataFrame
        prosperity_index_database = pdbc_tpl.query_table("t_prosperity_index")
        print(prosperity_index_database)
    
        # 将DataFrame类型的数据转换为.csv文件
        csv_tpl.df_to_csv({'景气指数_数据库.csv': prosperity_index_database})
    
        # 创建TextConverter对象,它继承了AbstractConverter,可以将yaml模板中的插值表达式进行转换
        text = TextConverter(word_tpl)
    
        content = {
            # 直接赋值
            'title': '景气指数',
            # 从example.yaml模板中获取值
            'img_title': word_tpl.get_value("example.img_title"),
            # 图片
            'img': InlineImage(word_tpl.tpl, word_tpl.get_img_file('景气指数.png'),
                               width=Mm(100)),
            # 从example.yaml模板中获取值
            'explanation': word_tpl.get_value("example.explanation"),
            # 从meta.yaml模板中获取将插值表达式进行转换后的值
            'author': text.get_value("meta.author"),
            # 从meta.yaml模板中获取值
            'email': word_tpl.get_value("meta.email"),
        }
    
        # 添加content到总的上下文中
        word_tpl.append(content)
        # 输出word文档
        word_tpl.build("example.docx")
    
    输出目录
    
    ../wordmarker-example/template/out/
                                      /example/
                                              /img/景气指数.png
                                              /example.docx
    
  10. 下载 example.docx 文件

参考文档

  • 敬请期待

API 文档

wordmarker.contexts package

作者

陈思祥

时间

2021年4月

概述

当前模块包含整个应用的上下文。

  1. wordmarker.contexts.context

    上下文的抽象类,所有的上下文都要继承它。
    
  2. wordmarker.contexts.system_context

    系统上下文,获取和系统有关的属性。例如,路径分隔符,文件分隔符等。
    
  3. wordmarker.contexts.yaml_context

    yaml文件的上下文,解析yaml文件。根据key值返回yaml文件中对应的value值。
    
  4. wordmarker.contexts.application_context

    应用上下文,用来初始化工厂和其他的上下文。
    
    一般初始化,应用上下文WordMarkerContext来初始化整个应用。
    

Submodules

wordmarker.contexts.application_context module

class WordMarkerContext(*args, **kwargs)[源代码]

基类:wordmarker.contexts.context.Context

应用上下文,你可以从上下文中获取到:

bean_factory:工厂里存放的bean实例的相关信息

yaml_context:加载的yaml文件的相关信息
property bean_factory

注解

获取bean工厂

返回

  • bean工厂

property yaml_context

注解

获取yaml文件的上下文

返回

  • yaml文件的上下文

wordmarker.contexts.context module

class Context[源代码]

基类:object

抽象类:所有上下文的公共父类

wordmarker.contexts.system_context module

class SystemContext[源代码]

基类:wordmarker.contexts.context.Context

系统上下文,获取和系统有关的属性
file_separator = ':'
path_separator = '/'

wordmarker.contexts.yaml_context module

class YamlContext(path)[源代码]

基类:wordmarker.contexts.context.Context, wordmarker.loaders.yaml_resource_loader.YamlResourceLoader

yaml文件的上下文
get_value(prop)[源代码]

注解

从yaml字典中,根据属性获取对应的值

加载多个yaml文件,排在后面的文件里的值,会覆盖前面的文件里的值

参数

prop – 属性,用 . 分隔,例如,pdbc.engine.url

返回

  • yaml字典中对应的值

get_yaml()[源代码]

注解

获取从yaml文件中读取的数据,类型为dict

返回

  • path为文件,返回一个字典,内容为yaml文件的内容

  • path为目录,返回一个嵌套的字典

    • key为yaml文件的绝对路径

    • value为yaml文件的内容,是一个字典

property path

注解

存放yaml文件的路径,可以是文件,也可以是目录

返回

  • yaml文件的路径

wordmarker.creatives package

作者

陈思祥

时间

2021年4月

概述

当前模块使用工厂和生成器模式来管理对象的创建。

  1. wordmarker.creatives.factory

    工厂模块。
    
  2. wordmarker.creatives.builder

    生成器模块。
    

Submodules

wordmarker.creatives.builder module

class AbstractBuilder[源代码]

基类:object

用于构造复杂的对象
abstract append(*args, **kwargs)[源代码]

注解

添加对象的部件

返回

  • 当前builder对象

abstract build()[源代码]

注解

构建复杂对象的实例

返回

  • 复杂对象的实例

wordmarker.creatives.factory module

class AbstractBeanFactory[源代码]

基类:object

BeanFactory的抽象类
abstract contain_bean(name: str)[源代码]

注解

判断工厂中是否包含某个bean实例

参数

name – 名字

返回

  • 包含,返回True

  • 不包含,返回False

abstract get_bean(name: str)[源代码]

注解

根据bean的名字获取bean实例

参数

name – 名字

返回

  • bean实例

abstract get_bean_names()[源代码]

注解

获取工厂中所有bean实例对应的名字

返回

  • 所有的bean实例对应的名字

abstract get_type(name: str)[源代码]

注解

获取bean实例的类型

参数

name – 名字

返回

  • 工厂中存在bean实例,返回bean实例的类型

  • 不存在,返回 None 对应的类型 NoneType

class BeanFactory(*args, **kwargs)[源代码]

基类:wordmarker.creatives.factory.AbstractBeanFactory

AbstractBeanFactory的实现类
contain_bean(name: str)[源代码]

注解

判断工厂中是否包含某个bean实例

参数

name – 名字

返回

  • 包含,返回True

  • 不包含,返回False

get_bean(name: str)[源代码]

注解

根据bean的名字获取bean实例

参数

name – 名字

返回

  • bean实例

get_bean_names()collections.abc.KeysView[源代码]

注解

获取工厂中所有bean实例对应的名字

返回

  • 所有的bean实例对应的名字

get_type(name: str)[源代码]

注解

获取bean实例的类型

参数

name – 名字

返回

  • 工厂中存在bean实例,返回bean实例的类型

  • 不存在,返回 None 对应的类型 NoneType

class FactoryBean(*args, **kwargs)[源代码]

基类:wordmarker.creatives.factory.BeanFactory

BeanFactory的子类

通过add_bean方法,将bean实例添加到工厂
add_bean(name: str, bean)[源代码]

注解

将bean实例添加到工厂

参数
  • name – 名字

  • bean – bean实例

wordmarker.data package

作者

陈思祥

时间

2021年4月

概述

当前模块用来处理数据和资源。

  1. wordmarker.data.resource

    加载的资源,包含和资源相关的属性和判断。
    
  2. wordmarker.data.formatter

    格式化数据,对某些数据进行处理。
    

Submodules

wordmarker.data.formatter module

class Formatter[源代码]

基类:object

格式化的抽象类
abstract format(*args)[源代码]

注解

格式化数据

参数

args – 数据

返回

  • 格式化后的数据

class SqlFormatter[源代码]

基类:wordmarker.data.formatter.Formatter

格式化sql语句
format(sql)[源代码]

注解

格式化用户输入的sql语句

例如:

1-- 输入 --
2select * from t_user where username=? and password=?
3-- 输出 --
4select * from t_user where username=:a and password=:b

小心

拼接的 :a :b 使用的是26个字母,也就是说一次查询的 ? ,不能超过26个。

参数

sql – sql语句

返回

  • 格式化后的sql语句

wordmarker.data.resource module

class Resource(*args)[源代码]

基类:wordmarker.contexts.system_context.SystemContext

资源类,包含与资源相关的属性和判断的方法
exists()[源代码]

注解

判断文件或目录是否存在

返回

  • 存在,返回True

  • 不存在,返回False

get_dir()[源代码]

注解

获取目录,返回目录的绝对路径

返回

  • 是目录,返回目录的绝对路径

  • 是文件,返回文件所在的目录

get_file()[源代码]

注解

获取文件,返回文件的绝对路径

返回

  • 是文件,返回文件的绝对路径

  • 是目录,返回当前目录下所有文件的绝对路径

get_file_encoding()[源代码]

注解

获取文件的编码

返回

  • 是文件,获取文件的编码,返回一个文件编码的字符串

  • 是目录,获取当前目录下所有文件的编码,返回一个字典

    • key为文件的绝对路径

    • value为文件的编码

get_file_name()[源代码]

注解

获取文件名

返回

  • 是文件,返回文件的名字

  • 是目录,返回当前目录下的所有文件的文件名

get_file_name_prefix_suffix()[源代码]

注解

获取文件的前缀和后缀

返回

  • 是文件,获取文件的前缀和后缀,返回一个元组

  • 是目录,获取目录下所有文件的前缀和后缀,返回一个字典

    • key为文件名

    • value为由文件的前缀和后缀组成的元组

get_loader()[源代码]

注解

获取加载当前资源的加载器

返回

  • 加载器

is_file()[源代码]

注解

判断是否为文件

返回

  • 是文件,返回True

  • 不是文件,返回False

wordmarker.loaders package

作者

陈思祥

时间

2021年4月

概述

当前模块用来加载资源。

  1. wordmarker.loaders.default_resource_loader

    默认的资源加载器。
    
  2. wordmarker.loaders.yaml_resource_loader

    yaml文件的资源加载器。
    
  3. wordmarker.loaders.resource_loader

    资源加载器的抽象类。
    

Submodules

wordmarker.loaders.default_resource_loader module

class DefaultResourceLoader(*args)[源代码]

基类:wordmarker.loaders.resource_loader.ResourceLoader

默认的资源加载器
get_resource(path=None)wordmarker.data.resource.Resource[源代码]

注解

获取资源

参数

path – 路径

返回

  • 资源实例

load(resource: wordmarker.data.resource.Resource)[源代码]

注解

加载资源

参数

resource – 资源实例

返回

  • 资源为文件,获取文件中的数据

  • 资源为目录,获取目录下所有文件中的数据,返回一个字典

    • key为文件的绝对路径

    • value为文件的数据

wordmarker.loaders.resource_loader module

class ResourceLoader[源代码]

基类:object

资源加载器的抽象类
abstract get_resource(path)[源代码]

注解

获取资源

参数

path – 路径

返回

  • 资源

abstract load(resource)[源代码]

注解

加载资源

参数

resource – 资源

返回

  • 资源中的数据

wordmarker.loaders.yaml_resource_loader module

class YamlResourceLoader(*args)[源代码]

基类:wordmarker.loaders.default_resource_loader.DefaultResourceLoader

yaml文件的资源加载器
load(resource: wordmarker.data.resource.Resource)[源代码]

注解

加载yaml资源

参数

resource – yaml资源实例

返回

  • yaml资源为文件,获取文件中的数据

  • yaml文件资源为目录,获取目录下所有yaml文件中的数据,返回一个字典

    • key为文件的绝对路径

    • value为文件的数据

wordmarker.templates package

作者

陈思祥

时间

2021年4月

概述

当前模块是WordMarker的核心模块,可以读写csv文件,操纵数据库,读写docx文件等。

  1. wordmarker.templates.pdbc_template

    操纵数据库的模板。
    
  2. wordmarker.templates.csv_template

    读写csv文件的模板。
    
  3. wordmarker.templates.word_template

    读写docx文件的模板。
    

Submodules

wordmarker.templates.csv_template module

class CsvHelper(*args, **kwargs)[源代码]

基类:wordmarker.loaders.default_resource_loader.DefaultResourceLoader, wordmarker.contexts.system_context.SystemContext

通过读取配置文件,获取csv文件的相关信息
get_csv()[源代码]

注解

获取csv文件的绝对路径

返回

  • yaml文件中 data.csv.input.path 是目录,返回当前目录下的所有csv文件的绝对路径

  • yaml文件中 data.csv.input.path 是文件,返回当前文件的绝对路径

get_csv_file_name()[源代码]

注解

获取csv文件的文件名

返回

  • 是文件,返回文件的名字

  • 是目录,返回当前目录下的所有文件的文件名

get_csv_in_path()[源代码]

注解

通过读取yaml文件的 data.csv.in.path 属性,获取输入的csv文件或目录的绝对路径

返回

  • csv文件或目录的绝对路径

get_csv_out_path()[源代码]

注解

通过读取yaml文件的 data.csv.output.dir 属性,获取输出的csv的目录的绝对路径

返回

  • csv目录的绝对路径

class CsvOperations[源代码]

基类:object

csv文件的相关操作的抽象类
abstract csv_to_df()[源代码]

注解

将csv文件转换为 DataFrame

返回

  • 数据框

abstract df_to_csv(*args, **kwargs)[源代码]

注解

DataFrame 转换为csv文件

class CsvTemplate(*args, **kwargs)[源代码]

基类:wordmarker.templates.csv_template.CsvOperations, wordmarker.templates.csv_template.CsvHelper

操作csv文件的模板
csv_to_df(sep=<object object>, delimiter=None, header='infer', names=None, index_col=0, usecols=None, squeeze=False, prefix=None, mangle_dupe_cols=True, dtype=None, engine=None, converters=None, true_values=None, false_values=None, skipinitialspace=False, skiprows=None, skipfooter=0, nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True, parse_dates=False, infer_datetime_format=False, keep_date_col=False, date_parser=None, dayfirst=False, cache_dates=True, iterator=False, chunksize=None, compression='infer', thousands=None, decimal: str = '.', lineterminator=None, quotechar='"', quoting=0, doublequote=True, escapechar=None, comment=None, encoding=None, dialect=None, error_bad_lines=True, warn_bad_lines=True, delim_whitespace=False, low_memory=True, memory_map=False, float_precision=None, storage_options: Optional[Dict[str, Any]] = None)Union[pandas.io.parsers.TextFileReader, pandas.core.series.Series, pandas.core.frame.DataFrame, None, Dict[str, Optional[Union[pandas.io.parsers.TextFileReader, pandas.core.series.Series, pandas.core.frame.DataFrame]]]][源代码]

注解

从yaml配置中读取csv文件,转换为 pandasDataFrame

小技巧

csv_to_df的参数详情 , 请访问 pandas官网 ,了解更多信息

返回

  • 多个csv文件,返回一个 DataFrame 的字典

    • key为文件名

    • value为 DataFrame

  • 一个csv文件,返回一个 DataFrame

df_to_csv(data_dict: Dict[str, pandas.core.frame.DataFrame], sep: str = ',', na_rep: str = '', float_format: Optional[str] = None, columns: Optional[Sequence[Optional[Hashable]]] = None, header: Union[bool, List[str]] = True, index: bool = True, index_label: Union[Hashable, None, Sequence[Optional[Hashable]]] = None, mode: str = 'w', encoding: Optional[str] = None, compression: Optional[Union[str, Dict[str, Any]]] = 'infer', quoting: Optional[int] = None, quotechar: str = '"', line_terminator: Optional[str] = None, chunksize: Optional[int] = None, date_format: Optional[str] = None, doublequote: bool = True, escapechar: Optional[str] = None, decimal: str = '.', errors: str = 'strict', storage_options: Optional[Dict[str, Any]] = None)[源代码]

注解

将一个或多个 DataFrame 转换成csv文件,输出到指定文件夹

小技巧

df_to_csv的参数详情 , 请访问 pandas官网 ,了解更多信息

参数

data_dict – 由 DataFrame 组成的字典,key为输出的文件名,value为 DataFrame

wordmarker.templates.pdbc_template module

class PdbcHelper(*args, **kwargs)[源代码]

基类:object

通过读取配置文件获取数据库的信息,进而建立连接
property engine: sqlalchemy.engine.base.Engine

注解

获取引擎对象

返回

  • 引擎对象engine

property engine_dict

注解

获取引擎对象中设置的值

返回

  • 引擎对象中设置的值

  • key为属性

  • value为对应的值

set_engine(**kwargs)[源代码]

注解

设置引擎

小技巧

你可以在调用PdbcTemplate内的方法之前,设置引擎需要的其他参数(不包括配置文件内的参数)

参数

kwargs – 除去配置文件中其他的值,采用key=value的形式

返回

  • engine对象

class PdbcOperations[源代码]

基类:object

数据库的相关操作的抽象类
abstract execute(sql)[源代码]

注解

执行sql语句,建议sql类型为DDL(数据定义语言)时候使用

参数

sql – sql语句

abstract query(sql)[源代码]

注解

查询数据库

参数

sql – sql语句

返回

  • 查询结果

abstract update(sql)[源代码]

注解

更新数据库

参数

sql – sql语句

class PdbcTemplate(*args, **kwargs)[源代码]

基类:wordmarker.templates.pdbc_template.PdbcOperations, wordmarker.templates.pdbc_template.PdbcHelper, wordmarker.data.formatter.SqlFormatter

操作数据库的模板
execute(sql, *args, **kwargs)[源代码]

注解

使用sqlalchemy中的方法执行sql,建议sql类型为DDL(数据定义语言)时候使用

小技巧

如果sql为 select,建议使用query方法

如果sql为 updatedeleteinsert ,建议使用update方法

参数

sql – sql语句

query(sql, *args)Union[pandas.core.frame.DataFrame, Iterator[pandas.core.frame.DataFrame]][源代码]

注解

查询数据库

参数
  • sql – sql语句

  • args – 问号对应的值

返回

  • 查询的数据

query_table(table_name, schema=None, index_col=None, coerce_float=True, parse_dates=None, columns=None, chunksize: Optional[int] = None)Union[pandas.core.frame.DataFrame, Iterator[pandas.core.frame.DataFrame]][源代码]

注解

使用 pandas.read_sql_table 方法,读取整张表的数据

小技巧

query_table的参数详情 , 请访问 pandas官网 ,了解更多信息

返回

  • 查询的数据

update(sql, *args)[源代码]

注解

更新数据库

参数
  • sql – sql语句

  • args – 问号对应的值

update_table(data: pandas.core.frame.DataFrame, name: str, schema=None, if_exists: str = 'replace', index: bool = False, index_label=None, chunksize=None, dtype=None, method=None)[源代码]

注解

使用 pandas.to_sql 方法,将数据写入数据库中的一张表中

小技巧

update_table的参数详情 , 请访问 pandas官网 ,了解更多信息

参数

data – 数据框

wordmarker.templates.word_template module

class AbstractConverter(word_tpl: wordmarker.templates.word_template.WordTemplate)[源代码]

基类:object

此类是用来实现的,可以将yaml模板中的插值进行转换

定义的方法可以为@staticmethod修饰的方法,不能有任何参数,也可以为由self一个参数构成的方法
convert_to_dict()dict[源代码]

注解

将读取的yaml模板中的内容转换为字典

返回

  • yaml模板中的内容,类型为字典

convert_to_str()str[源代码]

注解

将读取的yaml模板中的内容转换为字符串

返回

  • yaml模板中的内容,类型为字符串

get_value(prop)[源代码]

注解

从转换后的yaml字典中,根据属性获取对应的值

加载多个yaml文件,排在后面的文件里的值,会覆盖前面的文件里的值

参数

prop – 属性,用 . 分隔,例如,pdbc.engine.url

返回

  • 转换后的yaml字典中对应的值

class DocxHelper(*args, **kwargs)[源代码]

基类:wordmarker.loaders.default_resource_loader.DefaultResourceLoader

通过读取配置文件,获取docx文件模板的相关信息
property docx

注解

获取docx文件的绝对路径

返回

  • yaml文件中 data.docx.input.path 是目录,返回当前目录下docx文件的绝对路径

  • yaml文件中 data.docx.input.path 是文件,返回docx文件的绝对路径

property docx_in_path

注解

通过读取yaml文件的 data.docx.input.path 属性,获取输入的docx文件或目录的绝对路径

返回

  • docx文件或目录的绝对路径

property docx_out_path

注解

通过读取yaml文件的 data.docx.output.dir 属性,获取输出的docx目录的绝对路径

返回

  • docx目录的绝对路径

get_docx_file_name()[源代码]

注解

获取docx文件的文件名

返回

  • 是docx文件,返回文件的名字

  • 是目录,返回当前目录下的所有docx文件的文件名

class ImgHelper(*args, **kwargs)[源代码]

基类:wordmarker.contexts.system_context.SystemContext

通过读取配置文件,获取img文件的相关信息
clear_img()[源代码]

注解

清除 data.img.output.dir 属性对应的img的输出目录下的所有文件和目录

get_img_file(img_name)[源代码]

注解

根据图片的名字,获取图片的绝对路径

警告

必须先将图片输出到输出目录下,才能获取到

参数

img_name – 图片的名字

返回

  • 图片的绝对路径

property img_out_path

注解

通过读取yaml文件的 data.img.output.dir 属性,获取输出的img目录的绝对路径

返回

  • img目录的绝对路径

class TextHelper(*args, **kwargs)[源代码]

基类:object

通过读取配置文件,获取文本yaml文件的相关信息
get_value(prop)[源代码]

注解

从yaml字典中,根据属性获取对应的值

加载多个yaml文件,排在后面的文件里的值,会覆盖前面的文件里的值

参数

prop – 属性,用 . 分隔,例如,pdbc.engine.url

返回

  • yaml字典中对应的值

get_yaml()dict[源代码]

注解

获取从yaml文件中读取的数据,类型为dict

返回

  • path为文件,返回一个字典,内容为yaml文件的内容

  • path为目录,返回一个嵌套的字典

    • key为yaml文件的绝对路径

    • value为yaml文件的内容,是一个字典

get_yaml_singleton()[源代码]

注解

获取从 data.text.input.path 属性中对应的路径下所有yaml文件中的数据,类型为dict

加载多个yaml文件,排在后面的文件里的值,会覆盖前面的文件里的值

返回

  • 返回一个字典,内容为所有yaml文件的内容

get_yaml_singleton_str()[源代码]

注解

获取从 data.text.input.path 属性中对应的路径下所有yaml文件中的数据,类型为str,内容为一个字典

加载多个yaml文件,排在后面的文件里的值,会覆盖前面的文件里的值

返回

  • 返回一个字符串,内容为一个字典,内容为所有yaml文件的内容

property text_in_path

注解

通过读取yaml文件的 data.text.input.path 属性,获取输入的文本yaml文件的绝对路径

返回

  • 文本yaml文件的绝对路径

class WordTemplate(*args, **kwargs)[源代码]

基类:wordmarker.creatives.builder.AbstractBuilder, wordmarker.templates.word_template.TextHelper, wordmarker.templates.word_template.ImgHelper, wordmarker.templates.word_template.DocxHelper

操作docx文件的模板
append(content)[源代码]

注解

添加其他的content到全局的content中

参数

content – 其他的content,类型是 dict

返回

  • self

build(file_name=None)[源代码]

注解

创建docx文件

参数

file_name – docx文件的文件名

property tpl

注解

获取 DocxTemplate 对象,

小技巧

DocxTemplate 对象的详细信息,请访问 python-docx-template的文档

返回

  • DocxTemplate 对象

wordmarker.utils package

作者

陈思祥

时间

2021年4月

概述

当前模块是工具模块,有操作日志、文件等的工具类

  1. wordmarker.utils.logger

    日志工具类。
    
  2. wordmarker.utils.yaml

    yaml文件工具类。
    
  3. wordmarker.utils.file

    文件、路径工具类。
    

Submodules

wordmarker.utils.file module

class PathUtils(src, tgt)[源代码]

基类:wordmarker.contexts.system_context.SystemContext

路径工具类
static filter_file(file_list: Union[list, str], suffix_list: Union[list, str])[源代码]

注解

通过后缀名,过滤文件

参数
  • file_list – 文件或文件列表

  • suffix_list – 后缀或后缀列表

返回

  • 过滤后的文件或文件列表

get_relative_path()[源代码]

注解

将两个路径拼接起来

例子:

src = c:/a/b/c

tgt = ../../d/c.txt

final = c:/a/d/c.txt

-------------------------------

src = c:/a/b/c/foo.txt

tgt = ../../d/c.txt

final = c:/a/d/c.txt
返回

  • 最终路径

wordmarker.utils.logger module

class LoggerFactory[源代码]

基类:object

logger工厂,获取logger对象
static get_logger(logger_name=None)[源代码]

注解

获取日志对象 logger

参数

logger_namelogger 名字

返回

  • 日志对象 logger

log(fun)[源代码]

注解

装饰器,为类注入logger对象

小技巧

在类的 __init__ 方法上加上 @log ,可以通过类的 self._logger 获取到 logger 对象,来打印日志

你也可以直接使用 LoggerFactory 获取 logger 对象,来打印日志

错误

只能放在类的 __init__ 方法上,不能放在类上,放在类上会修改类的元类

如果当前类是被继承或继承了某个类,会导致元类冲突的异常,所以目前只支持放在 __init__ 方法上

wordmarker.utils.yaml module

class YamlUtils(*args)[源代码]

基类:object

yaml文件工具类
get_value(yaml_dict, prop_list, temp_prop, file_name)[源代码]

注解

递归调用获取yaml文件中属性对应的值

参数
  • yaml_dict – yaml文件中的数据,以字典形式存放

  • prop_list – 属性列表,例如: pdbc.engine.url -> [pdbc, engine, url]

  • temp_prop – 临时属性,在日志中进行提示,例如: pdbc.engine.url

  • file_name – yaml文件名

返回

  • yaml文件中属性对应的值