码
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'
我只是想写一篇在这篇文章之上提到的有效代码。
答案 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 ...