Python - 如何查找EXACT扩展?

时间:2014-07-23 02:25:34

标签: python

我正在尝试遍历包含多个文件的文件夹,以查找扩展名为.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()

2 个答案:

答案 0 :(得分:0)

已编辑。请参阅下面的原始答案。

这里的真正问题似乎与算法和/或系统上的其他内容有关(关于重新启动更改内容的评论),因为str.endswith()Path.suffix应该给出相同的结果这里。


上一个(不是真正的问题)

最简单,最强大的解决方案是使用pathlib模块。如果您使用的是Python 3.4或更高版本,则会安装它;否则使用pipeasy_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