質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.04%

バイナリデータをdecodeして編集したい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 765

mrk_5200

score 15

全球スケールで空間解像度0.1°×0.1°の格子点に埋め込まれた気象データ(~.dat.gz)を解凍しました。目的としては、日本の領域内のグリッドデータを切り取り、自分でも読み書きできるようにしたいと思っております。
その前段階として、data.decode("UTF-8")をしましたが、以下のようなエラーが出ています。
'utf-8' codec can't decode byte 0xc6 in position 106: invalid continuation byte

ちなみにデータフォーマットを見ると「4-byte float plain binary, little-endian」とのことです。実際のバイナリデータは膨大なビッグデータなのでお見せすることはできませんが、ご助言頂ければ幸いです。宜しく御願い致します。

import gzip

f = gzip.open("~.dat.gz","rb")
data = f.readline()

while line:
    text = data.decode("UTF-8")
    print(text)
    data = f.readline()
f.close()


OS:Windows 10 Home
python:Python 3.7.1

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

バイナリーデータを読み書きする手段としてstructモジュールが便利と思います。

ファイルをバイナリーモードでopenしそれをreadすると結果がbytesとして得られますがそれに対してstructモジュールのunpackでいくつかの基本的なバイナリー形式での値がデコードできます。例えば4バイトのIEEE754浮動小数点数(リトルエンディアン)なら

from struct import unpack


...
with open(filename, 'rb') as fp:
    // 必要に応じてfp.seekなどで望みの位置へ移動
    ...
    // 現在位置から4バイトだけバイナリーデータとして読み込む
    buf = fp.read(4)
    // バイナリーデータ4バイトをPythonのfloatへアンパック
    fval = unpack('<f', buf)
    ...

上の例は4バイトのbytesを変換する例ですがunpack_fromという関数もあり、もっと長いbytesデータの任意の位置からアンパックすることもできます。詳細はリファレンスをご覧ください。

https://docs.python.org/ja/3.7/library/struct.html#module-struct

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/25 16:04

    ご丁寧にありがとうございます。
    早速、unpackで試みたところ、unpack requires a buffer of 4 bytesと出てきました。どういった原因が考えられるでしょうか。
    そもそも、自分の取得したデータに対する理解を深めるべきなのかもしれませんが。。

    キャンセル

  • 2019/04/25 20:16

    4バイトのデータでなかったかbytesやbytearray形でないものを指定したと考えられます。「型や長さがどうなっているか」をPythonでデバッグプリントしてみてください。
    print(type(buf))
    print(len(buf))
    などとすれば確実なことがわかります。エラーメッセージだけみるより「実際に何を指定したのかを確認する」のが肝心と思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる