如果评论行从我的Input.txt文件中使用Python,则不会逃脱



我的 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)

最新更新