我正在编写一个漂亮的脚本,我们都需要在编码滚动之前从目录/或单个python文件中删除python文件中的所有print语句。我有printremover.py:
def read_content_to_linelist(the_file):
try:
f = file(the_file, 'r')
content = f.readlines()
f.close()
return content
except IOError:
return 0
def remove_print(linelist):
string = ""
for line in linelist:
if re.match(r"^\s*print.*", line):
linelist.remove(line)
else:
for line in linelist:
string += line
return string
我在测试时使用的是假冒文件:
name = 'cody'
print name
print 'cody'
print 4
当我从read_content_to_linelist
打印列表时,我得到了很好的数据。但是当我remove_print时,除了由于某种原因离开print 'cody'
之外我完全正确。它确实保留变量,并删除其他2个打印件。
答案 0 :(得分:1)
在remove_print
中,第一个循环应为:
for line in linelist[:]:
...
这将创建linelist
的副本,如果在循环内修改它,则必须使用该副本。
另外,你的else
可以(应该)被遗漏,因为它没有任何反应。
另外注意,你的正则表达式不需要前导插入符号(^),因为re.match
从字符串的开头检查;你只需要re.search
的插入符号。
答案 1 :(得分:1)
您应该使用re.sub
代替。当您从remove
list
时,订单会发生变化。在for
循环
第一个元素被删除。
第二个元素代替第一个,第三个代替第二个元素。
for
循环计数器位于秒,但元素已更改。
直接使用
print re.sub(r"^\s*print.*$","",x,flags=re.MULTILINE)
其中x
为f.read()
答案 2 :(得分:1)
您的问题是您在循环时修改列表。使用内置的filter
和join
函数可以大大简化您的逻辑:
def read_content_to_linelist(the_file):
try:
f = file(the_file, 'r')
content = f.readlines()
f.close()
return content
except IOError:
return 0
def good_line(line):
return not re.match(r"\s*print.*", line)
def remove_print(linelist):
good_lines = filter(good_line, linelist)
return ''.join(good_lines)
答案 3 :(得分:1)
您可以将unparser.py与ast模块一起使用来删除打印件:
import inspect
import importlib
import ast
from unparser import Unparser # unparser.py
class RemovePrint(ast.NodeTransformer):
def __init__(self):
self.count = 0
def visit_Print(self, node):
self.count += 1
print("Removed {} print/s".format(self.count))
self.generic_visit(node)
return None
mod = "yourfile"
mod = importlib.import_module(mod)
p = ast.parse(inspect.getsource(mod))
t = RemovePrint().visit(p)
print(ast.dump(p))
Module(body=[Assign(targets=[Name(id='name', ctx=Store())], `value=Str(s='cody')), FunctionDef(name='foo', args=arguments(args=[Name(id='x', ctx=Param())], vararg=None, kwarg=None, defaults=[]), body=[AugAssign(target=Name(id='x', ctx=Store()), op=Add(), value=Num(n=4)), Return(value=Name(id='x', ctx=Load()))], decorator_list=[]), ClassDef(name='Foo', bases=[], body=[FunctionDef(name='__init__', args=arguments(args=[Name(id='self', ctx=Param())], vararg=None, kwarg=None, defaults=[]), body=[Assign(targets=[Attribute(value=Name(id='self', ctx=Load()), attr='foo', ctx=Store())], value=Str(s='foo'))], decorator_list=[])], decorator_list=[])]`)
Unparser(p, open("temp_test.py", "w"))
需要一些工作但输出:
name = 'cody'
def foo(x):
x += 4
return x
class Foo:
def __init__(self):
self.foo = 'foo'
'
自:
name = 'cody
print name
print 'cody'
print 4
def foo(x):
x += 4
print x
return x
class Foo:
def __init__(self):
self.foo = "foo"
print("foo")
这不能使用python3并且只使用python2.7进行测试,我将在工作时添加python3代码。