python的glob只返回第一个结果

15 投票
2 回答
8922 浏览
提问于 2025-04-17 08:31

我真的被这个问题难住了。

我有一个简单的Python封装,代码大概是这样的:

import glob

for found in glob.glob(filename):
  if not os.path.isdir(found):
    my_module.do_stuff(found)

这里的filename是从sys.argv中读取的。

当我在交互式命令行或者一个简单的“你好,世界”脚本中使用glob时,我能得到所有的文件列表(在这个例子中是5个文件)。但是,当我在这个上下文中使用它时,我只得到了第一个文件(按字母顺序)。

我检查过,把glob.glob的结果存到一个数组里,结果确实只有一个文件,长度len()是1,即使文件名只是'*'

我到底做了什么,导致glob出问题了呢?!

完整的代码文件,以防你能发现我的错误:

#! /usr/bin/python
import pynet.quadrons as q
import os, glob

def print_usage():
  print """
    (blah blah big long string.)

  """

if __name__ == "__main__":
  import sys
  if len(sys.argv) < 2:
    print_usage()
    exit()

  filename = ''

  try:
    filename = sys.argv[1]
  except:
    print "error parsing arguments."
    print_usage()
    exit()

  for found in glob.glob(filename):
    if not os.path.isdir(found):
      q.load_and_analyse_file(found)

2 个回答

1

调试基础知识:print len(sys.argv[1:]), repr(sys.argv[1:])

处理一个或多个文件名和/或一个或多个模式:

for pattern in sys.argv[1:]:
    for filename in glob.glob(pattern):
        do_something_with(filename)
16

在你运行 Python 脚本之前,系统的命令行会先处理一些特殊的字符,这个过程叫做“扩展”。所以,当你的 Python 脚本看到 sys.argv[1] 时,它实际上已经是一个完整的文件名了,这个文件名是和你输入的模式匹配的第一个文件名。然后,脚本把这个文件名传给 glob() 函数,而这个函数只会找到一个文件。

要解决这个问题,你可以在命令行中用单引号把参数括起来,这样命令行就不会去处理它,或者你也可以让命令行处理这些参数,然后在 Python 脚本中遍历 sys.argv 的所有项(除了第一个)。

另外要注意的是,在 Windows 系统上,命令行并不会进行这种扩展,所以如果你的脚本需要在不同的操作系统上都能运行,你应该遍历 sys.argv[1:] 并且对每个项都使用 glob 函数。

撰写回答