从文件的特定部分删除空格

时间:2014-07-25 07:41:06

标签: python-2.7 file-io removing-whitespace

with open(filename) as f:
    file_list = f.readlines()
    file_list = [line.strip() for line in file_list] # remove whitespaces from each line of file
    code to process data between start and end tags (these tags can have whitespaces thats why i have removed them above)

这段代码对我来说很好,但如果文件太大,我认为将整个数据复制到列表中是不明智的,然后从每一行中删除空格。

如何删除列表特定部分的空格,以便只有那么多部分可以保存在列表中?

我试过了:

with open(filename) as f:
    for line in f.readlines():
         if line.strip() == "start":
             start = f.readlines.index("start")
         if line.strip() == "end"
             end = f.readlines.index("end")
    file_list = f.readlines[start:end]

但是给出错误

start = f.readlines.index("start")
AttributeError: 'builtin_function_or_method' object has no attribute 'index'

我只是想写一篇在这篇文章之上提到的有效代码。

2 个答案:

答案 0 :(得分:1)

你的代码的问题是文件对象f是一个迭代器,一旦你调用f.readlines()它就会耗尽,所以通过调用f.readlines() <找到一行的索引em>再次无法运作。此外,在所有中调用readlines() 否定了您只存储文件中有趣部分的工作,因为readlines()无论如何都会将整个文件读入内存。

相反,只需记住您是否已经看过起始行并将以下行添加到列表中,直到您看到结束行。

with open(filename) as f:
    started, lines = False, []
    for line in f:
        stripped = line.strip()
        if stripped == "end": break
        if started: lines.append(stripped)
        if stripped == "start": started = True

或者,您也可以使用itertools.takewhile将所有行添加到结束行。

import itertools
with open(filename) as f:
    for line in f:
        if line.strip() == "start":
            lines = itertools.takewhile(lambda l: l.strip() != "end", f)
            lines = map(str.strip, lines)
            break

甚至更短,使用另一个takewhile来读取(并丢弃)起始行之前的行:

with open("test.txt") as f:
    list(itertools.takewhile(lambda l: l.strip() != "start", f))
    lines = itertools.takewhile(lambda l: l.strip() != "end", f)
    lines = map(str.strip, lines)

在所有情况下,lines都保留起始线和结束线之间的(剥离)线,两者都是独占的。

答案 1 :(得分:0)

Tobias的第一个回答可以使用continue ...

进行一些修改
with open(filename) as f:
    started, lines = False, []
    for line in f:
        stripped = line.strip()
        if stripped == "end": break
        if stripped == "start": 
            started = True
            continue
        if not started: continue

        # process line here no need to store it in a list ...