2011-12-16 28 views
12

Tôi thực sự bối rối về điều này.glob python chỉ trả lại kết quả đầu tiên

Tôi có một wrapper python đơn giản mà trông giống như sau:

import glob 

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

nơi filename đã được đọc từ sys.argv.

Khi tôi thử glob trong trình bao tương tác hoặc tập lệnh chào thế giới, tôi nhận danh sách đầy đủ (trong trường hợp này là 5) tệp. Tuy nhiên, khi tôi sử dụng nó trong bối cảnh này, tôi chỉ nhận được cái đầu tiên (theo bảng chữ cái).

Tôi đã kiểm tra bằng cách bắt kết quả của glob.glob trong một mảng và chắc chắn đủ, nó chỉ có một số len() của 1, ngay cả khi tên tệp chỉ là '*'.

Tôi có thể làm gì để phá vỡ glob?!

tập tin đầy đủ mã, chỉ trong trường hợp bạn có thể nhận ra Gotcha tôi:

#! /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

Bạn có thể gửi một mẫu 'sys.argv'? – Blender

+0

Vui lòng đăng mẫu: Hiển thị nội dung thư mục và mẫu bạn sử dụng không hoạt động – gecco

Trả lời

14

vỏ được mở rộng glob trước khi kịch bản Python của bạn nhìn thấy nó. Do đó, tập lệnh Python của bạn nhìn thấy tên tệp đầy đủ đầu tiên khớp với glob trong sys.argv[1], chuyển cho glob() và tất nhiên nó chỉ khớp với một tệp. Hoặc là trích dẫn đối số trong trình bao với dấu nháy đơn để vỏ không mở rộng nó, hoặc đơn giản là cho phép trình bao mở rộng và lặp lại trên tất cả các mục của sys.argv (ngoại trừ phần đầu tiên).

Đó là giá trị cần lưu ý rằng trên Windows, vỏ không làm globbing, vì vậy nếu kịch bản của bạn cần phải làm việc cross-platform, bạn nên lặp trên sys.argv[1:]glob mỗi mục.

+0

Cảm ơn, chính xác những gì đang diễn ra :) – tehwalrus

1

Debugging 101: print len(sys.argv[1:]), repr(sys.argv[1:])

Catering cho một hoặc nhiều tên tập tin và/hoặc một hoặc nhiều mẫu:

for pattern in sys.argv[1:]: 
    for filename in glob.glob(pattern): 
     do_something_with(filename) 
Các vấn đề liên quan