2012-08-29 26 views
5

Tôi đã tạo một tập lệnh lấy tên tệp làm đối số và trích xuất tất cả các dòng khớp với mẫu nhất định. Sự cố là tôi không thể mở tên tệp - Tôi tiếp tục nhận được:Chuyển đối số sang tập lệnh python và mở một tệp

"TypeError: coercing to unicode: need string or buffer" 

Nó phàn nàn về dòng info = open(name, 'r').

Dưới đây là các mã:

import re 
import sys 
print sys.argv[1:] 

keyword = 'queued=' 
pattern = re.compile(keyword) 

name = sys.argv[1:] 
inf = open(name, 'r') 
outf = open("test.txt", 'w') 

for line in inf: 
    if pattern.search(line): 
     outf.write(line) 

Và tôi gọi nó với

`extract.py trunc.log` 

Bất kỳ ý tưởng những gì tôi đang làm sai?

+0

bạn sử dụng phiên bản python nào? –

Trả lời

7

sys.argv[1:] là một danh sách , không phải là chuỗi. Khi bạn cắt một danh sách, bạn sẽ nhận được một danh sách trở lại - ngay cả khi bạn chỉ lấy 1 phần tử với slice. Bạn cần phải cung cấp open một chuỗi. Có lẽ bạn muốn sys.argv[-1] (yếu tố cuối cùng)? Là một lưu ý phụ, thư viện chuẩn python cung cấp tùy chọn phân tích cú pháp dòng lệnh - Một là mô-đun argparse xuất sắc được giới thiệu trong python 2.7, nhưng có thể được cài đặt với nỗ lực rất nhỏ trên các phiên bản python cũ hơn (tôi sử dụng nó với python2) .6 thường xuyên).

1

sys.argv trả về danh sách đối số dòng lệnh. Bạn có thể muốn để lặp trên mỗi phần tử của danh sách này (nhưng cái đầu tiên):

with open("test.txt", "w") as outf: 
    for name in sys.argv[1:]: 
     with open(name, 'r') as inf: 
      ... 

Lưu ý rằng chúng tôi mở test.txt (tập tin đầu ra của bạn) trước, sau đó chúng tôi cố gắng để mở mỗi tập tin thông qua như là đối số của kịch bản của bạn . Bạn có thể muốn ném một try... except xung quanh open(name,'r') chỉ trong trường hợp (không thể mở tệp).

2

này:

name = sys.argv[1:] 

làm name vào một danh sách của tất cả các đối số trừ là người đầu tiên. Ý của bạn là:

name = sys.argv[1] 

Để sử dụng trong thế giới thực, bạn có thể muốn xem xét argparse.

1

bạn tốt hơn với optparseargparse

import argparse 

parser = argparse.ArgumentParser(description='Process some integers.') 
parser.add_argument('integers', metavar='N', type=int, nargs='+', 
        help='an integer for the accumulator') 
parser.add_argument('--sum', dest='accumulate', action='store_const', 
        const=sum, default=max, 
        help='sum the integers (default: find the max)') 

args = parser.parse_args() 
print(args.accumulate(args.integers)) 

python 3.2 có an alternative (argparse).

+1

Tại sao «optparse' không được chấp nhận thay cho' argparse' hiện đại và linh hoạt hơn? – mgilson

+0

có, nhưng chỉ cho python> = 3.2 –

+1

'argparse' được bao gồm với python 2,7 ... Nó cũng tầm thường để cài đặt trên các phiên bản trước:' easy_install argparse' thực hiện thủ thuật cho tôi. – mgilson

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