2016-03-26 2 views
2

私は単純なデータファイルフォーマットを設定しようとしています。これらのファイルをPythonで解析しています。フォーマットは、基本的にヘッダー情報とそれに続くデータで構成されます。構文と将来の拡張性の理由から、ヘッダー情報にJSONオブジェクトを使用したいと考えています。ファイルの例は次のようになります。データファイル内のjsonオブジェクトを解析する最適なメソッド

{ 
    "name": "my material", 
    "sample-id": null, 
    "description": "some material", 
    "funit": "MHz", 
    "filetype": "material_data" 
} 
18 6.269311533 0.128658208 0.962033017 0.566268827 
18.10945274 6.268810641 0.128691962 0.961950095 0.565591807 
18.21890547 6.268312637 0.128725463 0.961814928 0.564998228... 

データの長さと構造が常に同じ場合、これは解析するのが難しくありません。しかし、JSONオブジェクトを解析する最も柔軟な方法、未知数の行、ネストされた中括弧の数が不明で、ファイル内に複数のJSONオブジェクトがある可能性があります。

唯一のJSONオブジェクトがファイル内に存在する場合、1は、この正規表現を使用することができます:私は、そこに複数のJSON文字列がある、と私は最初のものをつかむしたい場合は、しかし、

with open(fname, 'r') as fp: 
    fstring = fp.read() 

json_string = re.search('{.*}', fstring, flags=re.S) 

def grab_json(mystring): 
    lbracket = 0 
    rbracket = 0 
    lbracket_pos = 0 
    rbracket_pos = 0 

    for i in range(len(mystring)): 
     if mystring[i] == '{': 
      lbracket = 1 
      lbracket_pos = i 
      break 

    for i in range(lbracket_pos+1, len(mystring)): 
     if mystring[i] == '}': 
      rbracket += 1 
      if rbracket == lbracket: 
       rbracket_pos = i 
       break 
     elif mystring[i] == '{': 
      lbracket += 1 

    json_string = mystring[lbracket_pos : rbracket_pos + 1] 
    return json_string, lbracket_pos, rbracket_pos 

json_string, beg_pos, end_pos = grab_json(fstring) 

私はいつものように質問しています:これを行うには良い方法がありますか?よりシンプルなコード、より柔軟なコード、より堅牢なコード、または本当に何かを意味するか?

+0

を使用してあなたの代わりにあなたが分散クラスタ(複数可)上のデータを処理したい場合は特にApache Parquet Formatを見てみたいことがあり、複数のデータファイル

に同じヘッダファイルを使用する可能性をあげますすべてのデータにJSONを使用し、ファイルごとに1つのJSON構造を使用します。 –

答えて

1

クラウスが示唆したように、最も簡単な解決策は、ファイル全体にJSONを使用することです。それはあなたの人生をはるかに簡単に書くのはjson.dumpなので、読みはちょうどjson.loadです。

第2の解決策は、メタデータを別個のファイルに入れることで、各データセットに対して複数のファイルを犠牲にして読み書きを単純に保ちます。

第3の解決策は、ファイルをディスクに書き込むときに、JSONデータの長さを前に付けることです。だから、のようになります書き込み:

metadata_json = json.dumps(metadata) 
myfile.write('%d\n' % len(metadata_json)) 
myfile.write(metadata_json) 
myfile.write(data) 

その後のような読みになります(?多分hdf

with open('myfile') as fd: 
    len = fd.readline() 
    metadata_json = fd.read(int(len)) 
    metadata = json.loads(metadata) 
    data = fd.read() 

は、4つ目のオプションは、既存のストレージフォーマットを採用することであることは、すでにあなたが探している機能を有していますデータとメタデータの両方を同じファイルに格納するという点では、

+0

これをさらに考え、すべてのものを同じJSONに保つことは理にかなっていますが、解析の問題として、それに関連する別の答えがあるかどうかはまだ不思議です。私がこの質問をした理由の1つは、私の会社が豊富に取り組むExcelからのコピー/ペーストによる手作業による簡単なファイル作成の可能性を残したかったことです。次のベストソリューションは、 "data": x、y1、y2、y3、y4、 x、y1、y2、y3、y4 ....] です。貼り付ける。 –

関連する問題