2017-05-23 19 views
1

私はかなり新しいです。私は、関数間でデータを渡すという概念に精通しています。理論的には 関数間の変数にデータを渡すことができません

、以下のコードは、ターミナル(Pythonのfilename.py file.txtなど)を経由してうまく動作しますが、私はワークフローを追加する場所の変数ストアファイルへのパスと、それを渡す

def c(): 
    r = raw_input("Ask Something? ") 
    .. 
    return r 

def p(x): 
    ... 
    do something 

r = c() 
p(r) 

関数(processFile)に渡します。私はちょうど関数に渡されるデータ/値を取得できません。

これは私が編集しようとしているコードです:

def registerException(exc): 
    exceptions[exc] += 1 

def processFile(x): 
    with open(x, "r") as fh: 
    currentMatch = None 
    lastLine = None 
    addNextLine = False 
    for line in fh.readlines(): 
     if addNextLine and currentMatch != None: 
     addNextLine = False 
     currentMatch += line 
     continue 
     match = REGEX.search(line) != None 
     if match and currentMatch != None: 
     currentMatch += line 
     elif match: 
     currentMatch = lastLine + line 
     else: 
     if currentMatch != None: 
      registerException(currentMatch) 
     currentMatch = None 
     lastLine = line 
     addNextLine = CONT.search(line) != None 
    # If last line in file was a stack trace 
    if currentMatch != None: 
     registerException(currentMatch) 

for f in sys.argv[1:]: 
    processFile(f) 

for item in sorted(exceptions.items(), key=lambda e: e[1], reverse=True): 
    print item[1], ":", item[0] 

私は、グローバルまたはローカルとして変数を宣言する場合、それは問題doesntの。誰かがこの問題を解決するのを助けてくれますか?

編集1:私はダニエルが提案された変更を適用してきたし、今私は取得しています

はTypeError:「NoneType」オブジェクトが反復可能ではありません。私はいくつかの変更を加えて、スクリプトを実行するときに削除sys.argvの[1]それは、コマンドラインで引数を必要とするため

def c(): 
    path = raw_input("Path to file? ") 
    r = os.path.abspath(path) 

def process_file(filename): 
    current = None 
    last_line = None 
    continue_line = False 
    with open(filename, "r") as fh: 
     for line in fh: 
      if continue_line and current is not None: 
       continue_line = False 
       current += line 
       continue 
      if REGEX.search(line): 
       if current is None: 
        current = last_line 
       current += line 
      else: 
       if current is not None: 
        yield current 
       current = None 
      last_line = line 
      continue_line = CONT.search(line) 
     # If last line in file was a stack trace 
     if current is not None: 
      yield current 

def process_files(filenames): 
    exceptions = defaultdict(int) 
    for filename in filenames: 
     for exc in process_file(filename): 
      exceptions[exc] += 1 

for item in sorted(exceptions.items(), key=lambda e: e[1], reverse=True): 
    print item[1], ":", item[0] 

r = c() 
process_files(r) 

:以下

はコードです。

新しいエラーは、OSパスに起因すると思います。これをどうすれば解決できますか?

+0

は、どのような変数あなたが話しているの? –

+0

こんにちは、私が変数x = pathtofileをプロセスファイル関数の前に追加すると、なんらかの理由で値が渡されていません。私はグローバルとローカルの両方で作成しようとしました。また、この変数を取得してそれをprocessfile関数に渡す関数を作成しようとしましたが、同じ結果が得られました。コードはターミナル(python file.py log.txt)でうまく動作しますが、コードにpathtofileをハードコードしたいと考えています。 –

答えて

0

exceptionsもすべての機能に転送する必要があるパラメータです。また、あなたが発電機としてprocessFileを書くことができ、インラインregisterException

def process_file(filename): 
    current = None 
    last_line = None 
    continue_line = False 
    with open(filename, "r") as fh: 
     for line in fh: 
      if continue_line and current is not None: 
       continue_line = False 
       current += line 
       continue 
      if REGEX.search(line): 
       if current is None: 
        current = last_line 
       current += line 
      else: 
       if current is not None: 
        yield current 
       current = None 
      last_line = line 
      continue_line = CONT.search(line) 
     # If last line in file was a stack trace 
     if current is not None: 
      yield current 

def process_files(filenames) 
    exceptions = defaultdict(int) 
    for filename in filenames: 
     for exc in process_file(filename): 
      exceptions[exc] += 1 

    for item in sorted(exceptions.items(), key=lambda e: e[1], reverse=True): 
     print item[1], ":", item[0] 

process_files(sys.argv[1:]) 
+0

Danielに感謝します。しかし、依然として元の問題が存在する。私はそれがターミナル経由でうまく動作することは分かっていますが(python file.py log.txt)、コード内のパスをハードコーディングするにはどうすればいいですか?私は最初にグローバル変数、次にローカル変数を宣言しようとしましたが、process_file関数はこの変数を見ていません。 –

+0

'process_files'は、ハードコードされたファイル名でも、ファイル名のリストで呼び出すことができます。 – Daniel

+0

ダニエルありがとうございました!私は最終的にあなたの提案のおかげで働いていた!私はprocess_files([r])が見つかりませんでした! –

関連する問題