整理术大行其道,但现有的整理术大多是在讲有形物的整理,无形的电子资料怎样整理呢?那当然就离不开编程了。可即使是会编程,整理资料也存在很多弊端。
我们平时可能收集了很多资料,或者自己也整理了一些资料,但这些资料的内容特点不一样,导致了他们的格式往往也是不统一的。为了对这些资料进行处理,就得写很多不同的程序,这些程序的整理本身就成为一个问题,日后想使用就比较麻烦。
这里,结合个人的实践体验,推荐给大家一种有趣的编程架构,它的目标是用一个接口统一所有的文件打开格式,所有的文件导出格式。
为了实现这个目标,我们必须安装一个关键的库: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,直接传入一个文件名,在文件名中,用下划线区隔表明文件的格式类型。举个例子来说,下面是我整理的部分中医资料,具体格式的定义,可以参见具体函数的代码。
当然我们不断在同一个文件中增加多个函数来丰富它的功能,但这样这个工具文件本身就会变得太大,这种做法并不实用。所以其中最有用的功能,是在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文档,由于较长,这里用缩略图展示。
这样的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)
这里只是编程整理术的一个具体应用,实现方法也未必是最佳的,在个人的实践中肯定还会做持续的迭代改进。但持续的整理,肯定是一件有益于身心的事情,希望看懂的同学能够受到启发,在自己的实践中发挥更多的作用。