如何使用python过滤文件中的井号?

时间:2012-03-01 07:01:12

标签: python

文件内容如下:

##this is the comment

but this is not comment '####', LOL   # this is a normal comment

我只想过滤所有评论并获取过滤后的内容,但我不知道如何避免过滤掉不是评论的英镑符号。

fileLines = [line.strip() for line in file if '#' != line[0] ]

此代码只是可以过滤注释符号,这是一行的第一个字符。

我想要的结果就像下面一行:

but this is not comment '####', LOL

4 个答案:

答案 0 :(得分:7)

import shlex
filelines = [' '.join(shlex.split(line,True)) for line in file]

有关详细信息,请参阅shlex docs

答案 1 :(得分:1)

我会用这个:

fileLines = [line for line in file if not line.lstrip().startswith('#')]

但我很难读你的问题(这些例子的格式很奇怪),所以我真的不知道这是不是你想要的。

答案 2 :(得分:1)

这是一个替代解决方案,它使用tokenize模块去除注释但保留所有其他格式(与shlex不同):

import tokenize

fileLines = []
printed = set()
for toknum, _, (line, col), _, data in tokenize.generate_tokens(file.readline):
    if toknum == tokenize.COMMENT:
        printed.add(line)
        if col != 0:
            fileLines.append(data[:col].strip())
    elif (toknum in (tokenize.NL, tokenize.NEWLINE) and
          line not in printed):
        fileLines.append(data.strip())

使用包含您提供的文字的文件,fileLines将成为以下内容:

['', "but this is not comment '####', LOL"]

请注意,以注释开头的行已完全删除,但保留没有注释的空行。对于中途注释的行,根本不会更改任何格式。

如果您还想删除空白行,则只需将elif条件更改为toknum == tokenize.NEWLINE and location[0] not in printed

答案 3 :(得分:0)

你可以做这样的事情 - 但请注意,如果评论中有引号,这将不起作用:

import re    
for line in file:
      print re.sub("\#+[\w\s\d]+$", "", l)

如果你真的想在没有shlex的情况下这样做,我认为你必须从行的开头算起并记录引号打开时