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

到目前为止我的代码:

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)

执行这段代码会给出一个错误消息:设备处于活动状态。

有什么建议吗?

目的是计算成对字符串的相似性,这意味着对于文件中的每一行,我想计算与其他每一行的Levenshtein距离。

编辑:在这个问题8个月后提出的一个相关问题有许多有用的答案和评论。要更深入地了解python逻辑,请阅读以下相关问题:如何在python中逐行读取文件?


当前回答

正确的、完全python式的读取文件的方法如下:

with open(...) as f:
    for line in f:
        # Do something with 'line'

with语句处理打开和关闭文件,包括在内部块中引发异常。f中的for行将文件对象f视为可迭代对象,它自动使用缓冲I/O和内存管理,因此您不必担心大文件。

应该有一种——最好只有一种——明显的方法来做到这一点。

其他回答

去除换行符:

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

在通用换行支持下,所有文本文件行似乎都以'\n'结束,无论文件中的终止符是'\r'、'\n'还是'\r\n'。

EDIT -指定通用换行支持:

Python 2 on Unix - open(file_path, mode='rU') - required[谢谢@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上的python2中,一些其他机制似乎将\r\n转换为\n。

文档:

open()用于Python 2 open()用于Python 3

保存本机行终止符:

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

二进制模式仍然可以用in将文件解析成行。每一行都有它在文件中的终止符。

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

我强烈建议不要使用默认的文件加载,因为它非常慢。你应该研究一下numpy函数和IOpro函数(例如numpy.loadtxt())。

http://docs.scipy.org/doc/numpy/user/basics.io.genfromtxt.html

https://store.continuum.io/cshop/iopro/

然后你可以把你的成对操作分解成几个块:

import numpy as np
import math

lines_total = n    
similarity = np.zeros(n,n)
lines_per_chunk = m
n_chunks = math.ceil(float(n)/m)
for i in xrange(n_chunks):
    for j in xrange(n_chunks):
        chunk_i = (function of your choice to read lines i*lines_per_chunk to (i+1)*lines_per_chunk)
        chunk_j = (function of your choice to read lines j*lines_per_chunk to (j+1)*lines_per_chunk)
        similarity[i*lines_per_chunk:(i+1)*lines_per_chunk,
                   j*lines_per_chunk:(j+1)*lines_per_chunk] = fast_operation(chunk_i, chunk_j) 

以块方式加载数据,然后对其进行矩阵操作,几乎总是比一个元素一个元素地加载数据快得多!!

#Using a text file for the example
with open("yourFile.txt","r") as f:
    text = f.readlines()
for line in text:
    print line

打开文件以读取(r) 读取整个文件并将每行保存为一个列表(文本) 遍历列表打印每行。

例如,如果您希望检查长度大于10的特定行,则使用现有的可用内容。

for line in text:
    if len(line) > 10:
        print line

逐行读取大文件的最佳方法是使用python枚举函数

with open(file_name, "rU") as read_file:
    for i, row in enumerate(read_file, 1):
        #do something
        #i in line of that line
        #row containts all data of that line

这是python中读取文件的一种可能方式:

f = open(input_file)
for line in f:
    do_stuff(line)
f.close()

它不分配一个完整的列表。它在直线上迭代。