4

いくつかの学校の課題では、pyplot を取得して、Logger Pro のデータに基づいていくつかの科学的グラフをプロットしようとしています。エラーが発生しました

ValueError: could not convert string to float: '0'

これはプログラムです:

plot.py
-------------------------------
import matplotlib.pyplot as plt 
import numpy as np

infile = open('text', 'r')

xs = []
ys = []

for line in infile:
    print (type(line))
    x, y = line.split()
    # print (x, y)
    # print (type(line), type(x), type(y))

    xs.append(float(x))
    ys.append(float(y))

xs.sort()
ys.sort()

plt.plot(xs, ys, 'bo')
plt.grid(True)

# print (xs, ys)

plt.show()

infile.close()

そして、入力ファイルにはこれが含まれています:

text
-------------------------------
0 1.33
1 1.37
2 1.43
3 1.51
4 1.59
5 1.67
6 1.77
7 1.86
8 1.98
9 2.1

これは、プログラムを実行しているときに受け取るエラー メッセージです。

Traceback (most recent call last):
  File "\route\to\the\file\plot01.py", line 36, in <module>
    xs.append(float(x))
ValueError: could not convert string to float: '0'
4

1 に答える 1

5

データ ファイルに UTF-8 BOM があります。これは、私の Python 2 インタラクティブ セッションの状態がフロートに変換されているものです。

>>> '0'
'\xef\xbb\xbf0'

バイトは\xef\xbb\xbfUTF-8 でエンコードされたU+FEFF ZERO WIDTH NO-BREAK SPACEであり、特に Microsoft 製品でバイト順マークとして一般的に使用されます。UTF-8 にはバイト順の問題はありません。UTF-16 や UTF-32 の場合のようにバイト順を記録するためにマークは必要ありません。代わりに、Microsoft はエンコーディングを検出するための補助として使用します。

utf-8-sigPython 3 では、コーデックを使用してファイルを開くことができました。このコーデックは、開始時に BOM を予期し、それを削除します。

infile = open('text', 'r', encoding='utf-8-sig')

Python 2 では、codecs.BOM_UTF8定数を使用して検出と削除を行うことができました。

for line in infile:
    if line.startswith(codecs.BOM_UTF8):
        line = line[len(codecs.BOM_UTF8):]
    x, y = line.split()

codecsドキュメントで説明されているように:

UTF-8 は 8 ビット エンコーディングであるため、BOM は必要なくU+FEFF、デコードされた文字列内の文字は (最初の文字であっても) として扱われますZERO WIDTH NO-BREAK SPACE

外部情報がなければ、文字列のエンコードにどのエンコードが使用されたかを確実に判断することは不可能です。各charmapエンコーディングは、任意のランダムなバイト シーケンスをデコードできます。ただし、UTF-8 バイト シーケンスには任意のバイト シーケンスを許可しない構造があるため、UTF-8 ではそれができません。UTF-8 エンコーディングを検出できる信頼性を高めるために、Microsoft は"utf-8-sig"メモ帳プログラム用に UTF-8 の変種 (Python 2.5 が呼び出す) を発明しました: Unicode 文字のいずれかがファイルに書き込まれる前に、UTF-8エンコードされた BOM (バイト シーケンスとしては次のようになります: 0xef0xbb0xbf) が書き込まれます。チャームマップでエンコードされたファイルがこれらのバイト値で始まる可能性はかなり低いため (たとえば、

LATIN SMALL LETTER I WITH DIAERESIS
RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
INVERTED QUESTION MARK

iso-8859-1 では)、これによりutf-8-sig、バイト シーケンスからエンコーディングを正しく推測できる可能性が高くなります。したがって、ここで BOM は、バイト シーケンスの生成に使用されるバイト オーダーを決定するために使用されるのではなく、エンコーディングの推測に役立つ署名として使用されます。エンコード時に、utf-8-sigコーデックは最初の 3 バイトとして , をファイルに0xef書き込み0xbbます。0xbfファイルの最初の 3 バイトとして表示される場合、デコードutf-8-sig時にそれらの 3 バイトはスキップされます。UTF-8 では、BOM の使用は推奨されておらず、通常は避ける必要があります。

于 2015-01-31T15:00:56.397 に答える