如何用PYTHON写自动化
书写工具:
1.设计目标:
首先,我想谈谈该工具的功能:
遍历一个目录中所有指定的后缀文件,包括其子目录,然后将指定的字符串插入这些文件的文件头。
2.使用场景:
设计这样一个工具的原因是我最近把CSDN的博客移到了我自己的Hexo博客空间。我应该知道,如果都是Markdown写的,我只需要在移动的时候在文件头增加以下额外的内容:
-
标题:博客标题
日期:博客创建的时间(例如:2016-09-03 17:15:22)
标签:标签(如[Hexo,Next],多个单词之间用,)分隔。
类别:分类(如网络)
- 123456
标题?标题?就用文件名去掉?。md?后缀足够;
时间?约会?你需要通过文件库获取文件的创建时间;
标签?标签?还有分类?类别?因为我的文件会按照分类放在不同的子目录下,所以我可以直接得到当前文件所在目录的名称。
另外,为了在博客的主页上只显示部分内容,而不是展开博客的全部内容,需要在博客的适当位置插入这个标签:
3.实施代码:
按照上面的思路,我们在哪里?来源/_帖子?目录来创建一个工具脚本,名为。SuitFileToHexo.py?,然后依次完成以下步骤:
在Linux环境下指定Python解释器目录,并指定编码方式:
#!/usr/bin/env python# -*-编码:utf-8 -*-
介绍的模块:
在脚本的开头,首先要做的是先介绍所有需要用到的模块,粗略分析一下我们这个功能需要的模块:
导入操作系统。路径,时间
1
遍历当前目录中的所有内容?。md?文件列表:
这就需要使用Python的文件目录操作模块了?os.path?,使用?os.listdir?得到一个目录列表,然后遍历?os.path.splitext?拆分文件名和后缀名来过滤符合条件的文件:
#获取带有指定后缀def的指定目录的文件列表getFileList(path,endStr):' '获取带有指定后缀' ' r_list = []的指定目录的文件列表。
f_list = os.listdir(路径)?#获取f_list中I的目录列表:#分隔文件名和后缀名,过滤掉工具脚本。
file _ endstr = OS . path . split ext(I)[1]#判断是否是目录。
if os.path.isdir(i):
f _ list 1 = OS . listdir(path+'/'+I)for j in f _ list 1:#过滤掉带有指定后缀endStr的文件。
if OS . path . split ext(j)[1]= = end str:#标识文件所在的目录,以便清楚。
r _ list . append(I+'/'+j)# print j . decode(" string _ escape ")
elif file_endStr == endStr:
r_list.append(i)返回r_list
我在这里发现了一个问题,就是在?os.path.isdir(i)?在2.7.11版本中,莫名其妙的返回false,需要修改如下才能正常:
if file_endStr == ' ':
i = os.path.join(path,I)?# = = = = = = = = = = = >这行是必须的。
#打印I
#确定它是否是一个目录
if os.path.isdir(i):
...
获取文件的创建时间:
需要用吗?os.time?模块的功能:
#获取文件创建时间def get_FileCreateTime(filePath):
t = os.path.getctime(filePath)?返回时间戳时间(t) #将时间戳转换为时间:1479264792到2016-16 10:53:12 ' ' def时间戳。
timeStruct = time.localtime(时间戳)?return time . strftime(' % Y-% M-% d % H:% M:% S ',timeStruct)
获取博客标题:
其实就是把后缀从目录字符串里截掉然后把最后一个截掉?/?你可以从前面的内容中得到博客的名字:
#获取文件名def getFileSimpleName(filePath ),不包含目录中的前一个路径和后缀:
name = ' '
#首先删除后缀
name = OS . path . split ext(file path)[0]?#获取最后一个斜杠位置
index = name.rfind('/')?#如果找不到,则返回-1。
if指数!= -1: ?#截取斜杠后的内容到末尾
name = name[index+1:]?#打印姓名
返回名称
获取文件所在目录的名称作为tab值:
类似于获取博客名的思路,获取最后一个斜杠位置,截掉斜杠后的内容,再获取最后一个斜杠位置。如果有,截掉斜杠后的内容就是文件所在的目录名:
#获取目录名defgettypenamebypath(file path):file tag = ' ' #获取最后一个斜杠位置index = filePath.rfind('/')#如果找不到,则返回-1if index!= -1: #截取斜杠到末尾的内容。
FileTag = filePath[:index] #切掉前面的部分。
index = file tag . rfind('/')if index!= -1:
file tag = file tag[index+1:]# print fileTag return fileTag
将内容插入文件:
调用以上方法分别得到我们想要的信息:
#指定目录路径= '。/' # Get file list files = getFileList(path,'。MD’)?
对于文件中的I:?print ' title:'+getfile simplename((I . decode(" string _ escape ")))?print ' date:'+get _ file create time((path+I . decode(" string _ escape ")))?print '标记:['+getTypeNameByPath((I . decode(" string _ escape "))+']'
接下来要做的就是按照格式将这些内容插入到文件中。当然,在插入之前,需要检查文件中是否插入过类似的内容。你可以简单的判断前40个字符串是否包含这个字符串:
''' -
标题: '''
关于显示分隔符?& lt!-更多-& gt;?插入位置的一般逻辑是:在第一个标题之后,第二个标题之前,而用Markdown语法写的博客标题用?#?最终的插入方法如下:
#将指定的数据def addheadtofile(文件路径,标题,日期,标签):file = open(文件路径,“r”)插入文件。
content = file.read()
index = content[:40]。查找(“”)
title:' ')# Add IF INDEX = =-1:print '未添加'
addContent = ''' -
标题:' ' '+标题+' ' '
日期:' ' '+日期+' ' '
标签:[' ' '+标签+''']
类别:' ' '+标签+' ' '
& ltHR/>;
'''
#检测是否插入部分显示标签。
内容=添加内容+内容
index = content . find(“”& lt;!“更多->”如果index == -1: #获取第一段的位置。
index = content . find(' ' # # # ' ')if index!= -1: #print "first ### pos = ",index
#下一个标题位置(插入第二个标题之前)
pos =内容[索引:]。查找(“”)
# ' ' ',1)如果pos!= -1:
index+= pos # print " second enter pos = ",index
content = content[:index]+' ' '
& lt!-更多-& gt;
' '+内容[索引:]
file = open(文件路径,“w”)
File.write (content) else: # print '文件头添加了' #记住关闭文件file.close()。
最后,完整的呼叫过程:
#指定目录路径= '。/' # Get file list files = getFileList(path,'。MD’)?
#在文件中为I声明一些全局变量title ='' date ='' tags = ' ':
title = getfile simplename(I . decode(" string _ escape "))
date = get _ file create time(path+I . decode(" string _ escape "))
tags = getTypeNameByPath(I . decode(" string _ escape "))print ' title:'+title print ' date:'+date print ' tags:['+tags+']'
addHeadToFile(path+I . decode(" string _ escape "),标题,日期,标签)