私はいくつかのテーブルファイルを持っていて、それらをロードします:
x, y, rho, phi = np.loadtxt(myfile, unpack=True)
myfile1
さて、私が持ってmyfile2
いて同じフォーマットの場合を考えてみましょう。それらを同じ配列にロードする方法(1つのファイルがあるかのように)?
これを行うには複数の方法があります(たとえば、両方の配列をロードしてから、を介してそれらを連結するx = numpy.concatenate((x1, x2))
など)が、私が行うことは、ファイルをその場で連結し、結果をに渡すことloadtxt
です。
ドキュメントに記載されているように、次のようにfname
なります。
読み取るファイル、ファイル名、またはジェネレータ。ファイル名拡張子が.gzまたは.bz2の場合、ファイルは最初に解凍されます。ジェネレータはPython3kのバイト文字列を返す必要があることに注意してください。
したがって、myfile1、次にmyfile2を生成するジェネレーターが必要です。
これを行うための明白な方法は次のitertools
とおりです。
with open(myfile1, 'rb') as f1, open(myfile2, 'rb') as f2:
x, y, rho, phi = numpy.loadtxt(itertools.chain(f1, f2))
あなたは私がをやめたことに気付くかもしれませんunpack=True
。これunpack
は、ファイルオブジェクトやジェネレータではなく、ファイル名を渡した場合にのみ機能するためです。(ファイルの魔法やその他の凝ったものではなく、拡張子を調べます。)
ファイルが常にgzipまたはbzip2ファイルになることがわかっている場合は、上記の代わりに、または上記の代わりに使用できgzip.GzipFile
ます。bz2.BZ2File
open
But if you need to deal with possibly compressed files, you have to do the same extension-checking that numpy
does, then create the appropriate object (write a open_compressed
function that wraps that up), at which point this becomes stubbornly sticking to the wrong solution. So, if that's an issue, I'd probably go with loading them separately and then doing numpy.concatenate
.
You can use standard fileinput module:
import fileinput
import glob
import numpy as np
data = np.loadtxt(fileinput.input(glob.glob("*.dat")))