python的glob只返回第一个结果
我真的被这个问题难住了。
我有一个简单的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 函数。