各行

2017-11-15 4 views
0

に対応するコードを実装する方法を、入力file.txtなどから行ずつ読みながら、私はすでに3つの機能を作成Python3.5各行

を使用します。

def Insert(self, key): 
def Report(self, node, a, b) 
def Print(self, node) 

をしかし、私は読む必要があります上記file.txtなどを読み取ることが

I 20 
... 
... 
R 17 27 
... 
... 
P 
... 
... 
E 

、私は次のコード

を使用:などの入力file.txtなどからのラインがたくさん

質問:各行を読みながら、次の行を実行する前に、対応する関数を実行して結果を返す必要があります。しかし、Pythonで実装する方法はわかりません。

例えば、私が行I 20を読むと、私は関数Insert(20)を実行しなければならなくて、結果が変わります。次に、次の行R 17 27を読んで、関数Report(node,17,27)を実行します。次に、私はPを読んで、機能Print(node)を実行します。最後に、私がEを読むと、私は印刷する必要があります( "ファイルの終わり")。

私は本当にあなたの答えに感謝しています。

答えて

1

ここは基本的な例です(Python 3.x)。彼らはあなたの例で定義されていなかったので、私はnodeselfを落とした:

import sys 

def Insert(key): 
    print('Insert',key) 

def Report(a, b): 
    print('Report',a,b) 

def Print(): 
    print('Print') 

def Exit(): 
    sys.exit(0) 

# Dictionary lookup of what function to call for each letter 
dispatch = {'I':Insert, 
      'R':Report, 
      'P':Print, 
      'E':Exit} 

with open('file.txt') as fp: 

    # Iterate and return the line number and line data for each line 
    for cnt,line in enumerate(fp,1): 

     # `line` already contains a newline so end is used to suppress a newline. 
     print('Line {}: {}'.format(cnt,line),end='') 

     # strip leading/trailing whitespace and split on whitespace. 
     # First item to `cmd`, the rest to `data` 
     cmd,*data = line.strip().split() 

     # Lookup function based on command, then call it with data expanded as arguments. 
     dispatch[cmd](*data) 

入力ファイル:

I 20 
R 17 27 
P 
E 

出力:

Line 1: I 20 
Insert 20 
Line 2: R 17 27 
Report 17 27 
Line 3: P 
Print 
Line 4: E 

を使用すると、データファイルにエラーが予想される場合は、可変引数を取るように関数を記述してください。例:

def Report(*args): 
    if len(args) == 2: 
     a,b = args 
     print('Report',a,b) 
    else: 
     print('Report: invalid arguments') 
+0

私にそれを打つ.. –

+0

@マークトーロネン:私はちょうどあなたのコードをコピーして実行しますが、機能のプリントではエラーが発生します。 –

+0

印刷に関するコメントに記載されているように、Python 3.6を使用していますか? :^)特定のPythonバージョンを使用している場合は、あなたの質問に言及する必要があります。 Python 3.xとPython 2.7の両方にタグを付けると、私は選択することができます:^)私はあなたが別のバージョンを使用している場合に修正する方法を見つけることができます肯定的です。 –

0

各行の最初の単語に基づいて行を分割して機能を選択する方法について説明します。何かのように:

tokens = line.split() 
if tokens[0] == 'I': 
    # call insert 
elif tokens[0] == 'R': 
    # call report 

など。 argsは他のトークンにあります。例えば、挿入呼び出しはInsert(tokens[1])のようになります。

+0

。シンプルですが効果的です。しかし、ファイルを読むときにあなたのコードが行単位ではなく、1行以上ジャンプするように見えます。なぜなのかご存知ですか? –

+0

@ ChuNguyen、私のコードは行を読み取ることはありません。あなたのコードに自分のコードを挿入した場合は、ループの 'fp.readline()'の前に 'while line:'ループの先頭にあることを確認してください。ループ内で 'fp.readline()'を最初に実行すると、2行目が読み込まれます。最初の行は、whileループの前に出現する 'fp.readline()'によって読み込まれます。他の答えは巧妙でエレガントですが、私は理解しやすく維持しやすい単純なアプローチが好まれます。 –