我的 input.txt
文件中包含由 //
标记的评论的行:
输入文件
something
something // something something
// something something
something
在这里第3行被跳过,但第2行不是。
我的代码
for line in (l for l in open('input.txt', mode='r') if not l.lstrip().startswith('//')):
f_write.write(line)
相同的代码重写为可重复使用的函数:
def skip_comments(file):
for line in file:
if not line.lstrip().startswith('//'):
yield line
f = open('input.txt')
for line in skip_comments(f):
f_write.write(line)
两个片段都会产生相同的结果。我已经尝试了很多次以不同的模式和字符串打开,但是如果没有lstrip
,它就不起作用。
您应该像这样写代码:
def skip_comments(file):
for line in file:
if not line.lstrip().startswith('//'):
line = line.split("//")
yield line[0]
update
如果您想检查更复杂的评论,我建议以下代码:
def skip_comments(file):
for line in file:
if line.startswith('//'):
continue
elif line.find("/*")>=0:
startIndex = line.find("/*")
endIndex = line.find("*/")
line = line[:startIndex] + line[endIndex + len("*/"):]
yield line
else
line = line.split("//")[0]
yield line
您可以将中间部分放入中间,因此它可以删除所有评论:
def skip_comments(file):
for line in file:
if line.startswith('//'):
continue
elif line.find("/*")>=0:
while(line.find("/*")>=0):
startIndex = line.find("/*")
endIndex = line.find("*/")
line = line[:startIndex] + line[endIndex + len("*/"):]
yield line
else
line = line.split("//")[0]
yield line
str.startswith
准确地检查了其名称的含义:字符串是否从请求的前缀开头。从一条线中间开始,使用lstrip
的剥离领先地点不会神奇地揭露评论。
更好的选择是str.find
,它返回该行上评论的索引。
def skip_comments(file):
for line in file:
index = line.find('//')
if index >= 0:
yield line[:index]
else:
yield line
您可以检查//
是否在您的行中,只保留出现在//
for line in (l.split('//')[0].strip() for l in open('input.txt', mode='r') if l.split('//')[0].strip()):
f_write.write(line)