numpy genfromtxtコンバーターがUnicodeで機能しない(Python 3)

ccbunney

いくつかのコードをPython2からPython3に移動しています。

文字列の処理方法に影響を与える「unicode」と「bytes」の全体的な変更を認識しています(Python 3ではデフォルトでunicode)。

ただし、関数のconvertersコールバックでnumpyがそれらを処理する方法にいくつかの矛盾が見つかりましたgenfromtxt

データファイル(data.txt)について考えてみましょう。

1,2,hello!
3,4,world!

文字列を読み、「!」を削除したい covnerterで。Python 2では、次のことを行いました。

np.genfromtxt('data.txt', delimiter=',', dtype='i4,i4,S10',
        converters={2:lambda s: s.strip('!')})

これは正常に動作します。Python 3の場合、データがバイト配列ではなくユニコードとして読み込まれるように、dtypesでS10をU10に変更しただけです。

np.genfromtxt('data.txt', delimiter=',', dtype='i4,i4,U10',
        converters={2:lambda s: s.strip('!')})

ただし、コンバータは次のエラーで失敗します。 TypeError: a bytes-like object is required, not 'str'

コンバーター機能は、Unicode文字列ではなく、バイト配列をまだ受信しているようです。これを機能させる唯一の方法は、次のように変更s.strip('!')することです。s.strip(b'!')

これは私には矛盾しているようです。特に私はstripコマンドを実行した場合、それは罰金を作品として、AFTER私はむしろコンバータとしてよりも、配列を読み取り、すなわち、これはうまく動作します:

dat=np.genfromtxt('data.txt', delimiter=',', dtype='i4,i4,U10') 
print(dat.dtype)
print(dat['f2'][0].strip('!') # notice, no 'b' needed

プリント:

[('f0', '<i4'), ('f1', '<i4'), ('f2', '<U10')]
hello

これは私には矛盾しているように思われ、前述のエラーを回避するために「b」指定子をいつ使用するかを知ることを困難にしています!

Python 3では、Unicodeとバイトの問題全体が非常に苛立たしいことに気づきました。

hpaulj

ファイルを開くモードによって異なります。Py2との互換性のgenfromtxtために、常にバイトモードで動作するために使用されます。これで、Py3は「テキスト」モードで開くことができます

encodingパラメータの追加(ここでNoneは十分です。ファイルはUTF8として保存されます):

In [373]: np.genfromtxt('stack54570492.txt', delimiter=',', dtype='i4,i4,S10',
     ...:         converters={2:lambda s: s.strip('!')}, encoding=None)     
Out[373]: 
array([(1, 2, b'hello'), (3, 4, b'world')],
      dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', 'S10')])

(このパラメーターの詳細については、ドキュメントを参照してください。)

コンバーターは、を割り当てようとする前に、「raw」文字列に適用されdtypeます。あなたが指定したかどうかは関係ありませんので、U10S10多くの場合、文字列を数値に変換できるようにクリーンアップするために使用されるコンバーター。

後処理の場合bでも、dtypeに応じて、が必要です。

In [376]: dat=np.genfromtxt('stack54570492.txt', delimiter=',', dtype='i4,i4,S10')
In [377]: dat
Out[377]: 
array([(1, 2, b'hello!'), (3, 4, b'world!')],
      dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', 'S10')])
In [378]: dat['f2'][0].strip('!')
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-378-697f391eaffc> in <module>()
----> 1 dat['f2'][0].strip('!')

TypeError: a bytes-like object is required, not 'str'
In [379]: dat['f2'][0].strip(b'!')
Out[379]: b'hello'

の完全なヘルプencoding

エンコーディング:str、オプション

入力ファイルのデコードに使用されるエンコード。fnameファイルオブジェクトの場合適用されません特別な値 'bytes'は、可能な場合にバイト配列を受け取り、latin1でエンコードされた文字列をコンバーターに渡すことを保証する下位互換性の回避策を有効にします。この値をオーバーライドして、Unicode配列を受け取り、コンバーターへの入力として文字列を渡します。Noneに設定すると、システムのデフォルトが使用されます。デフォルト値は「バイト」です。

.. versionadded :: 1.14.0

'bytes'エンコーディングでは、b'!'(指定されたdtypeに関係なく)コンバーターでが必要です。

In [382]: np.genfromtxt('stack54570492.txt', delimiter=',', dtype=None,
     ...:         converters={2:lambda s: s.strip(b'!')}, encoding='bytes')      
Out[382]: 
array([(1, 2, b'hello'), (3, 4, b'world')],
      dtype=[('f0', '<i8'), ('f1', '<i8'), ('f2', 'S5')])

In [383]: np.genfromtxt('stack54570492.txt', delimiter=',', dtype=None,
     ...:         converters={2:lambda s: s.strip('!')}, encoding=None)
Out[383]: 
array([(1, 2, 'hello'), (3, 4, 'world')],
      dtype=[('f0', '<i8'), ('f1', '<i8'), ('f2', '<U5')])

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Python3でgenfromtxt関数を使用しているときにNumpyがエラーをスローする

分類Dev

イオン3でステータスバーが機能しない

分類Dev

Pythonでnumpy配列をコピーした後、加算が機能しない

分類Dev

Moqコールバックが3パラメーターメソッドで機能しない

分類Dev

Python3ディープコピークラスインスタンスが機能しない

分類Dev

d3 アークの作成がデータ バインディングで機能しない

分類Dev

ダウンロードの進行状況バーが機能しない、Python 3

分類Dev

ionic 3の双方向データバインディングが機能しないのはなぜですか?

分類Dev

numpy.genfromtxtを使用してPython3でUTF-8ファイルをロードする

分類Dev

Numpy throws error while using genfromtxt function in python 3

分類Dev

Python 3コードが機能しないのはなぜですか?

分類Dev

ボタンのホバー効果が機能しない-CSS3

分類Dev

コールバック機能が機能しない-Codeigniter3HMVC

分類Dev

Python2to3スクリプトが機能しない-Unicodeエラー

分類Dev

presents()。clickが空手0.9.6.RC3バージョンで機能しない

分類Dev

presents()。clickが空手0.9.6.RC3バージョンで機能しない

分類Dev

ホバー効果がw3-cssで機能しない

分類Dev

Finding the point of intersection of 3 Numpy Arrays Python

分類Dev

Unity3dでVSコードIntelliSenseが機能しない

分類Dev

numpy.set_printoption が pandas データフレームで機能しない

分類Dev

ipython3がpython3.7のターミナルで機能しない

分類Dev

as3ボタンモードが機能しない

分類Dev

Vertx3-EventBusがクラスターで機能しない

分類Dev

CSS3フィルターがEdgeで機能しない

分類Dev

Python 3での相対インポートが機能しない

分類Dev

ロギングモジュールがPython3で機能しない

分類Dev

Python3でForループが機能しない

分類Dev

PythonとSQLite3-スクリプト内では機能しないがコンソールでは機能する場所を選択

分類Dev

D3ズーム機能がGoogleChromeで機能しない

Related 関連記事

  1. 1

    Python3でgenfromtxt関数を使用しているときにNumpyがエラーをスローする

  2. 2

    イオン3でステータスバーが機能しない

  3. 3

    Pythonでnumpy配列をコピーした後、加算が機能しない

  4. 4

    Moqコールバックが3パラメーターメソッドで機能しない

  5. 5

    Python3ディープコピークラスインスタンスが機能しない

  6. 6

    d3 アークの作成がデータ バインディングで機能しない

  7. 7

    ダウンロードの進行状況バーが機能しない、Python 3

  8. 8

    ionic 3の双方向データバインディングが機能しないのはなぜですか?

  9. 9

    numpy.genfromtxtを使用してPython3でUTF-8ファイルをロードする

  10. 10

    Numpy throws error while using genfromtxt function in python 3

  11. 11

    Python 3コードが機能しないのはなぜですか?

  12. 12

    ボタンのホバー効果が機能しない-CSS3

  13. 13

    コールバック機能が機能しない-Codeigniter3HMVC

  14. 14

    Python2to3スクリプトが機能しない-Unicodeエラー

  15. 15

    presents()。clickが空手0.9.6.RC3バージョンで機能しない

  16. 16

    presents()。clickが空手0.9.6.RC3バージョンで機能しない

  17. 17

    ホバー効果がw3-cssで機能しない

  18. 18

    Finding the point of intersection of 3 Numpy Arrays Python

  19. 19

    Unity3dでVSコードIntelliSenseが機能しない

  20. 20

    numpy.set_printoption が pandas データフレームで機能しない

  21. 21

    ipython3がpython3.7のターミナルで機能しない

  22. 22

    as3ボタンモードが機能しない

  23. 23

    Vertx3-EventBusがクラスターで機能しない

  24. 24

    CSS3フィルターがEdgeで機能しない

  25. 25

    Python 3での相対インポートが機能しない

  26. 26

    ロギングモジュールがPython3で機能しない

  27. 27

    Python3でForループが機能しない

  28. 28

    PythonとSQLite3-スクリプト内では機能しないがコンソールでは機能する場所を選択

  29. 29

    D3ズーム機能がGoogleChromeで機能しない

ホットタグ

アーカイブ