我有一个包含许多行的大文件,想要先读取第一行,然后再遍历从第一行开始的所有行。
我首先想到类似的东西会这样做:
nn_vb_tagged = [(word,tag) for word, tag in tagged
if tag.startswith('NN') or tag.startswith('VB')]
但是这个脚本的问题是传递给file = open("fileName", 'r')
first_line = file.readline()
DoStuff_1(first_line)
for line in file:
DoStuff_2(line)
file.close()
的第一行是第二行而不是第一行。我对什么样的对象DoStuff_2
没有很好的直觉。我认为它是一个迭代器,并不知道如何处理它。我发现的糟糕解决方案是
file
但它非常愚蠢,并且计算成本有点高,因为它在每次迭代时运行if语句。
答案 0 :(得分:4)
你可以这样做:
with open('fileName', 'r') as file:
first_line = file.readline()
DoStuff_1(first_line)
DoStuff_2(first_line)
# remaining lines
for line in file:
DoStuff_2(line)
请注意,我已将您的代码更改为使用with
,因此file
会自动关闭。
答案 1 :(得分:2)
我喜欢使用生成器来抽象你的一般控制流程。类似的东西:
def first_and_file(file_obj):
"""
:type file_obj: file
:rtype: (str, __generator[str])
"""
first_line = next(file_obj)
def gen_rest():
yield first_line
yield from file_obj
return first_line, gen_rest()
在Python 2.7中,将yield from
替换为:
for line in file_obj:
yield line
答案 2 :(得分:1)
另一个答案是只打开文件两次。
with open("file.txt", "r") as r:
Do_Stuff1(r.readline())
with open("file.txt", "r") as r:
for line in r:
Do_Stuff2(line)
答案 3 :(得分:0)
此问题一般情况的解决方案之一是保存您所在的行号。完成需要您相对于当前行的前一行的操作后,通过执行file.seek(0)然后使用file.readline()循环所需的次数来使用行号变量。