如何打印文件的前n行?

How to print the first n lines of file?

我确信我遗漏了一些明显的东西并且可能以前被问过,但我似乎无法将正确的关键字组合在一起给我一个答案。

如何写出文件的前 n 行(实际上,与 file.readlines()[0:10] 相反)?

例如我有一个接受输入文件的函数,需要处理后面部分的信息,抛出一个header。但是我想保留 multi-line header,将其放回输出文件中。

def readInfile(infile):

    with open(infile, 'r') as ifh:
        # Skip exta info at top of file
        header = ifh.readline()[0:10] # Keep the header for later?

        noheader = ifh.readlines()[11:]
        for line in noheader:
        # Do the useful stuff
            usefulstuff = foo()

return usefulstuff, header

然后我想用输入文件的格式写出来,用他们的header:

print(header)
for thing in usefulstuff:
   print(thing)

有没有我遗漏的方法,或者 readlines 对它没有好处,因为它 returns 是一个列表?

我假设

for line in header:
     print(line)

会起作用,但在这种情况下似乎不起作用 - 所以我一定是做错了什么?

编辑

为什么在第二个范围内尝试使用 readlines()[] 两次失败?

我按照@pbuck 指出的那样修改了代码,header 行应该是readlines() 而不是readline 但现在noheader 变量是空的?我真的必须打开文件两次吗?!

注意,readline() returns 是一个字符串,所以 ifh.readline()[0:10] 给你第一行的前几个字符, noheader = ifh.readline()[11:] 给你一部分下一行。

您可以像这样使用循环:

header = ""
for i in range(10):
  header += ifh.readline()

或者正如@pbuck 在他们的评论中所建议的那样,使用 readlines()(注意 s),其中 returns 是一个包含文件中每一行的列表,看起来更像你想要的做。

从字面上看,先读 n 行,然后停止。

def read_first_lines(filename, limit):
  result = []
  with open(filename, 'r') as input_file:
    # files are iterable, you can have a for-loop over a file.
    for line_number, line in enumerate(input_file):
      if line_number > limit:  # line_number starts at 0.
        break
      result.append(line)
  return result

没有两次 readlines() 调用。最初你调用 readline() 从文件中读取一行。接下来调用 readlines() 并忽略列表的前 10 行 returns.

这样做会更好:

def foo(lines):
    return ['foo: ' + line for line in lines]

def readInfile(infile):
    with open(infile, 'r') as ifh:
        lines = ifh.read().splitlines(False)  # read in the whole file, separate into lines
        header = lines[:10]
        usefulstuff = foo(lines[10:])

        return usefulstuff, header

usefulstuff, header = readInfile('name_of_file.txt')

for line in header:
    print(line)

for line in usefulstuff:
    print(line)

我已经检查了你的解决方案,它表明你正在走上正轨。考虑使用 mmap python 包 (https://docs.python.org/2/library/mmap.html) 的解决方案,您可以在其中将文件视为字符串和文件。这是我的解决方案:

import mmap

def main(offset):
    with open("pks.txt","r+b") as fd:
        #Get the lines to skip
        try:
            skip=fd.readlines()[0:offset]
            lines=sum([len(x) for x in skip])
            rfile=mmap.mmap(fd.fileno(),0)
            rfile.seek(lines)
            print("Header: %s"%skip)
            print("Other lines:")
            line=rfile.readline()
            usefulStuff=list()
            while (len(line)>0):
                usefulStuff.append(line.lstrip()) #Remove new line
                line=rfile.readline()
            return usefulStuff,skip
        except TypeError as e:
            #Handle this error when offset is greater than the file length
            print("Error: %s"%str(e))
    return None,None
if __name__=='__main__':
    footer,header=main(3)
    print("Header: %s\nFooter: %s"%(header,footer))