私はあなたの問題を理解しているかどうかわからないので、あなたが何を望んでいるのかを例を挙げて説明し、それを行う方法を示しましょう。
入力は、次のようなテキスト CSV ファイルです。
a,1,2,3
b,4,5,6
c,7,8,9
各行はキーであり、その後に一連の値が続きます。これは辞書を表し、各値はタプルです (例: d['a'] = (1,2,3)
.
出力は、次のような CSV ファイルである必要があります。
1,a
2,a
3,a
4,b
5,b
6,b
7,c
8,c
9,c
…しかし、任意の行順序で。元のファイルの各値は、元の行の列 0 のキーにマップされます。(値が重複している場合は、1 つのキーが任意に選択されます。)
したがって、これをすべてメモリ内で行う場合は、次のようになります。
in_dict = {'a': (1, 2, 3), 'b': (4, 5, 6), 'c': (7, 8, 9)}
out_dict = {value: key for key, value_set in in_dict.items() for value in value_set}
唯一の問題は、2.6GB のディクショナリを処理するためにおそらく 5.2GB の RAM が必要になるため、in_dict を独自の形式でディスクに保存し、out_dict を同様の形式でディスクに書き込みたいことです。 、すべてをメモリに読み込むことはありません。
これを行う最も簡単な方法は、中間ストレージに DBM を使用することです。out_dict
CSV を DBM に読み込みます。DBM は上記とまったく同じ構造になります。それを書くのはもう少し複雑です。
明らかに、モジュールを使用しcsv
て CSV を読み取り (および書き込み)、DBM のモジュールdbm
(Python 2.x の場合) を使用する必要があります。anydbm
with contextlib.closing(dbm.open('kv.dbm', 'n')) as db:
with open('kv.csv') as f:
for row in csv.reader(f):
for col in row[1:]:
db[col] = row[0]
次に、その DBM を好みの形式に書き出します。dbm
オブジェクトにメソッドがある場合items
、これは次のようになります。
with open('kvt.csv', 'w') as f:
csv.writer(f).writerows(dbm.items())
そうでないので、追加するか、genexp を書くことができます:
csv.writer(f).writerows((key, db[key]) for key in db.keys())
または明示的に繰り返します:
w = csv.writer(f)
for key in db.keys():
w.writerow((key, db[key])
tempfile
DBM を一時ファイルにして、使い終わった後に自動的にクリーンアップするためにを使用することもできます。詳細は Windows と *nix 間、および Python のバージョン間で若干異なるため、その部分は読者の演習として残します。