TransWikia.com

Python でファイルに書き込んだ float のリストを読み込んで利用したい

スタック・オーバーフロー Asked on November 15, 2021

Pythonでファイルに書き込んだfloatのリストが読み込めません。
リストから読み込むときに文字列として[[や0 . などとなってしまい本来の小数に戻せません。
書き込みと読み込み双方どなたか教えていただけないでしょうか?

2 Answers

リストから読み込むときに文字列として[[や0 . などとなってしまい本来の小数に戻せません。

とのことですが、もしかしてこれは多次元の NumPy array をファイルに保存しようとなさってませんでしょうか。[[ が出力されているのは 1 次元ではなくて多次元のリストを出力した際の挙動です。また 0.00. と省略して出力するのは Python の普通の配列ではデフォルトだと行われないはずで、NumPy array などではデフォルトで行われます。

であれば、NumPy にはファイル書きこみおよび読み込み用の関数が用意されています。ドキュメントにコードサンプルが載っていますのでドキュメントにリンクしています。

Answered by nekketsuuu on November 15, 2021

ファイルはテキスト/バイナリのどちらで作成しようとしていますか?

以下に簡単なファイル入出力の例を挙げておきます。
各APIの詳細はPythonのリファレンスを参照してください。

テキストはエンドユーザーが直接読み書きすることもできますが、読み込み時のバリデーションの実装が難しくなります。また、浮動小数点数の場合、10進数で出力すると誤差が生じるケースがあります。指数形式で有効桁数をできる限り大きくするほうがよいですが、ファイルサイズが大きくなりがちです。拡張性や自己記述性の観点から、XML形式などの階層化に対応したフォーマットを採用することもあります。

バイナリはファイルサイズを削減でき、読み込み時のバリデーションの実装が比較的容易というメリットがありますが、エンドユーザーが読み書きするのには適していません。システム間の相互運用の観点から、数値の内部表現にも配慮する必要がありますが、Pythonのstructモジュールでは、プラットフォームの実装によらずIEE 754準拠の浮動小数点数バイナリ表現が使用されるので、移植性や可搬性は確保されています。

import os
import struct

def printFilePathAndSize(path):
    print('Path = "%s", Size = %d [bytes]' % (path, os.path.getsize(path)))

path1 = 'test.txt'
path2 = 'test.bin'

srcList = [-10.5, -0.01, 0, 0.1, 0.2, 0.3, 0.4]

# (1) Text format.

with open(path1, encoding='utf-8', mode='w') as f:
    for x in srcList:
        f.write(format(x, '.15e') + 'n')

printFilePathAndSize(path1)

dstList = []
with open(path1, encoding='utf-8', mode='r') as f:
    while True:
        line = f.readline()
        if not line:
            break;
        dstList.append(float(line))
        # For test.
        print(line.replace('r', '').replace('n', ''))

print(dstList)

# (2) Binary format.

structOfDoubleFloat = struct.Struct('d')

with open(path2, mode='wb') as f:
    for x in srcList:
        f.write(structOfDoubleFloat.pack(x))

printFilePathAndSize(path2)

dstList = []
with open(path2, mode='rb') as f:
    while True:
        binData = f.read(8)
        if not binData:
            break;
        # Get the first element of tuple.
        dstList.append((structOfDoubleFloat.unpack(binData))[0])

print(dstList)

Answered by sygh on November 15, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP