3

我正在寻找在当前工作目录中的所有文件上迭代脚本而不迭代脚本(所以任何扩展名.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

我想我很懒,可以在另一行代码中做到这一点,但只是想知道是否有人知道更有趣的方式!

4

5 回答 5

9

我推荐使用fnmatch模块:

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

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

for fileName in glob.glob('*.py'):
    print fileName
于 2012-05-31T12:57:02.867 回答
6

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

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

另一种选择是

if not fnmatch.fnmatch(file_name, "*.py"):
于 2012-05-31T12:56:58.243 回答
1

使用带通配符的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 的示例

于 2012-05-31T12:57:19.273 回答
1

除了 glob 模块,我建议查看这些generators。特别是这个:

# 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
于 2012-05-31T12:58:17.007 回答
0

使用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>
于 2012-05-31T12:56:43.160 回答