如何在python中逐行读取大文件

我想遍历整个文件的每一行。 一种方法是读取整个文件,将其保存到列表中,然后转到感兴趣的行。 这种方法使用了大量的内存,所以我正在寻找替代方案。

我的代码到目前为止:

for each_line in fileinput.input(input_file):
    do_something(each_line)

    for each_line_again in fileinput.input(input_file):
        do_something(each_line_again)

执行此代码会给出错误消息: device active

有什么建议么?

编辑:目的是计算成对的字符串相似性,这意味着文件中的每一行,我想要计算每隔一行的Levenshtein距离。


没有人给出正确的,完全Pythonic的方式来读取文件。 它是以下内容:

with open(...) as f:
    for line in f:
        <do something with line>

with语句处理打开和关闭文件,包括在内部块中是否引发异常。 for line in ffor line in f将文件对象f视为一个迭代对象,它会自动使用缓冲IO和内存管理,因此您不必担心大文件。

应该有一个 - 而且最好只有一个 - 明显的方法来做到这一点。


按照排名顺序的两种高效存储方式(首选最佳) -

  • 使用with - 来自python 2.5及以上版本
  • 如果您真的想控制阅读yield ,可以使用yield
  • with

    with阅读大文件是一种很好且高效的pythonic方式。 优点- 1)文件对象从离开后自动关闭with执行块。 2) with块内的异常处理。 3)存储for通过所述循环迭代f由线文件对象线。 内部它可以缓冲IO(以优化昂贵的IO操作)和内存管理。

    with open("x.txt") as f:
        for line in f:
            do something with data
    

    2.使用yield

    有时候可能需要对每次迭代中需要读取的内容进行更细粒度的控制。 在这种情况下使用它和产量。 请注意,在这种方法中,显式需要在最后关闭文件。

    def readInChunks(fileObj, chunkSize=2048):
        """
        Lazy function to read a file piece by piece.
        Default chunk size: 2kB.
        """
        while True:
            data = fileObj.read(chunkSize)
            if not data:
                break
            yield data
    
    f = open('bigFile')
    for chuck in readInChunks(f):
        do_something(chunk)
    f.close()
    

    陷阱和为了完整起见 - 下面的方法对于阅读大文件来说并不是很好或不够优雅,但请阅读以获得圆润的理解。

    在Python中,从文件中读取行的最常用方法是执行以下操作:

    for line in open('myfile','r').readlines():
        do_something(line)
    

    但是,当完成这些时, readlines()函数(同样适用于read()函数)将整个文件加载到内存中,然后遍历它。 对于大文件,稍好的方法(前面提到的两种方法最好)是使用fileinput模块,如下所示:

    import fileinput
    
    for line in fileinput.input(['myfile']):
        do_something(line)
    

    fileinput.input()调用顺序地读取行,但是在读取之后不会将它们保存在内存中,或者甚至只是这样,因为python中的file是可迭代的。

    参考

  • Python语句

  • 剥离换行符:

    with open(file_path, 'rU') as f:
        for line_terminated in f:
            line = line_terminated.rstrip('n')
            ...
    

    对于通用换行符支持,无论文件中的终结符'r''n'还是'rn' ,所有文本文件行似乎都以'n'结尾。

    编辑 -指定通用换行支持:

  • Unix上的Python 2 - open(file_path, mode='rU') - 必需[谢谢@Dave]
  • Windows上的Python 2 - open(file_path, mode='rU') - 可选
  • Python 3 - open(file_path, newline=None) - 可选
  • newline参数仅在Python 3中受支持,并且默认为None 。 在所有情况下, mode参数默认为'r'U在Python 3中被弃用。在Windows上的Python 2中,某些其他机制似乎将rnn

    文档:

  • open()for Python 2
  • open()for Python 3
  • 为了保留本地行结束符:

    with open(file_path, 'rb') as f:
        with line_native_terminated in f:
            ...
    

    二进制模式仍然可以将文件解析为包含in行。 每行都会有文件中的任何终止符。

    感谢@ katrielalex的回答,Python的open()doc和iPython实验。

    链接地址: http://www.djcxy.com/p/5391.html

    上一篇: How to a read large file, line by line in python

    下一篇: How to provide your own delimeter for cin?