使用re.split将文件拆分为Python中的行

时间:2009-05-04 03:36:48

标签: python regex list-comprehension

我正在尝试使用类似于:

的代码拆分包含列表解析的文件
lines = [x for x in re.split(r"\n+", file.read()) if not re.match(r"com", x)]

但是,行列表总是有一个空字符串作为最后一个元素。有没有人知道避免这种情况的方法(不包括之后放一个pop()的淤泥)?

4 个答案:

答案 0 :(得分:9)

将正则表达式锤放走: - )

  1. 您可以直接迭代文件; readlines()这几天几乎已经过时了。
  2. 了解str.strip()(及其朋友,lstrip()rstrip())。
  3. 不要将file用作变量名称。这是不好的形式,因为filebuilt-in function
  4. 您可以将代码编写为:

    lines = []
    f = open(filename)
    for line in f:
        if not line.startswith('com'):
            lines.append(line.strip())
    

    如果你仍然有空行,你可以添加一个测试:

    lines = []
    f = open(filename)
    for line in f:
        if line.strip() and not line.startswith('com'):
            lines.append(line.strip())
    

    如果你真的想要它在一行:

    lines = [line.strip() for line in open(filename) if line.strip() and not line.startswith('com')]
    

    最后,如果您使用的是python 2.6,请查看with statement以进一步改进。

答案 1 :(得分:3)

lines = file.readlines()

修改 或者如果你不想在那里留空行,你可以

lines = filter(lambda a:(a!='\ n'),file.readlines())

修改^ 2: 删除尾随newines,你可以做

lines = [re.sub('\ n','',line)for filter中的行(lambda a:(a!='\ n'),file.readlines())]

答案 2 :(得分:1)

另一个方便的技巧,特别是当你需要行号时,是使用枚举:


fp = open("myfile.txt", "r")
for n, line in enumerate(fp.readlines()):
    dosomethingwith(n, line)

我最近才发现有关枚举的事情,但从那以后它已经派上用场了好几次。

答案 3 :(得分:0)

这应该有效,并且也消除了正则表达式:

all_lines = (line.rstrip()
             for line in open(filename)
             if "com" not in line)
# filter out the empty lines
lines = filter(lambda x : x, all_lines)

由于您使用的是列表推导而不是生成器表达式(因此无论如何整个文件都会加载到内存中),这是一个避免代码过滤掉空行的快捷方式:

lines = [line
     for line in open(filename).read().splitlines()
     if "com" not in line]