2012-08-29 11 views
5

Zbudowałem skrypt, który pobiera nazwę pliku jako argument i wyodrębnia wszystkie wiersze pasujące do określonego wzorca. Problem polega na tym, że nie może otworzyć pliku - Wciąż dostaję:Przekazywanie argumentu do skryptu Pythona i otwieranie pliku

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

To narzekają linii info = open(name, 'r').

Oto kod:

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) 

i wzywam go

`extract.py trunc.log` 

jakieś pomysły, co robię źle?

+0

jakiej używasz wersji python? –

Odpowiedz

7

sys.argv[1:] jest lista, a nie ciąg. Kiedy wycinasz listę, otrzymujesz listę z powrotem - nawet jeśli bierzesz tylko jeden element z plasterkiem. Musisz podać ciąg znaków open. Być może chciałeś sys.argv[-1] (ostatni element)?

Na marginesie, standardowej biblioteki Pythona udostępnia opcje analizowania wiersza poleceń - Jednym z nich jest doskonała argparse moduł, który został wprowadzony w Pythonie 2.7, ale może być instalowany z bardzo minimalnym wysiłku na starszych wersjach Pythona (używam go python2 .6 regularnie).

1

sys.argv zwraca listę z argumentów wiersza poleceń. może chcesz pętli na każdym elemencie tej liście (ale pierwszy z nich):

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

Zauważ, że otwieramy test.txt (plik wyjściowy), potem staramy się otworzyć każdy plik przekazany jako argument skryptu . Prawdopodobnie chcesz rzucić try... except wokół open(name,'r') na wszelki wypadek (pliku nie można otworzyć).

2

to:

name = sys.argv[1:] 

sprawia name do listy wszystkich argumentów za wyjątkiem pierwszego. Chodziło Ci o:

name = sys.argv[1] 

Do użycia w świecie rzeczywistym, warto zajrzeć do argparse.

1

jesteś lepszy z 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 ma an alternative (argparse).

+1

Dlaczego wycofane 'optparse' zamiast bardziej nowoczesnego i elastycznego' argparse'? – mgilson

+0

tak, ale tylko dla python> = 3.2 –

+1

'argparse' jest zawarty w python 2.7 ... Jest również trywialne, aby zainstalować na poprzednich wersjach:' easy_install argparse' robi mi sztuczkę. – mgilson

Powiązane problemy