1

そのため、Python で大きなデータ ファイルを読み込もうとしています。データに 1 列と 100 万行がある場合、次のようにします。

fp = open(ifile,'r');

for row in fp:  
    process row

私が読み込んでいるデータが100万列で1行しかない場合、私の問題が発生します。私が望むのは、fscanf()C の関数と同様の機能です。

すなわち、

while not EOF:  
    part_row = read_next(%lf)  
    work on part_row

フォーマットが何でfp.read(%lf)あるかを知っていれば、 を使用できます。long float

何かご意見は?

4

3 に答える 3

3

テキスト形式の 100 万個の float は実際にはそれほど大きくありません...したがって、何らかのボトルネックが証明されない限り、私はそれについて心配せずに次のようにします。

with open('file') as fin:
    my_data = [process_line(word) for word in fin.read().split()]

可能な代替手段 (スペースで区切られた「単語」を想定) は、次のようなものです。

import mmap, re

with open('whatever.txt') as fin:
    mf = mmap.mmap(fin.fileno(), 0, access=mmap.ACCESS_READ)
    for word in re.finditer(r'(.*?)\s', mf):
        print word.group(1)

そして、それはファイル全体をスキャンし、行/列に関係なく、大量の単語ストリームを効果的に提供します.

于 2013-02-21T00:06:21.023 に答える
1

これにアプローチするには、次の 2 つの基本的な方法があります。

まず、read_columnジェネレーター関数として、独自の明示的なバッファーを使用して関数を作成できます。

def column_reader(fp):
    buf = ''
    while True:
        col_and_buf = self.buf.split(',', 1)
        while len(col_and_buf) == 1:
            buf += fp.read(4096)
            col_and_buf = buf.split(',', 1)
        col, buf = col_and_buf
        yield col

…またはクラスとして:

class ColumnReader(object):
    def __init__(self, fp):
        self.fp, self.buf = fp, ''
    def next(self):
        col_and_buf = self.buf.split(',', 1)
        while len(col_and_buf) == 1:
            self.buf += self.fp.read(4096)
            col_and_buf = self.buf.split(',', 1)
        self.buf = buf
        return col

しかし、read_untilバッファリングを内部で処理する関数を作成する場合は、次のようにするだけです。

next_col = read_until(fp, ',')[:-1]

read_untilActiveState には複数のレシピがあります。

または、mmapファイルを持っている場合は、事実上無料で入手できます。ファイルを巨大な文字列として扱い、find(または正規表現) を使用することができます。(これは、ファイル全体が仮想アドレス空間内に収まることを前提としています。おそらく 64 ビットの Python ビルドでは問題になりませんが、32 ビットのビルドでは問題になる可能性があります。)


明らかにこれらは不完全です。それらは EOF や改行を処理しません (実際には、100 万列の6行があり、1 つではありませんよね?)。しかし、アイデアを示すにはこれで十分なはずです。

于 2013-02-21T00:14:23.210 に答える
0

を使用してこれを実現できますyield

def read_in_chunks(file_object, chunk_size=1024):
    while True:
        data = file_object.read(chunk_size)
        if not data:
            break
        yield data


f = open('your_file.txt')
for piece in read_in_chunks(f):
    process_data(piece)

他の例については、この質問をご覧ください。

于 2013-02-21T00:08:16.243 に答える