公司的部分文件分为“内部”和“外部”。正常情况下,这个标识在文件名及文件首页左上角都有标注。然鹅,有时候操作一下,忘记改了,或者忘记标注了。就需要回头去一个一个地整理,非常麻烦。这种重复的,繁杂的操作,尽快冲Python来,人类还是应该多做做其它更有意思的事。
共有如下7种情况,其对应的处理方式如下表格所示。
在处理文档之前,发现还有很多是.doc为后缀的文件。由于docx库不支持这些文件,所以需要先将它们批量转换成.docx文件。程序如下。细节请参考实例15。在完成转换后,用os.remove()将老破小的doc文件全部删除。
importos#用于获取目标文件所在路径 path=os.getcwd()+"\\文件\\"#文件夹绝对路径 files=[] forfileinos.listdir(path): iffile.endswith(".doc"):#排除文件夹内的其它干扰文件,只获取".doc"后缀的word文件 files.append(path+file) fromwin32comimportclientaswc#导入模块 word=wc.Dispatch("Word.Application")#打开word应用程序 forfileinfiles: doc=word.Documents.Open(file)#打开word文件 doc.SaveAs("{}x".format(file),12)#另存为后缀为".docx"的文件,其中参数12指docx文件 doc.Close()#关闭原来word文件 word.Quit() forfileinfiles:#删除doc文件 os.remove(file)#将文件夹内的所有doc转存为docx文件
这下整个世界清静了,满满的都是docx文件。下面将文件夹内的所有docx文件路径全部获取,存入列表docx_files。
docx_files=[] forfileinos.listdir(path): iffile.endswith(".docx"):#排除文件夹内的其它干扰文件,只获取".doc"后缀的word文件 docx_files.append(path+file) docx_files >> ['C:\\Users\\python_excel\\实例59_Python检查word文件中的特殊标记词是否与文件名中的一致\\文件\\测试.docx', 'C:\\Users\\python_excel\\实例59_Python检查word文件中的特殊标记词是否与文件名中的一致\\文件\\测试1(公开).docx', 'C:\\Users\\python_excel\\实例59_Python检查word文件中的特殊标记词是否与文件名中的一致\\文件\\测试2(内部).docx', 'C:\\Users\\python_excel\\实例59_Python检查word文件中的特殊标记词是否与文件名中的一致\\文件\\测试3(公开).docx', 'C:\\Users\\python_excel\\实例59_Python检查word文件中的特殊标记词是否与文件名中的一致\\文件\\测试4(公开).docx', 'C:\\Users\\python_excel\\实例59_Python检查word文件中的特殊标记词是否与文件名中的一致\\文件\\测试5(内部).docx', 'C:\\Users\\python_excel\\实例59_Python检查word文件中的特殊标记词是否与文件名中的一致\\文件\\测试6.docx']#获取所有docx文件路径
然后开始憋最后的大招,写整理文件的程序了。先导入相关的库。建一个计数器counter,令其初始值为0。这个计数器用于记录有多少文件没有被处理,然后用文件的总数减去它,就能得到处理过的文件数量。为什么不直接记录处理过的文件的数量呢?因为处理的操作太多,比较混乱,计数麻烦,所以曲线救国更方便。
然后遍历待检查的所有文件,逐个进行处理。先用split()按"."拆分出文件头file_head,并用rstrip()去除尾部可能的空格;按"\"拆分出文件尾file_tail。比如“C:\Users\文件\测试.docx”拆出的头是“C:\Users\文件\测试”,尾是“测试.docx”。这个后面重命名文件的时候会用到。
将要用到的标记词“公开”和“内部”放入列表mark_words以便后续调用。因为文件头中有标记词的话,倒数第三个加第二个就是,因此按此取数存入字符串mark_fileName。然后使用docx.Document()打开该文件,提出首段paragraphs[0]中的文本,存入mark_doc。如果文档中有标记词的话,mark_doc的值就应该是“公开”或“内部”,否则就是其他字符了。
标记词提取好了,就开始比对了,然后根据比对的结果采取对应的操作。以文档中是否有关键词,分为两种大的情况。
如果文档中有标记词,再判断文件名中有无标记词,如果有的话,则将其跟文档中的进行比对,如果二者一致,则计数器加1,并通过pass跳过后面的所有判断,回到for循环,进行下一个文件的检查。如果二者标记词不同,则按照文档中的标记词重命名文件。如果文件名中无标记词,则给文件名加上标记词。
如果文档中无标记词,则直接在文档首段前插入一段,并写入“公开”二次,并设置字体为黑体,大小为16磅,并保存文件。然后再判断文件名中是否有标记词,有的话再判断是否为“公开”,若是,则直接pass;若不是,则替换成“公开”。如果文件名中无标记词,则按“公开”标记词重命名文件。
以上,只要有一步有对文件或文件名有操作,则通过print显示操作内容,以便我们知道做了哪些更改。最后显示检查过的文件和处理过的文件的个数。
fromdocx.sharedimportPt#用于设定字体大小(磅值) fromdocx.oxml.nsimportqn#用于应用中文字体 counter=0#计数器,用于记录有多少文件没被处理 forfileindocx_files: file_head=file.split('.')[0].rstrip()#文件名头,类似这样的“C:\\Users\\文件\\测试” file_tail=file.split('\\')[-1]#文件名尾,类似这样“测试.docx” mark_words=["公开","内部"] mark_fileName=file_head[-3:-1]#文件名中倒数第2,3个文字 doc=docx.Document(file) mark_doc=doc.paragraphs[0].text#文件中首段文字 #比对标记词 ifmark_docinmark_words:#判断文件中有无标记 ifmark_fileNameinmark_words:#判断文件名中有无标记 ifmark_doc==mark_fileName:#如果二者标记相同 counter+=1 pass else:#二者标记不同 os.rename(file,file.replace(mark_fileName,mark_doc))#重命名文件 print(f"【{file_tail}】文件名重命名标识为【{mark_doc}】") else: os.rename(file,f"{file_head}({mark_doc}).docx")#文件名中无标记,则加标记 print(f"【{file_tail}】文件名增加标识为【{mark_doc}】") else: #文中无标记,则在首段前插入一段,写入标记 p=doc.paragraphs[0] pNew=p.insert_paragraph_before() run=pNew.add_run(mark_words[0])#写为“公开” #字体设置 run.font.size=Pt(16) run.font.name="黑体" r=run._element.rPr.rFonts r.set(qn("w:eastAsia"),"黑体") doc.save(file) print(f"【{file_tail}】内容增加标识为【{mark_words[0]}】") ifmark_fileNameinmark_words:#查看文件名中是否有标记 ifmark_fileName==mark_words[0]:#标记是否为“公开” pass else:#标记不是“公开”则替换 os.rename(file,file.replace(mark_fileName,mark_words[0]))#重命名文件 print(f"【{file_tail}】文件名重命名标识为【{mark_words[0]}】") else: os.rename(file,f"{file_head}({mark_words[0]}).docx")#文件名中无标记,则加标记 print(f"【{file_tail}】文件名增加标识为【{mark_words[0]}】") print(f"完成!共检查{len(docx_files)}个文件,处理了{len(docx_files)-counter}个文件。") >> 【测试.docx】文件名增加标识为【内部】 【测试1(公开).docx】文件名重命名标识为【内部】 【测试4(公开).docx】内容增加标识为【公开】 【测试5(内部).docx】内容增加标识为【公开】 【测试5(内部).docx】文件名重命名标识为【公开】 【测试6.docx】内容增加标识为【公开】 【测试6.docx】文件名增加标识为【公开】 完成!共检查7个文件,处理了5个文件。importdocx
到此,程序圆满完成任务,运行前和运行后的文件如下所示。可以看到,“测试.doc”文件被转换成了“.docx”文件,且按照文件里面的标记词“内部”重新命名了。其它几个测试文件也做了相应的修正。
如果您有需要处理的问题,可发邮件到邮箱:donyo@,一起探讨解决方案。微信公众号输入“源文件”提取所有源文件及资料。
喜欢此文,点亮“在看”!
elupload获取文件名与路径_Python检查word文件中的特殊“标记”词是否与文件名中的一致(实例59)...