スタック・オーバーフロー Asked on November 15, 2021
Pythonでファイルに書き込んだfloatのリストが読み込めません。
リストから読み込むときに文字列として[[や0 . などとなってしまい本来の小数に戻せません。
書き込みと読み込み双方どなたか教えていただけないでしょうか?
リストから読み込むときに文字列として[[や0 . などとなってしまい本来の小数に戻せません。
とのことですが、もしかしてこれは多次元の NumPy array をファイルに保存しようとなさってませんでしょうか。[[
が出力されているのは 1 次元ではなくて多次元のリストを出力した際の挙動です。また 0.0
を 0.
と省略して出力するのは Python の普通の配列ではデフォルトだと行われないはずで、NumPy array などではデフォルトで行われます。
であれば、NumPy にはファイル書きこみおよび読み込み用の関数が用意されています。ドキュメントにコードサンプルが載っていますのでドキュメントにリンクしています。
np.save
、np.load
np.savetext
、np.loadtext
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
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP