我正在尝试遍历包含多个文件的文件夹,以查找扩展名为.doc
的文件。
是的我使用了.endswith('.doc')
函数,但就我而言,它还解析了.docx
个文件。是否有正则表达式或某种使用方式?
编辑:好吧,我的问题是,我正在循环查找“.doc”文件,如果有的话,我会将文本提取到变量中,然后使用win32com函数打印它。当我把程序放在一个包含“.doc”和“.docx”文件的文件夹中时,我有一个错误说:
Traceback (most recent call last):
File "C:\Users\IdaLim\Desktop\MyTestCode\FileIO.py", line 88, in <module>
doc = app.Documents.Open(fullpath)
File "C:\Python27\lib\site-packages\win32com\client\dynamic.py", line 522, in
__getattr__
raise AttributeError("%s.%s" % (self._username_, attr))
AttributeError: Word.Application.Documents
根据我对COM函数的经验和知识,它也通过“.docx”文件进行解析,这就是为什么.docx文件没有“Word.Application.Documents”的原因。因此解释了这个错误。
因此,当我将“.doc”文件隔离到另一个文件夹(即没有.docx文件)时,循环和程序完全正常。它打印文件的内容并在那里结束。
我的代码摘录:
import win32com.client
import os
rootdir ='C:\Users\IdaLim\Desktop\docs'
for subdir, dirs, files in os.walk(rootdir):
for file in files:
fullpath = os.path.join(*[subdir, file])
if file.endswith('.doc'):
app = win32com.client.Dispatch('Word.Application')
doc = app.Documents.Open(fullpath)
print doc.Content.Text
app.Quit()
答案 0 :(得分:0)
(已编辑。请参阅下面的原始答案。)
这里的真正问题似乎与算法和/或系统上的其他内容有关(关于重新启动更改内容的评论),因为str.endswith()
和Path.suffix
应该给出相同的结果这里。
最简单,最强大的解决方案是使用pathlib
模块。如果您使用的是Python 3.4或更高版本,则会安装它;否则使用pip
或easy_install
进行安装。然后你可以像这样处理你的道路:
import win32com.client
import os
import pathlib
rootdir ='C:\Users\IdaLim\Desktop\docs'
for subdir, dirs, files in os.walk(rootdir):
for file in files:
fullpath = pathlib.Path(subdir, file)
if fullpath.suffix == '.doc':
app = win32com.client.Dispatch('Word.Application')
doc = app.Documents.Open(str(fullpath))
print doc.Content.Text
app.Quit()
suffix
属性简单易用且可靠,可以满足您的需求。有关详细信息,请参阅pathlib
模块here上的3.4文档。
答案 1 :(得分:0)
我不知道os.walk()对象的结构,但是,假设你有一个带有文件名的字符串数组,你可以使用这个正则表达式来过滤它们:
import re
array = ['file1.doc', 'file2.docx']
regexp = "\.doc$"
for e in array:
if re.search(regexp, e, re.I):
print 'True'
else:
print 'False'
结果:
True
False