如何打印前n行文件?

时间:2017-03-30 16:13:05

标签: python readlines

我确定我错过了一些明显的事情,可能之前已经问过但我似乎无法将关键字组合在一起给我一个答案。

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

e.g。我有一个接收输入文件的函数,需要处理后一部分的信息,抛出一个标题。但是我想保留多行标题,将其放回输出文件中。

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

然后我想用输入文件的格式写出来,使用标题:

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

我是否缺少一种方法,或readlines对此没有好处,因为它会返回一个列表?

我假设

for line in header:
     print(line)

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

修改

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

我修改了代码,因为@pbuck指出,标题行应该是readlines()而不是readline,但现在noheader变量是空的?我真的要打开文件两次吗?!

4 个答案:

答案 0 :(得分:2)

在那里小心,readline()会返回一个字符串,因此ifh.readline()[0:10]会为您提供第一行的前几个字符,noheader = ifh.readline()[11:]会为您提供下一行的一部分。

你可以做的就是使用这样的循环:

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

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

答案 1 :(得分:1)

从字面上看,先读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

答案 2 :(得分:0)

没有两个readlines()来电。最初,您调用readline(),从文件中读取一行。接下来,您调用readlines()并忽略它返回的列表的前10行。

这是一种更好的方法:

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)

答案 3 :(得分:0)

我已检查过您的解决方案,并且它已接近您的正确状态。使用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))