编程整理术

整理术大行其道,但现有的整理术大多是在讲有形物的整理,无形的电子资料怎样整理呢?那当然就离不开编程了。可即使是会编程,整理资料也存在很多弊端。

我们平时可能收集了很多资料,或者自己也整理了一些资料,但这些资料的内容特点不一样,导致了他们的格式往往也是不统一的。为了对这些资料进行处理,就得写很多不同的程序,这些程序的整理本身就成为一个问题,日后想使用就比较麻烦。

这里,结合个人的实践体验,推荐给大家一种有趣的编程架构,它的目标是用一个接口统一所有的文件打开格式,所有的文件导出格式。

为了实现这个目标,我们必须安装一个关键的库:dill,它的功能是将一部分代码保存成一个文件,并能够导入运行。dill库的直接用pip安装即可,使用则是直接import dill,下面介绍一下核心逻辑。

# 根据文件名的提示,载入任何已经定义的格式文件
def loadAnyFile(name):
    f1= getPureFileName(name)
    info1= f1.split('_')
    if 'list1' in info1:
        # 标题+tab的简单对象,对应多个列表
        return loadList1(name)
    elif 'smplist' in info1:
        # 简单列表,整个文件每行一个
        return loadSimpleList(name)
    elif 'dblist' in info1:
        # 双列表,每行一个列表
        return loadDoubleList(name)
    elif 'list2b' in info1:
        # 注释行分割的,第一行为name,后面为desc
        return loadList2b(name)
    elif 'list2a' in info1:
        # 某种符号分割的name=value对列表
        return loadList2a(name,1)
    elif 'list2c' in info1:
        # 反向的list2a
        return loadList2a(name,2)
    elif 'dict1' in info1:
        # 等号分割的字典
        return loadDict1(name)
    elif 'dict1a' in info1:
        # 扩展不必是等号分割的字典
        return loadDict1(name,1)
    # elif 'picstory' in info1:
    #     return loadPicStory(name)
    elif 'obj' in info1:
        return readObj(name)
    elif 'dill' in info1:
        return readObjDill(name)
    elif os.path.isdir(name) and 'desc' in info1:
        return loadManyObj(name)
    elif os.path.isdir(name) and 'sublist' in info1:
        return loadDirList(name)
    elif os.path.isdir(name):
        return loadDir(name)
    else:
        for item in comList['filetype']:
            find= True
            for tag in item['tags']:
                # print(tag, info1)
                if tag not in info1:
                    find= False
            if find:
                return readObjDill(item['loader'])(name,item['loader'])
        return readText(name)

核心代码,loadAnyFile,直接传入一个文件名,在文件名中,用下划线区隔表明文件的格式类型。举个例子来说,下面是我整理的部分中医资料,具体格式的定义,可以参见具体函数的代码。

编程整理术_第1张图片

 当然我们不断在同一个文件中增加多个函数来丰富它的功能,但这样这个工具文件本身就会变得太大,这种做法并不实用。所以其中最有用的功能,是在else的前面部分,这里模仿了windows的com对象和文件扩展名注册的某些思路,将指定格式的打开的函数注册成一个dill对象,这样对于较复杂的文件格式,完全可以在另外的代码中实现,并进行注册。我们的工具文件本身可以完全不知道那些代码的实现方式。

举一个具体的例子:

import filetool

# 读入简单的插图文档=若干节,每节若干段,每段可配一图,图以关键字的形式保存
def loadPicStory(name, func):
    def addPic(obj, picdata):
        if isinstance(obj, dict):
            secs= obj['secs']
        elif isinstance(obj, list):
            secs= obj
        for sec in secs:
            for line in sec['list']:
                if 'pickey' in line:
                    if line['pickey'] in picdata:
                        line['pic']=picdata[line['pickey']]
                    else:
                        print('未找到图片:', line['pickey'])
    obj={}
    obj['addpic']=addPic
    obj['secs']=[]
    with open(name, 'r', encoding='utf-8') as f1:
        while line:= f1.readline():
            line= line.strip()
            if line=='':
                continue
            if line[0]=='【':
                sec= {}
                sec['name']= line[1:-1]
                sec['list']=[]
                obj['secs'].append(sec)
                info={}
            elif line[0]==':':
                if not info:
                    info={}
                    info['txt']=''
                    sec['list'].append(info)
                info['pickey']= line[1:]
            else:
                info={}
                info['txt']= line
                sec['list'].append(info)
    return obj

filetool.regDealer(['picstory'], loadPicStory)

这里定义了一种常见的格式——配图文章,也是现在自媒体中常见的格式。我把它定义为如下的一种文本类型:

【春】

细雨如织,细数回忆的时间,似乎也变得很长很长,如同从未断线的雨丝,无止无休。

在冬天之末,春天之始,手捧一片新绿,眼前的黑瓦白墙,也似乎生动了几分。
:1
太湖石上写不尽的春光,却隐在墙角之下。只是不知,你会不会走过这道门?
:2

草长莺飞的季节,如果春天欢喜,这一片姹紫嫣红会有多么美丽?
:3

通幽的小径中,你寻到了什么样的风光?其实,门前的树也开满了花。
:4

小亭的一角,绿树红花点燃了整个院子,却只有鱼儿噙香而醉。
:5

我眺望的街头,你的身影会不会突然出现?
:6

【夏】

夏天来了,这个多雨的季节。纷杂而至的记忆,似乎也带着潮湿的味道。

人来人往的街道中,是谁的雨伞甩出了朵朵莲花?
:7

我追寻的影子,眨眼间便隐于一片渺茫的水汽中。是谁扔下的石子,溅起了水花?
:8

青石小路上,风干了淋漓的小雨,也风干了潮湿的回忆。
:9

热闹的拱桥上,却没有任何多余的故事。
:10

莲叶张开了手掌,鱼儿们欢快的穿梭其中,忙着捉迷藏。
:11

【秋】

我在黄叶上写上你的名字,然后一片片埋进土里,装进记忆。

野渡无人舟自横,小小的岸边,小舟带着陈年的记忆,静静的等待。
:12

小舟从此逝,沧海度余生。我曾以为,渺茫的烟波会是最好的归宿。
:13

海市蜃楼般的风光,明知是虚幻,却为何念念不忘?
:14

窗前的故事,稀稀落落的掉进了水里。红色窗扉依旧,只是再也没有了听故事的人。
:15

岸边的黄叶,请告诉秋天,我的思念。
:16

停车坐爱枫林晚,霜叶红于二月花。原来秋天,可以比春天更热闹。
:17

【冬】

下雪了,我们曾相约一起看雪,最后却都食言了。

落雪了,纷纷的白色花朵,是冬天的礼物么?
:18

树上挂满了白色的花朵,这样的冬天,好像会魔法。
:19

银装素裹的世界里,只有这袅袅而起的炊烟,带着生命一些活力。
:20

从入冬开始,我就期盼一场漫天大雪。湮灭过去,也湮灭回忆。
:21

通过自动读入格式,在根据此格式自动生成配图的word文档,由于较长,这里用缩略图展示。

编程整理术_第2张图片

 这样的word文档,在很多自媒体中可以支持自动导入。

最后,再展示一下注册环节的代码,目前通过三个函数来实现:

# 新增登记,检查重名情况
def regFileType(path, file, kind='loader'):
    for item in comList['filetype']:
        if item['tags']==path:
            obj= item
            break
    else:
        obj={}
        obj['tags']=path
        comList['filetype'].append(obj)
    obj[kind]= file

# 载入文件类型登记记录
def loadFileTypeReg():
    file= os.path.join(base, 'filetype_obj.txt')
    if not os.path.exists(file):
        comList['filetype']= []
    else:
        comList['filetype']= readObj(file)

# 登记之后,保存文件类型记录
def saveFileTypeReg():
    file= os.path.join(base, 'filetype_obj.txt')
    saveObj(comList['filetype'], file)

这里只是编程整理术的一个具体应用,实现方法也未必是最佳的,在个人的实践中肯定还会做持续的迭代改进。但持续的整理,肯定是一件有益于身心的事情,希望看懂的同学能够受到启发,在自己的实践中发挥更多的作用。

你可能感兴趣的:(python入门,python,整理)