概要
Kaggleで定義されている訓練用・テストデータがzipに固められているものがある。
ローカルで開発している人は容易に解凍ができるが、notebook上だと「/kaggle/input」は配下はread権限しかないため、エラーが出てしまう。
▼下記のようなエラー
OSError: [Errno 30] Read-only file system: '/kaggle/input/~
やっていることはpythonのzip解凍・zip読み込み系ではあるのだが、kaggle内にある他の人が書いたコードを参考にする時に、zip解凍したファイルの読み込み周りで詰まったので、これで解決できたよという意味でまとめる。
※他に良い方法があれば教えて欲しいですmm
方法
CSVの場合
CSVの場合は「pandas.read_csv([zip名])」を使用すれば読み込むことができる。
import pd as pandas
train = pd.read_csv('/kaggle/input/train.csv.zip')
CSV形式は以下でQAのやりとりがあり、他でもunzip方法が記載されている。
画像の場合
ファイル出力
対象zip内のファイルを出力してしまう。
「/kaggle/input」配下に出力できないだけなので、作業用の「/kaggle/working」配下に出力する。
import zipfile
z = zipfile.ZipFile('/kaggle/input/street-view-getting-started-with-julia/train.zip')
z.namelist() # zip内のファイル名一覧を取得
extractall('/kaggle/working') # zip内容を出力
※ただし、画像が多い場合は対象DirがUI上は重すぎて開けなくなるので、UI上の操作はしないようにする。
imread関数を使用すれば対象画像を読み込むことができる。
画像が連番の場合はrangeなどで画像読み込みすれば楽に取得できる。
from skimage import io
train=[io.imread('/kaggle/working/train/'+str(i)+'.Bmp',as_gray=True) for i in range(1,[ラストの連番まで])]
namelist()を使用して、配列を回して画像として読み込むこともできると思う。(for文の回し方を変えるだけだと思うので割愛)
ファイル名を元にアクティブで読み込んでいく
read関数でも取得することができる。
z = zipfile.ZipFile('/kaggle/input/xxxxx/test.zip', 'r')
z.namelist() # zip内のファイル名一覧を取得
img_data = z.read('test/xxxx.Bmp')
こちらも上記と同様にrangeなどで連番で画像情報を取得するか、namelistで取得する形になる。
参考リンク
https://www.kaggle.com/questions-and-answers/56042
https://www.it-swarm-ja.com/ja/python/python%EF%BC%9A%E4%B8%80%E6%99%82%E7%9A%84%E3%81%AB%E8%A7%A3%E5%87%8D%E3%81%9B%E3%81%9A%E3%81%ABzip%E3%81%8B%E3%82%89%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E9%96%8B%E3%81%8D%E3%81%BE%E3%81%99/1041517400/