使用python fileinput模块时跳过第一行的优雅方式?

时间:2009-10-06 02:57:43

标签: python file-io

使用python fileinput模块时,是否有优雅的方法可以跳过第一行文件?

我的数据文件包含很好的格式,但第一行是标题。使用fileinput如果该行似乎不包含数据,我必须包括检查和丢弃行。

问题是它会对文件的其余部分应用相同的检查。 使用read(),您可以打开文件,读取第一行,然后循环遍历文件的其余部分。 fileinput是否有类似的技巧?

是否有一种优雅的方法可以跳过第一行的处理?

示例代码:

import fileinput

# how to skip first line elegantly?

for line in fileinput.input(["file.dat"]):
    data = proces_line(line);
    output(data)

5 个答案:

答案 0 :(得分:17)

lines = iter(fileinput.input(["file.dat"]))
next(lines) # extract and discard first line
for line in lines:
    data = proces_line(line)
    output(data)

或者如果您愿意,可以使用itertools.islice方式

import itertools
finput = fileinput.input(["file.dat"])
lines = itertools.islice(finput, 1, None) # cuts off first line
dataset = (process_line(line) for line in lines)
results = [output(data) for data in dataset]

由于使用的所有内容都是生成器和迭代器,因此不会构建任何中间列表。

答案 1 :(得分:15)

fileinput模块包含一系列方便的功能,其中一个似乎完全符合您的要求:

for line in fileinput.input(["file.dat"]):
  if not fileinput.isfirstline():
    data = proces_line(line);
    output(data)

fileinput module documentation

答案 2 :(得分:5)

答案 3 :(得分:0)

with open(file) as j: #open file as j
    for i in j.readlines()[1:]: #start reading j from second line.

答案 4 :(得分:0)

一种选择是使用 openhook

<块引用>

openhook,当给出时,必须是一个带有两个参数的函数, 文件名和模式,并返回相应打开的类文件对象。 不能同时使用 inplace 和 openhook。

可以创建辅助函数 skip_header 并将其用作 openhook,例如:

import fileinput

files = ['file_1', 'file_2']

def skip_header(filename, mode):
    f = open(filename, mode)
    next(f)
    return f


for line in fileinput.input(files=files, openhook=skip_header):
    # do something