web-dev-qa-db-ja.com

numpy loadtxtは最初の行をスキップします

Numpyのloadtxt関数を使用してCSVファイルからデータをインポートしようとすると、小さな問題が発生します。ここに私が持っているデータファイルのタイプのサンプルがあります。

それを「datafile1.csv」と呼びます:

# Comment 1
# Comment 2
x,y,z 
1,2,3
4,5,6
7,8,9
...
...
# End of File Comment

この状況でうまくいくと思ったスクリプトは次のようになります。

import numpy as np
FH = np.loadtxt('datafile1.csv',comments='#',delimiter=',',skiprows=1)

しかし、エラーが発生します:

ValueError: could not convert string to float: x

これは、kwarg 'skiprows'がヘッダーをスキップしておらず、コメントの最初の行をスキップしていることを示しています。単純にskiprows = 3であることを確認することもできますが、複雑なのは、非常に多くのファイルがあり、必ずしもすべてのファイルの先頭に同じ数のコメント行があるとは限らないことです。 loadtxtを使用しているときに、このような状況でのみ実際のデータを取得していることを確認するにはどうすればよいですか?

追伸-私はbashソリューションにもオープンです。

13
astromax

ジェネレータ式を使用してコメント行を手動でスキップします。

import numpy as np

with open('datafile1.csv') as f:
    lines = (line for line in f if not line.startswith('#'))
    FH = np.loadtxt(lines, delimiter=',', skiprows=1)
22
falsetru

次のような独自のカスタムフィルター関数を作成します。

def skipper(fname):
    with open(fname) as fin:
        no_comments = (line for line in fin if not line.lstrip().startswith('#'))
        next(no_comments, None) # skip header
        for row in no_comments:
            yield row

a = np.loadtxt(skipper('your_file'), delimiter=',')
1
Jon Clements
def skipper(fname, header=False):
    with open(fname) as fin:
        no_comments = (line for line in fin if not line.lstrip().startswith('#'))
        if header:
            next(no_comments, None) # skip header
        for row in no_comments:
            yield row

a = np.loadtxt(skipper('your_file'), delimiter=',')

これは、オプションのパラメーター「ヘッダー」を追加することによる@Jon Clementsの回答のほんの少しの変更です。場合によっては、csvファイルにコメント行(#で始まる)があるがヘッダー行がない場合があります。

0
JeffZheng