68926


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


CC BY-SA 4.0
2020-07-21T23:22:41.550
68800
2020-07-25T01:15:29.113
2020-07-22T00:13:18.340
3060
38331
question
python python3
Python でファイルに書き込んだ float のリストを読み込んで利用したい


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

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

  * [7\. 入力と出力 — Python 3.8.5 ドキュメント](https://docs.python.org/ja/3/tutorial/inputoutput.html)

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

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

  * [struct --- バイト列をパックされたバイナリデータとして解釈する — Python 3.8.5 ドキュメント](https://docs.python.org/ja/3/library/struct.html)

[code]

    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)
    
[/code]


CC BY-SA 4.0
2020-07-24T19:07:01.537
68920
2020-07-24T19:23:19.323
2020-07-24T19:23:19.323
15413
15413
68800
answer


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

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

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

  * バイナリ形式：[`np.save`](https://numpy.org/doc/stable/reference/generated/numpy.save.html)、[`np.load`](https://numpy.org/doc/stable/reference/generated/numpy.load.html)
  * テキスト形式：[`np.savetext`](https://numpy.org/doc/stable/reference/generated/numpy.savetxt.html)、[`np.loadtext`](https://numpy.org/doc/stable/reference/generated/numpy.loadtxt.html)


CC BY-SA 4.0
2020-07-25T01:15:29.113
68926
2020-07-25T01:15:29.113
19110
68800
answer