37582


Zip, io.BytesIO の意味や使い方はどういうものでしょうか？  
データをWebからロードする方法について教えてくださればありがたいです。

[code]

    zip_url = 'http://archive.ics.uci.edu/ml/machine-learning-databases/00228/smsspamcollection.zip'
    r = requests.get(zip_url)
    z = ZipFile(io.BytesIO(r.content))
    file = z.read('SMSSpamCollection')
    
[/code]

参照：Tensorflow機械学習クックブック


CC BY-SA 3.0
2017-08-29T11:33:59.347
37573
2017-08-29T17:59:48.823
23690
question
python
Zip, io.BytesIOの意味、使い方について


実行の流れは次の通りです。

  1. HTTP GETをrequestsで実行
  2. r.contentの結果をio.BytesIOでファイルストリームに変換
  3. ZipFileにファイルストリームを引き渡してZipFileオブジェクトを作成
  4. ZipFileオブジェクトからSMSSpamCollectionファイルを抽出

`requests`はHTTPのGET/POSTなどの操作が簡単にできる便利なライブラリです。`get()`で取得したデータは`r.content`に
**データ全体** が`bytes`バッファに格納されています。

[code]

    >>> type(r.content)
    <class 'bytes'>
    
[/code]

ZipFileはzipfileモジュールで提供されるクラスで、ZIPで圧縮されたデータの操作が行えます。

[code]

    >>> help(ZipFile)
    Help on class ZipFile in module zipfile:
    
    class ZipFile(builtins.object)
     |  Class with methods to open, read, write, close, list zip files.
     |
     |  z = ZipFile(file, mode="r", compression=ZIP_STORED, allowZip64=True)
     |
     |  file: Either the path to the file, or a file-like object.
     |        If it is a path, the file will be opened and closed by ZipFile.
     |  mode: The mode can be either read 'r', write 'w', exclusive create 'x',
     |        or append 'a'.
     |  compression: ZIP_STORED (no compression), ZIP_DEFLATED (requires zlib),
     |               ZIP_BZIP2 (requires bz2) or ZIP_LZMA (requires lzma).
     |  allowZip64: if True ZipFile will create files with ZIP64 extensions when
     |              needed, otherwise it will raise an exception when this would
     |              be necessary.
    
[/code]

ZipFileクラスの引数は上のヘルプでわかるように、ファイルへのパスかファイルオブジェクトです。bytesをそのまま読み込むことはできないようです。そのためbytesをファイルオブジェクトとして扱うためにio.BytesIOを使います。

[code]

    >>> help(io.BytesIO)
    Help on class BytesIO in module io:
    
    class BytesIO(_BufferedIOBase)
     |  Buffered I/O implementation using an in-memory bytes buffer.
    
[/code]

ウェブからロードする方法はこのサンプルの通りで良いと思います。


CC BY-SA 3.0
2017-08-29T17:54:42.963
37582
2017-08-29T17:59:48.823
2017-08-29T17:59:48.823
7837
7837
37573
answer