Python字符串作为Skimage imread中的文件

Adr*_*ida 2 python decode file scikit-image

我正在对Kaggle进行CIFAR挑战.

他们给了一个包含5万张图片的.7z文件作为火车.我花了1个小时解压缩它然后再花40分钟读取所有文件并将其放在内存中.

试图不创建50k文件,因为这是这个的瓶颈,我已经安装了pylzma和其他库,但所有这些都会告诉我该文件无效.

来自bash的7z可以正确读取文件,并列出文件.所以我使用Popen了解压缩所有文件并使用bash 7z程序将它放在内存中的字符串中

import subprocess
p = subprocess.Popen(["7z", "e", "-so", "awa.7z"], stdout=subprocess.PIPE).communicate()[0]
Run Code Online (Sandbox Code Playgroud)

我已经设法通过查看其大小,然后从字符串中获取适当的字节来单独获取每个文件

f1 = p[0][0:2105]
Run Code Online (Sandbox Code Playgroud)

我现在想要的是欺骗Python认为F1文件指针,这样我就可以调用skimage.io.imread并将它转换为适当的结构.或者也许只是将内存值传递给skimage,它会为我转换它.

phi*_*hil 5

虽然skimage.io.imread的doc说第一个参数是filename的字符串,但我发现它也接受类似文件的对象(版本为0.10.0的skimage).

所以你可以将图像数据读入内存,如下所示:

from StringIO import StringIO

with open(filename) as f:
    img_data = f.read()
decoded_img_data = skimage.io.imread(StringIO(img_data))
print decoded_img_data

>> OUTPUT:
array([[[235, 230, 234],
        [233, 228, 232],
        [231, 226, 230],
        ...,
Run Code Online (Sandbox Code Playgroud)