2011-08-15 49 views
3

我正在嘗試使用fileinput模塊遍歷一堆文件並替換它們中的一行。這是我的代碼看起來如何:迭代多個文件並替換一行 - 爲什麼它不起作用?

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它不是兩個for循環,它是一個列表理解作爲一個函數的參數,和一個for循環?沒有錯,我一直這樣做。 – agf

+0

@agf,是的,從命令行運行時我沒有輸出,它似乎永遠運行。 – helpermethod

回答

4

你的列表中理解正在返回空列表時,根不包含.java文件。當腳本將一個空列表傳遞給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這樣的操作系統上。

kill -sigint PID 

嘗試添加一些打印或測井線,看到你的代碼掛起。也許fileinput運行良好,並在此之後的應用程序塊。

前一段時間我寫了一個工具,做搜索+在幾個文件中替換: http://www.thomas-guettler.de/scripts/reprec.py.txt

相關問題