2016-06-24 7 views
1

データ型とUTF-8エンコーディングについて非常に混乱しています。フードの下で実際に何が起こっていますか? Python 3では区切り文字なしで面倒なJSONデータを読んでいます(データには日本語/中国語が時々あります)。私は、データに読んでいますforループのPython 3でのデータ型とドキュメント

url = "http://localhost:8001" 
data = urllib.request.urlopen(url).read() 
type(data) 

そして、それは一瞬

バイトを返しその後、私は手紙

for letter in data: 
    type(letter) 

ことによってそれに手紙を読みたいそれは私を返します。その手紙は現在の整数です。なぜそれがバイトであったのか、それは整数なのですか? P.P.私は取得している整数が文字の10進表現を表していることを理解しています。しかし、このジャンプは前後に私を混乱させます。

P.S.私もfor-loopの公式文書を見つけることができませんでした。 1つはありますか?

ありがとうございます。

+1

_「なぜそれはバイトですか、今は整数ですか?」「それは何ですか?」 'レター'?しかし、「文字」は決して1バイトではなかった。 'データ'?しかし、 'data'は決して整数ではありません。これは、「x = [1,2,3]; print(type(x)); print(type(x [0]))」というprint listとintの2つの理由に相当しますか? – Kevin

答えて

3

パドレイクカニンガムが動作するはず示唆したようにデータを復号:

data = urllib.request.urlopen(url).read().decode("utf-8") 

ます。また、forループの公式documentatioを求めました。あなたがthisを参照しているか、またはdataの反復動作について話しているかどうかはわかりません。

hereで述べたようにbytesの反復動作である:

[0]の整数であろうbのバイトオブジェクトは、バイトオブジェクトBのため、(タプルに類似)の整数の配列であるので、一方、b [0:1]は長さ1のバイトオブジェクトになります(インデックスとスライスの両方が長さ1の文字列を生成するテキスト文字列とは対照的です)。

以前の回答にコメントしてください、申し訳ありません。

+0

Adirio、ドキュメントをありがとう。はい、私はそれを探していました。データの反復動作についても共有してください。私はあなたが何を意味するかについてはあまりよく分からない:)後でそれを読むよ。 –

+0

私のasnwerを編集し、あなたが求めた情報を追加しました。 – Adirio

1

あなたはbytesにSTRデコードする必要があります:あなたはときにループや印刷文字を表示されますデコードした後

In [12]: data = urllib.request.urlopen("http://stackoverflow.com/questions/38014233/data-types-and-documentation-for-for-loop-in-python-3/38014292#38014292").read() 

In [13]: type(data) 
Out[13]: bytes 

In [14]: type(data.decode("utf-8")) 
Out[14]: str 

In [15]: data[0] 
Out[15]: 60 

In [16]: data.decode("utf-8")[0] 
Out[16]: '<' 

を。 urllib.request.urlopen(url).read()バイトを返します。バイトをstrにデコードするのはあなた次第です。

+0

私の主な関心事はなぜfor-loopがバイトの代わりに整数を返すのですか? –

+0

@Cooper、私の答えでは、 'data [0] - > 60'はデコードされていないので表示されています'data.decode(" utf-8 ")[0] - >" <"'をデコードした後、strに渡します。forループは各バイトを繰り返し処理するので、int/?forループをデコードして実行しましたか? –

+0

@Cooper: 'bytes'オブジェクトは個々のバイトの数値を反復処理するためです。 'for'ループを使って行うことは特にありません。' bytes'がイテレータプロトコルをどのように実装しているかだけです。 'list(data)'を実行した場合、 'int'の' list'が得られます。 – ShadowRanger