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
в интерактивной оболочке или мире приветствия script, я получаю полный список файлов (в данном случае 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)
Ответы
Ответ 1
Оболочка расширяет glob перед тем, как видит Python script. Поэтому ваш Python script видит первое полное имя файла, которое соответствует glob в sys.argv[1]
, передает это значение в glob()
, и, конечно, оно соответствует только одному файлу.
Либо укажите аргумент в оболочке с одинарными кавычками, чтобы оболочка не расширила его, либо просто разрешила оболочке выполнять расширение и повторять все элементы sys.argv
(кроме первого).
Стоит отметить, что в Windows оболочка не делает глобусы, поэтому, если ваш script должен работать кросс-платформенным, вы должны перебирать sys.argv[1:]
и glob каждый элемент.
Ответ 2
Отладка 101: 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)