日々精進

新しく学んだことを書き留めていきます

yamlを出力したときにインデントが足りないところがある

dictに配列をネストさせたオブジェクトをyamlに出力すると以下のようになる。

dictionary:
- A
- B

こうなってほしい。

dictionary:
  - A
  - B

こうするためには、以下のようにする。

    class FixIndentDumper(yaml.Dumper):
        def increase_indent(self, flow=False, indentless=False):
            return super(FixIndentDumper, self).increase_indent(flow, False)

    def _to_yaml(d: dict):
        yaml.dump(d, default_flow_style=False, Dumper=FixIndentDumper)

参考:

stackoverflow.com

OrderedDictをyamlに出力する

yaml.dump(ordered_dict)を実行するだけだと、Pythonのクラス名も出力されてしまうので以下のようにすると通常のyaml形式で出力される。

        def represent_odict(dumper, instance):
            return dumper.represent_mapping('tag:yaml.org,2002:map', instance.items())
        yaml.add_representer(OrderedDict, represent_odict)
        return yaml.dump(od, default_flow_style=False)

参考:

qiita.com

YAMLとJSONの使い分け方

YAMLはJSONより可読性が高く、コメントも書けるので設定ファイルはYAMLの方が適している。 JSONはデータフォーマットとしてより一般的なので、システム間でテキストで構造化データを受け渡す場合に使う。 JSONはコメントが書けないのがツライ。。

参考:

stackoverflow.com

TFRecordDatasetにS3のパスを渡すと「Encountered Unknown AWSError」が出る

S3からデータを読み込む時に以下のログが出る。

2019-11-18 11:36:44.626135: W tensorflow/core/platform/s3/aws_logging.cc:57] Encountered Unknown AWSError
InvalidRange
The requested range is not satisfiable:
2019-11-18 11:36:44.626177: W tensorflow/core/platform/s3/aws_logging.cc:57] If the signature check failed. This could be because of a time skew. Attempting to adjust the signer.

ファイルが壊れているのかと不安になったが、S3からダウンロードしたデータとEBSから読んだデータを比較したところ一致したので データは問題無くダウンロードできてそう。 ログからは時刻がずれていることが原因のように見えるが、サーバの時刻はずれてなかった。 このログは何なのかググってもよく分からなかった。謎だ。。

参考:

docs.aws.amazon.com