Bash中任何等效的*样式,用于处理与相同模式不匹配的多个文件



我希望在不迭代脚本的情况下迭代当前工作目录中的所有文件的脚本(因此任何扩展.py)。我以前用过这个

for fileName in os.listdir('.'):
    if fileName != 'autocorrelation1.py':
        with open(fileName, "r") as input:
        REST OF SCRIPT HERE

当我在文件夹中只有一个脚本 autocorrelation.py 时,这有效,但现在我有几个 python 脚本,我想知道是否有 bash 风格的等效物*

例如
for fileName in os.listdir('.'):
    if fileName != *'.py':
        with open(fileName, "r") as input:
        REST OF SCRIPT HERE

我想我很懒惰,可以用另一行代码来完成,但只是想知道是否有人知道更有趣的方式!

我建议使用 fnmatch 模块:

for fileName in os.listdir('.'):
    if not fnmatch.fnmatch(fileName, '*.py'):
        print fileName

glob 模块可以帮助您找到匹配的文件,如果这是您想要的:

for fileName in glob.glob('*.py'):
    print fileName

在这种特殊情况下,最简单的解决方案是

if not file_name.endswith(".py"):

另一种选择是

if not fnmatch.fnmatch(file_name, "*.py"):

除了 glob 模块,我建议看看这些生成器。具体来说,这个:

# genfind.py
#
# A function that generates files that match a given filename pattern
import os
import fnmatch
def gen_find(filepat,top):
    for path, dirlist, filelist in os.walk(top):
        for name in fnmatch.filter(filelist,filepat):
            yield os.path.join(path,name)
# Example use
if __name__ == '__main__':
    lognames = gen_find("access-log*","www")
    for name in lognames:
        print name

使用带有通配符的 glob 检查一组(或子集)文件,并使用 endswith() 过滤.py文件。

例如,

import glob
for fn in glob.glob('*'):  # specify set of files to check
   if not fn.endswith('.py'): 
      print(fn)

根据更新/澄清的问题更新代码。

本周的 Python 模块有更多使用 glob 的示例

使用re模块,你可以在这里找到它

re.search('^.*py$',str(yourFileName))

这是输出:

>>> import re
>>> 
>>> a = re.search('^.*py$','prova')
>>> a
>>> a = re.search('^.*py$','prova.py')
>>> a
<_sre.SRE_Match object at 0x2b09559c1760>

最新更新