我正在尝试使用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 :(得分: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 :(得分:1)
如果您想知道解释器阻塞的位置,可以将信号SIGINT发送到进程。至少在类似操作系统的unix上。
kill -sigint PID
尝试添加一些打印或日志记录行,以查看代码挂起的位置。也许fileinput运行良好,然后应用程序阻塞。
前段时间我写了一个工具来搜索+替换几个文件: http://www.thomas-guettler.de/scripts/reprec.py.txt