TA的每日心情 | 擦汗 2021-11-17 09:18 |
---|
签到天数: 79 天 [LV.6]常住居民II
解元
- 积分
- 2434
|
好的!! 麻烦了
- import os
- import glob
- import re
- import time
- #遍历所有子文件
- def getFileListAll(filePath):
- filelist=[]
- for root, dirnames, filenames in os.walk(filePath):
- for filename in filenames:
- filelist.append(os.path.join(root,filename))
- #print(os.path.join(root,filename))
- return filelist
- #判断是否为txt文档
- def isTxts(nameList):
- pattern=r"^[^~$].+\.(txt)$"
- patternObj=re.compile(pattern,re.I)
- notTxtList=[]
- for fileName in nameList:
- if not patternObj.fullmatch(fileName): #判断是否为txt文件
- notTxtList.append(nameList)
- if notTxtList:
- print("存在非txt文件:{0:},请处理后再运行程序!".format(notTxtList))
- return False
- else:
- return True
- #在指定的txt文档中查找关键字
- def readTxt(fileName):#strkey:查找的关键字;fileName:文件路径
- pattern=r"^[^~$].+\.(txt)$"
- patternObj=re.compile(pattern,re.I)
- if patternObj.fullmatch(fileName): #判断是否为txt文件
- try:
- f=open(fileName,"r",encoding="utf-8")
- txt=f.read()
- f.close()
- except:
- print("读取文档失败:{0:}".format(fileName))
- return ""
- else: #无异常时,执行
- return txt
- #finally: #无论是否异常,都执行
- def writeTxt(txt,outPath):
- path="\".join(outPath.split("\")[0:-1])
- if not os.path.exists(path):
- os.mkdir(path)
- try:
- f=open(outPath,"a",encoding="utf-8")
- f.write(txt)
- f.close()
- return True
- except:
- print("写入文档失败:{0:}".format(outPath))
- return False
- #else: #无异常时,执行
- # return txt
- #finally: #无论是否异常,都执行
- def getfileName(fileList):
- '''
- :param fileList:文件路径列表
- :return nameList:文件名称列表有扩展名
- '''
- nameList=[]
- for fileName in fileList:
- name=fileName.split("\")[-1]#提取文件名
- nameList.append(name)
- return nameList
- #显示重复的文件名,如果有重复文件显示重复的文件名称,并返回False,否则返回True
- def showDupFile(nameList):
- '''
- 判断是否有文件名相同的文件
- :param fileList:文件名列表,包含绝对路径
- :return: 如果有重复文件显示重复的文件名称,并返回False,否则返回True
- '''
- if nameList: #如果文件名列表不为空
- nameSet=set(nameList)
- DupNameList=[]
- for item in nameSet:
- if nameList.count(item)>1:
- DupNameList.append(item)
- if DupNameList:#保存重复文件名的列表
- for L in DupNameList:
- print("{0:}为重复的文件,请处理!".format(L))
- return False
- else:
- print("没有发现文件名相同的文件,处理中...")
- return True
- def nameListSort(nameList,rev=True):
- '''
- 按照字符串长度排序
- :param fileList:文件名列表
- :param reverse:默认降序
- :return newNameList:返回排序后的文件名新列表
- '''
- newNameList = sorted(nameList,key = lambda i:len(i),reverse=rev) #按照字符串长度排序,降序
- return newNameList
- #添加超链接
- def formatTxtHref(nameList,txt):
- '''
- func:在文本中为特定字符串添加超链接
- :param hrefStr:待添加超链接的字符串
- :param txt:文本字符串
- :return txt:格式化的文本字符串
- '''
- print("\n开始循环添加超链接关键词辅助标记:")
- count=0
- nameListDescend=nameListSort(nameList)
- for nameD in nameListDescend:
- nameDSimple=nameD.replace(".txt","")
- nameDSMarked="【@"+nameDSimple+"@】"
- txt=txt.replace(nameDSimple,nameDSMarked)
- count=count+1
- print("\r已完成第{0: ^6}个".format(count),end="")
- print("\n开始循环清理嵌套的冗余的超链接关键词辅助标记:")
- count=0
- nameListAscend=nameListSort(nameList,rev=False)
- for nameA in nameListAscend:
- nameA=nameA.replace(".txt","")
- pattern=r"【@([^@】]*?)【@{0:}@】".format(nameA)
- patternObjTxt=re.compile(pattern)
- toHrefStr="【@"+"\\1"+"muyubug"+nameA
- txt=patternObjTxt.sub(toHrefStr,txt,count=0) #替换为的字符串
-
- pattern=r"【@{0:}@】([^【@]*?)@】".format(nameA)
- patternObjTxt=re.compile(pattern)
- toHrefStr=nameA+"\\1"+"muyubug"+"@】"
- txt=patternObjTxt.sub(toHrefStr,txt,count=0) #替换为的字符串
- txt=txt.replace("muyubug","")
- count=count+1
- print("\r已完成第{0: ^6}个".format(count),end="")
-
- print("\n开始添加超链接,")
- pattern=r"【@([^【@]+?)@】"
- patternObjTxt=re.compile(pattern)
- toHrefStr=r"<a href='entry://\1'>\1</a>"
- txt=patternObjTxt.sub(toHrefStr,txt,count=0) #替换为的字符串
-
- print("开始清理辅助标记,")
- txt=txt.replace("<@>","")
- return txt
- def formatText(fileName):
- '''
- func:清洗字符串,格式化
- :param fileName:待处理文件
- return txt:处理后的字符串
- '''
- #提取文件名
- name=fileName.split("\")[-1].replace(".txt","")
- #在文件名的每个字符键添加标记符
- pattern = re.compile('.{1,1}')
- matchCharList=pattern.findall(name)
- nameMaked="<@>".join(matchCharList)
- #生成标题部分
- txtTitle=nameMaked+"\n"
- #读入文件
- txtContent=readTxt(fileName)
- #替换正文中的特殊字符
- strList=["\n","<br>"]
- for ch in strList:
- txtContent=txtContent.replace(ch,"<BR>")
- #合成整个词条的内容
- txt=txtTitle+txtContent+"<BR>\n</>"
- return txt
- def mdxFormat(path,outputPath):
- '''
- func:格式化文本
- :param path:待格式化文本的路径
- :param outputPath:输出的路径和文件名
- '''
- fileList=getFileListAll(path)#获取指定目录下的全部文件,包括子目录中的文件
- nameList=getfileName(fileList)
- if isTxts(nameList):
- if showDupFile(nameList):#如果没有重复文件
- print("找到了{0:}个txt文档,".format(len(nameList)))
- print("开始格式化、合并文档:")
- count=0#txt文档数量统计
- txtList=[]#存储文件内容
- for fileName in fileList:
- txt=formatText(fileName) #转换换行和<br>为<BR>
- txtList.append(txt)
- count+=1
- print("\r已完成第{0: ^6}个".format(count),end="")
- txt="\n".join(txtList)
-
- #添加超链接
- txt=formatTxtHref(nameList,txt)
- print("开始写入文本,")
- if writeTxt(txt,outputPath):
- print("文件合并输出成功!")
- else:
- print("Error:Merge!")
- return
-
- def main():
- timeStart = time.time()
- path=r"/Users/vivian/Downloads/mdxFormat_upload_V3.5/test"
-
- outputPath=r"/Users/vivian/Downloads/mdxFormat_upload_V3.5/output/demo.txt"
-
- mdxFormat(path,outputPath)
- timeEnd = time.time()
- print("程序运行了%d秒"%(timeEnd-timeStart))
- if __name__ == '__main__':
- main()
复制代码 |
|