如何使这段代码消耗更少的内存而简单?

时间:2016-09-04 07:48:26

标签: python python-2.7 file-handling

要从txt文件返回特定行以进行进一步操作,此函数必须打开的文件也相当大~500行,因此创建列表然后打印特定行似乎很荒谬。你能建议我另类吗?代码如下:

def returnline(filename, n):  
    ofile = open(filename, 'r')  
    filelist = ofile.readlines()  
    return filelist[n - 1].strip('\n')  

1 个答案:

答案 0 :(得分:1)

如果您的文件不是数千行,我不会担心优化该位,但是,您可以做的只是继续阅读文件,直到您达到所需的行,并且从那里停止阅读;这样,当文件是5000行,而你想要第10行时,你只需要阅读10行。此外,您需要在打开并读取文件后关闭该文件。

总而言之,就像这样:

def line_of_file(fname, linenum):
    # this will ensure the file gets closed
    # once the with block exits
    with open(fname, 'r') as f:

        # skip n - 1 lines
        for _ in xrange(linenum - 1):
            f.readline()

        return f.readline().strip('\n')

或者,生成器(惰性列表,类型)可能会提供更好的性能:

from itertools import islice

def line_of_file(fname, linenum):
    with open(fname, 'r') as f:
        # (lazily) read all lines
        lines = f.xreadlines()
        # skip until the line we want
        lines = islice(lines, linenum - 1, linenum)
        # read the next line (the one we want)
        return next(lines)

......可缩短为:

from itertools import islice

def line_of_file(fname, linenum):
    with open(fname, 'r') as f:
        return next(islice(f.xreadlines(),
                           linenum - 1,
                           linenum))

(在Python 2.x中,islice(xs, n, m)xs[n:m]类似,只有islice适用于生成器;请参阅https://docs.python.org/2/library/itertools.html#itertools.islice