2011-08-15 4 views
3

私はfileinputモジュールを使用して、たくさんのファイルを繰り返し処理し、その中の1行を置き換えようとしています。これは私のコードがどのように見えるかです:複数のファイルの繰り返しと1行の置き換え - なぜ機能しないのですか?

def main(): 
    for root, dirs, files in os.walk('target/generated-sources'): 
     for line in fileinput.input([os.path.join(root, file) for file in files if file.endsWith('.java')], inplace=True): 
      match = re.search(r'@Table\(name = "(.*)"\)', line) 
      output = "".join(['@Table(name = "', PREFIX, match.group(1)[MAX_TABLENAME_LEN - len(PREFIX)], '")', '\n']) if match else line 
      print output, 

私が直面している問題は、私はエラーを取得していないということで、スクリプトが何らかの形でブロックするように思えます。私はPython 2.5.2を使用しています。

+0

出力もありませんか?一部のGUIインタプリタでのみブロックされるのでしょうか、コマンドラインから直接実行されるのでしょうか?単一の '.java'ファイルに対して実行するとどうなりますか?一致しているファイルのサンプルを表示して、プログラムを自分で実行してください。 – agf

+1

@Andrewそれは2つのループではなく、関数の引数としてのリストの理解とforループです。何も間違っていない、私はいつもそれをする。 – agf

+0

@agf、はい、コマンドラインから実行すると出力がなくなり、永遠に実行されるようです。 – helpermethod

答えて

4

あなたのリストの内包は、空のリストを返しています。スクリプトが空のリストをfileinput.input()に渡すと、stdinからのデフォルトの予想入力に戻ります。 stdinから何も入力されないので、あなたのスクリプトはブロックされます。

代わりにこれを試してみてください:

def main(): 
    for root, dirs, files in os.walk('target/generated-sources'): 
     java_files = [os.path.join(root, file) for file in files if file.endsWith('.java')] 
     if not java_files: # go to next iteration if list is empty 
      continue 
     for line in fileinput.input(java_files, inplace=True): 
      match = re.search(r'@Table\(name = "(.*)"\)', line) 
      output = "".join(['@Table(name = "', PREFIX, match.group(1)[MAX_TABLENAME_LEN - len(PREFIX)], '")', '\n']) if match else line 
      print output, 

はまた、ファイルの発見のロジックを分割。以下は、ファイルのリストを生成するジェネレータを作成し、それを fileinputの入力として使用することができます。

import os, fnmatch, fileinput 

def find_files(directory, pattern): 
    "Generator that returns files within direction with name matching pattern" 
    for root, dirs, files in os.walk(directory): 
     for basename in fnmatch.filter(files, pattern): 
      filename = os.path.join(root, basename) 
      yield filename 

for line in fileinput.input(find_files("target/generated-sources", "*.java")): 
    match = re.search(r'@Table\(name = "(.*)"\)', line) 
    output = "".join(['@Table(name = "', PREFIX, match.group(1)[MAX_TABLENAME_LEN - len(PREFIX)], '")', '\n']) if match else line 
    print output, 
+1

そうですよ! filelistが空の場合、デフォルトでfileinputはsys.stdinにアタッチされます! –

+0

'java_files:continue'とは何か? – helpermethod

+1

つまり、 'java_files'が空の場合、残りのループをスキップして次の繰り返しを続けることを意味します。 –

1

インタプリタがどこでブロックされているか知りたい場合は、シグナルSIGINTをプロセスに送信できます。少なくともUNIX系のオペレーティングシステムの場合。

コードがどこでハングするかを確認するために、プリントラインまたはログラインを追加してみてください。おそらく、fileinputはうまく動作し、それ以降はappがブロックされます。

いくつかの時間前、私は、検索+は、いくつかのファイルに置き換える行うためのツールを書いた:ルートは.javaファイルが含まれていないとき http://www.thomas-guettler.de/scripts/reprec.py.txt

関連する問題