2010-07-13 27 views
5

vì vậy tôi có một tập lệnh python lấy tên tệp làm đối số lệnh và xử lý tệp đó. Tuy nhiên, vì tôi có 263 tệp cần xử lý giống nhau, tôi đã tự hỏi liệu phần đối số lệnh có thể được sửa đổi với vòng lặp for để liên tục chạy qua tất cả các tệp trong một thư mục không? Chúc mừng, SatSửa đổi tập lệnh python để chạy trên mọi tệp trong thư mục

EDIT:

Mã cho đối số hệ thống là ở đây:

try: 
    opt_list, args = getopt.getopt(sys.argv[1:], 'r:vo:A:Cp:U:eM:') 

except getopt.GetoptError, msg: 
    print 'prepare_receptor4.py: %s' %msg 
    usage() 
    sys.exit(2) 

với 'r' là tên của tập tin cần phải được xử lý và những người khác đang đối số tùy chọn. Tôi không chắc chắn làm thế nào để sửa đổi điều này với một vòng lặp for.

Trả lời

9

Thực tế, bất kỳ trình bao nào bạn đang sử dụng có thể có một số cú pháp có thể dễ dàng sử dụng cho việc này. Trong Bash, ví dụ:

for f in *; do python myscript.py $f; done 

Để thực sự làm điều này trong Python, tôi muốn đề xuất cấu trúc chương trình của bạn để mã chính có chức năng lấy một đối số, tên tệp.

def process(filename): 
    ...code goes here... 

Sau đó, bạn có thể gọi chức năng này như vậy,

for f in os.listdir(folder): 
    process(f) 

folder có thể được thông qua như là một đối số dòng lệnh, hoặc chỉ ghi vào kịch bản (nếu nó không phải là điều bạn muốn được tái sử dụng).

EDIT: Đáp lại chỉnh sửa của bạn, tôi muốn đề nghị chỉ đưa ra các tên tập tin như các đối số dòng lệnh thường xuyên, mà không sử dụng tùy chọn -r, do đó họ sẽ gió lên trong args. Sau đó, bạn có thể làm

for f in args: 
    process(f) 

hoặc nếu bạn thà vượt qua tên thư mục như là đối số dòng lệnh,

for d in args: 
    for f in os.listdir(d): 
     process(f) 

Ngoài ra, tôi cho rằng bạn có thể vượt qua nhiều trường hợp của các tùy chọn -r, và sau đó do

for opt, arg in opt_list: 
    if opt == '-r': 
     process(arg) 
+0

Chúc mừng, tôi đã cố gắng để thay đổi mã (cho vui và kinh nghiệm) nhưng cuối cùng lại phá vỡ nó ... vì vậy tôi sử dụng vòng lặp for trong bash mà làm việc một điều trị! Ngồi –

1

Có, bạn có thể sửa đổi nó như thế. Lặp qua các đối số thay vì lập chỉ mục phần tử đầu tiên.

4

os.walk() có vẻ như nó có thể hoạt động ở đây.

def traverse_and_touch(directory, touch): 
    ''' 
    General function for traversing a local directory. Walks through 
    the entire directory, and touches all files with a specified function. 
    ''' 
    for root, dirs, files in os.walk(directory): 
    for filename in files: 
     touch(os.path.join(root, filename)) 
    return 

Bây giờ, tất cả những gì bạn cần làm là chuyển vào thư mục bạn muốn duyệt và chức năng và nó sẽ thực hiện mã trên mọi tệp.

os.walk() cũng truyền tải tất cả các thư mục con.

3

Khi tôi đang làm việc trên nhiều file/thư mục, tôi thường sử dụng os.walk:

import os 
for root, dirs, files in os.walk(dir): 
    for fname in files: 
     do_something(fname) 

Nhận thư mục của bạn từ getopt hoặc optparse. Ngoài ra, bạn có thể xây dựng đường dẫn tuyệt đối với os.path.abspath nếu bạn cần.

current_file = "%s%s%s" % (os.path.abspath(root), os.path.sep, fname) 
do_something(current_file) 
1

Tôi đề nghị 'chính' của bạn nên xử lý từng tệp được đưa ra sau khi các tùy chọn. Đó là, trong biến "args". Đừng vượt qua các đường dẫn bằng "-r", điều này hạn chế sự linh hoạt của bạn. Nếu bạn sử dụng os.walk() vv trong chương trình bạn đang yêu cầu hệ thống chỉ hoạt động trên các cây của các tệp, điều này làm cho việc tùy chỉnh và phát triển trở nên khó khăn hơn.

Nếu chương trình hoạt động với danh sách đường dẫn, đó là rất dễ sử dụng theo các cách khác nhau. Ví dụ: bạn có thể liệt kê một tệp dữ liệu để thử nghiệm. Để xử lý một thư mục làm "myprogram dir/*. Dat". Để xử lý một cây tệp sử dụng backquotes:

myprogram `find . -name "*.dat"` 

Cuối cùng, bạn có thể xử lý song song rất rẻ. Một cái gì đó như:

find . -name '*.dat' | xargs -P 5 myprogram 

Năm bản sao của chương trình của bạn được chạy song song. Không có khóa hoặc dĩa hoặc chủ đề hoặc đồng bộ hóa khác cần thiết.

(Trên giả sử bạn đang ở trên một hệ thống kiểu Linux/OSX.)

Các vấn đề liên quan