【问题标题】:Spliting a file into lines in Python using re.split使用 re.split 在 Python 中将文件拆分为行
【发布时间】:2009-05-04 03:36:47
【问题描述】:

我正在尝试使用类似于以下的代码拆分具有列表理解的文件:

lines = [x for x in re.split(r"\n+", file.read()) if not re.match(r"com", x)]

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

【问题讨论】:

    标签: python regex list-comprehension


    【解决方案1】:

    把正则表达式的锤子收起来:-)

    1. 您可以直接遍历文件; readlines() 这些天几乎已经过时了。
    2. 了解str.strip()(及其朋友lstrip()rstrip())。
    3. 不要使用file 作为变量名。这是一种糟糕的形式,因为filebuilt-in function

    您可以将代码编写为:

    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 以进一步改进。

    【讨论】:

    • 自去年以来我没有写过任何 Python,我正在从短暂但令人讨厌的 PERL 中恢复过来。感谢您的回答,我恢复了心态:)
    【解决方案2】:

    lines = file.readlines()

    编辑: 或者如果你不想在那里有空行,你可以这样做

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

    编辑^2: 要删除尾随的换行符,您可以这样做

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

    【讨论】:

    • 保留尾随换行符。我不确定这是否是 OP 的问题。
    • file.readlines() 不太一样...它在每行末尾包含换行符,并包含空行。
    【解决方案3】:

    另一个方便的技巧,尤其是当您需要行号时,是使用枚举:

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

    我最近才发现枚举,但从那时起它已经派上用场好几次了。

    【讨论】:

      【解决方案4】:

      这应该可以工作,并且也可以消除正则表达式:

      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]
      

      【讨论】:

      • 你可以只写 'filter(None, all_lines)' 而不是 'filter(lambda x: x, all_lines)'。虽然我对这条捷径从来没有完全满意过:-)
      猜你喜欢
      • 1970-01-01
      • 2014-07-18
      • 1970-01-01
      • 1970-01-01
      • 2014-10-02
      • 1970-01-01
      • 1970-01-01
      • 2016-04-02
      • 2022-11-23
      相关资源
      最近更新 更多