如何将 zip 存档中的文件分类到 Python 中的列表中?

How to categorize files within a zip archive into a list in Python?

我正在尝试使用 Kaggle 中的 zip 存档,并访问 train.zip 文件中的文件,然后训练我的模型。此文件包含猫和狗的图像,文件名显示图像是猫还是狗的图像。 我认为可以通过读取 zip 存档然后创建猫狗图像数量列表来做到这一点。

我知道我可以使用此代码读取 zip 存档:

with zipfile.ZipFile("../input/dogs-vs-cats/train.zip","r") as z:
    z.extractall(".")

print(check_output(["ls", "train"]).decode("utf8")) 

此外,下面的代码可用于对文件进行分类,前提是我们已将它们解压缩。但是,文件似乎没有解压缩,我们只能使用上面的代码读取它。所以,我不知道如何将这两个代码配对才能读取文件名。

categories = []
for filename in filenames:
    category = filename.split('.')[0]
    if category == 'dog':
        categories.append(1)
    else:
        categories.append(0)

df = pd.DataFrame({
    'filename': filenames,
    'category': categories
})
print (categories)

问题是 filenames 似乎只能是一个字符串,我无法将第一个代码(包含 ZipFile 命令)的输出分配给它。我认为通过添加以下代码,我可以读取目录并将值分配给 filenames;然而,文件应该被解压缩。

filenames = os.listdir("../input/dogs-vs-cats/")

所以,我想知道如何将 zip 文件提供给分类代码,或者如何以可以在目录中找到文件的方式在 Kaggle 中解压缩文件?

好的,没有人回答我的问题,但我可以找到解决方案。实际上,我可以找到我的问题所在!我在这里提到它,所以其他使用 Kaggle zip 文件的人可以使用它。

我的代码(实际上是被盗的代码:)都是正确的。唯一的问题是我看错了目录!我使用 os.listdir() 函数来了解文件在 Kaggle 中的结构以及提取文件的位置。 (您可以使用 extract() 函数来提取 zip 存档中的文件)

因此,如果您在 Kaggle 中有一个 zip 存档并想使用它,只需使用以下代码即可。请记住,您可以使用整个代码,即按名称对文件进行分类,或者只使用我探索压缩存档的部分。您不必像我一样进行分类,因为我正在对文件进行分类以在卷积神经网络 (CNN) 中使用。您可以决定进行其他类型的分类。

# importing necessary libs and packages
from subprocess import check_output
import numpy as np
import pandas as pd 
import os
import zipfile

# opening and viewing the files
with zipfile.ZipFile("../input/dogs-vs-cats/train.zip","r") as z:
    z.extractall(".")
print(check_output(["ls", "train"]).decode("utf8"))

# categorizing files into categories of 0 and 1 to use as labels
filenames = os.listdir("../working/train")
categories = []
for filename in filenames: 
    category = filename.split('.')[0] #here is the part that your code can be different to mine- you can categorize files differently and with a different approach
    if category == 'dog':
        categories.append(1)
    else:
        categories.append(0)

df = pd.DataFrame({
    'filename': filenames,
    'category': categories
})
print (categories)

请记住,如果代码不起作用,可能是因为路径错误。使用 os.listdir() 找到正确的路径。