Ich bin neu in der Verwendung des Arparse-Moduls in Python und hoffe, dass mir jemand bei dem folgenden Problem helfen kann. Ich gebe eine variable Anzahl von Dateien als Eingaben an, indem ich:

parser = argparse.ArgumentParser(description='Get Files')    
parser.add_argument('-i','--input', help='Input file(s)',required=True, nargs='+') 
args = parser.parse_args()

Ich möchte eine variable Anzahl von Dateieingaben mit einem zugeordneten Wert von 1 oder 2 angeben und bin mir nicht sicher, wie ich das tun soll.

Ich möchte, dass das Programm so funktioniert, dass mein Befehlszeileneintrag wie folgt lautet:

MyProgram.py -i myfile.txt 2 secondfile.txt 1 ...

Wie rufe ich jede Datei im Programm auf, wenn dies funktioniert?

2
user2165857 25 Nov. 2013 im 23:41

4 Antworten

Beste Antwort

Ihr Code ist funktionsfähig. Sie können das Grouper-Rezept verwenden, um {{X0} zu durchlaufen. } zwei Elemente gleichzeitig:

import argparse
parser = argparse.ArgumentParser(description='Get Files')    
parser.add_argument('-i','--input', help='Input file(s)',required=True, nargs='+') 
args = parser.parse_args()
for filename, num in zip(*[iter(args.input)]*2):
    print(filename, num)
    # with open(filename) as f:
    #     ....

Ausbeuten

('myfile.txt', '2')
('secondfile.txt', '1')
1
unutbu 25 Nov. 2013 im 19:52

Es wäre klarer, -i einmal für jedes Eingangspaar zu haben, wie folgt:

parser.add_argument("-i", "--input", nargs=2, action='append')

Nun wäre args.input eine Liste von Listen

 [ ['myfile.txt', 2], ['secondfile.txt', 1] ]

Für den Benutzer ist etwas mehr Eingabe erforderlich, da -i einmal pro Datei explizit eingegeben werden muss.

Eine andere Möglichkeit besteht darin, jedes Argument als einzelnes Wort anzugeben und das Wort dann mit dem Argument type zu analysieren. Ich würde auch das Argument -i loswerden und Positionsargumente für die erforderlichen "Optionen" verwenden.

parser.add_argument('input', nargs='+', type=lambda x: x.rsplit(":", 2))

Verwendung wäre

myscript.py myfile.txt:1 secondfile.txt:2 ...
1
chepner 25 Nov. 2013 im 20:29

Am besten verwenden Sie sys.argv als,

import sys, os

variables = list()
filenames = list()

if( len( sys.argv ) > 1 ):
    if( sys.argv[1] == '-i' )or( sys.argv[1] == '--input' ):
        N = len( sys.argv[1:] )
        for i in range( 2, N, 2 ):
            variables.append( int( sys.argv[i] ) )
            filenames.append( sys.argv[i+1] )

for file in filenames:
    # do something here
    os.system( 'less '+file )

Ich habe das nicht getestet, aber das sollte funktionieren.

0
cjohnson318 25 Nov. 2013 im 19:53

Versuche dies:

parser = argparse.ArgumentParser(description='Get Files')    
parser.add_argument('-i','--input', help='Input file(s)',
    required=True, nargs='+', action='append')

args = parser.parse_args()
0
Javier Castellanos 25 Nov. 2013 im 20:07