Как составить список всех файлов из набора данных Kaggle в Google Colab?

Я уже некоторое время экспериментирую с Kaggle API в Google Colab и столкнулся со следующей проблемой. Я могу легко проверить подлинность своих учетных данных и без проблем загружаю целые наборы данных, а также отдельные файлы, используя:

!kaggle datasets download -d <user>/<dataset>
!kaggle datasets download <user>/<dataset> -f <specific_file>

Однако я не могу получить список всех файлов в наборе данных (который я хотел бы сохранить в переменной).

Всякий раз, когда я использую:

api.dataset_list_files('<user>/<dataset>').files

Я получаю список с пробелами, равными количеству файлов в соответствующем наборе данных. Я не нашел упоминания о чем-либо подобном в Интернете, поэтому думаю, что, возможно, это недавняя ошибка/проблема. Кроме того, я действительно могу использовать:

!kaggle datasets files <user>/<dataset>

Чтобы правильно перечислить первые 20 файлов, но это не очень полезно, так как я не знаю, как увидеть остальные и как сохранить их в переменной.

Я предполагаю, что, возможно, мне удастся придумать сложное решение, использующее Selenium или что-то в этом роде, но я думаю, что это было бы излишним. Вот почему я прихожу сюда в поисках мудрости более опытных пользователей Kaggle API или тех, кто тоже сталкивался с этой проблемой и решал ее. Не могли бы вы мне помочь, пожалуйста?

если вы загрузили полный набор данных, возможно, проверьте папки на диске. например на питоне os.listdir(folder)

furas 18.06.2024 23:29

Конечно, но дело в том, что я хочу перечислить их до/без загрузки (это огромный набор данных, поэтому я хочу работать с ним постепенно)

Jorvan 18.06.2024 23:51
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я установил kaggle на локальный компьютер и проверил с помощью опции --help

$ kaggle datasets files --help

usage: kaggle datasets files [-h] [-v] [--page-token PAGE_TOKEN] [--page-size PAGE_SIZE] [dataset]

options:
  -h, --help            show this help message and exit
  dataset               Dataset URL suffix in format <owner>/<dataset-name> (use "kaggle datasets list" to show options)
  -v, --csv             Print results in CSV format (if not set print in table format)
  --page-token PAGE_TOKEN
                        Page token for results paging.
  --page-size PAGE_SIZE
                        Number of items to show on a page. Default size is 20, max is 200

Он показывает, что значение по умолчанию — 20 элементов на странице
. но вы можете использовать --page-size 200, чтобы получить максимум 200 файлов одновременно.

Если в наборе данных больше файлов, отображается PAGE_TOKEN для загрузки следующей страницы.

$ kaggle datasets files kaggle/meta-kaggle

Next Page Token = CfDJ8CHCUm6ypKVLpjizcZHPE70-HT6X7bGt2XVG4i4n1JtDeW1lGdfJq1hmMK_AMcY_oT42rtD7r0_qjltw2PYh-F8
name                                  size  creationDate         
-----------------------------------  -----  -------------------  
CompetitionTags.csv                   23KB  2024-06-18 11:28:01  
Competitions.csv                       2MB  2024-06-18 11:28:02  
DatasetTags.csv                        9MB  2024-06-18 11:28:02  
DatasetTaskSubmissions.csv           648KB  2024-06-18 11:28:02  
DatasetTasks.csv                       8MB  2024-06-18 11:28:02  
DatasetVersions.csv                  933MB  2024-06-18 11:28:21  
DatasetVotes.csv                      82MB  2024-06-18 11:28:09  
Datasets.csv                          41MB  2024-06-18 11:28:09  
Datasources.csv                       19MB  2024-06-18 11:28:08  
EpisodeAgents.csv                     12GB  2024-06-18 11:33:22  
Episodes.csv                           3GB  2024-06-18 11:30:10  
ForumMessageVotes.csv                161MB  2024-06-18 11:29:37  
ForumMessages.csv                      1GB  2024-06-18 11:29:51  
ForumTopics.csv                       54MB  2024-06-18 11:29:36  
Forums.csv                            15MB  2024-06-18 11:29:35  
KernelLanguages.csv                   410B  2024-06-18 11:29:35  
KernelTags.csv                        23MB  2024-06-18 11:29:35  
KernelVersionCompetitionSources.csv   76MB  2024-06-18 11:29:36  
KernelVersionDatasetSources.csv      260MB  2024-06-18 11:29:41  
KernelVersionKernelSources.csv        26MB  2024-06-18 11:29:35  

И следующая страница

$ kaggle datasets files kaggle/meta-kaggle --page-token 'CfDJ8CHCUm6ypKVLpjizcZHPE70-HT6X7bGt2XVG4i4n1JtDeW1lGdfJq1hmMK_AMcY_oT42rtD7r0_qjltw2PYh-F8'

name                    size  creationDate         
---------------------  -----  -------------------  
KernelVersions.csv       2GB  2024-06-18 11:30:01  
KernelVotes.csv        208MB  2024-06-18 11:29:38  
Kernels.csv            177MB  2024-06-18 11:29:38  
Organizations.csv      286KB  2024-06-18 11:29:35  
Submissions.csv          2GB  2024-06-18 11:29:59  
Tags.csv                96KB  2024-06-18 11:29:35  
TeamMemberships.csv    318MB  2024-06-18 11:29:39  
Teams.csv              574MB  2024-06-18 11:29:43  
UserAchievements.csv     5GB  2024-06-18 11:30:26  
UserFollowers.csv       61MB  2024-06-18 11:29:36  
UserOrganizations.csv   81KB  2024-06-18 11:29:35  
Users.csv                1GB  2024-06-18 11:29:53  

Если страниц будет больше, то на второй странице должен отображаться токен третьей страницы, а на третьей странице должен отображаться токен четвертой страницы и т. д.


Если вам это нужно в переменной, вы можете сделать это напрямую

variable = !kaggle datasets files kaggle/meta-kaggle 

будет полезнее, если вы отправите его в формате CSV.

variable = !kaggle datasets files --csv kaggle/meta-kaggle 

потому что он дает список строк, поэтому вы можете преобразовать его в одну строку
а позже вы сможете использовать io, чтобы загрузить его в DataFrame

import pandas as pd
import io

text = "\n".join(variable)  # use `[1:]` to skip line with PAGE TOKEN or `[2:]` to skip also header
df = pd.read_csv(io.StringIO(text))

print(df)

Вы также можете перенаправить его в файл

!kaggle datasets files --csv kaggle/meta-kaggle > output.csv

и на следующей странице вы можете добавить, используя >> вместо >

!kaggle datasets files --csv kaggle/meta-kaggle --page-token ... >> output.csv

но он добавляет второй заголовок как строку данных, и его необходимо удалить позже.


Получение информации с помощью Python

import kaggle
from kaggle.api.kaggle_api_extended import KaggleApi
api = KaggleApi()
api.authenticate()

data = []

# first page
page_token = None
#page_size = 20

while True:
    print('loading page ...')

    result = api.datasets_list_files('kaggle', 'meta-kaggle', page_token=page_token) #, page_size=page_size)
    #print('-- result keys ---')
    #print('\n'.join(sorted(result.keys())))
    #page_token = result['nextPageToken']   # I'm not sure if key can exists if there is no next page and don't want to check key `hasNextPageToken`
    page_token = result.get('nextPageToken')

    for item in result['datasetFiles']:
        #print('-- item keys ---')
        #print('\n'.join(sorted(item.keys())))
        data.append( [item['name'], item['totalBytes']] )

    if not page_token:
        break

print('len(data):', len(data))
for index, (name, size) in enumerate(data, 1):
    print(f'{index:3} | {size:15,} | {name}')

Результат:

loading page ...
loading page ...
len(data): 32
  1 |          23,149 | CompetitionTags.csv
  2 |       2,601,077 | Competitions.csv
  3 |       9,251,082 | DatasetTags.csv
  4 |         663,759 | DatasetTaskSubmissions.csv
  5 |       7,918,950 | DatasetTasks.csv
  6 |     978,416,044 | DatasetVersions.csv
  7 |      85,737,991 | DatasetVotes.csv
  8 |      42,800,784 | Datasets.csv
  9 |      20,060,921 | Datasources.csv
 10 |  13,291,567,707 | EpisodeAgents.csv
 11 |   3,719,462,511 | Episodes.csv
 12 |     169,295,986 | ForumMessageVotes.csv
 13 |   1,365,573,428 | ForumMessages.csv
 14 |      57,075,670 | ForumTopics.csv
 15 |      15,698,393 | Forums.csv
 16 |             410 | KernelLanguages.csv
 17 |      24,133,789 | KernelTags.csv
 18 |      79,198,822 | KernelVersionCompetitionSources.csv
 19 |     272,485,582 | KernelVersionDatasetSources.csv
 20 |      27,251,969 | KernelVersionKernelSources.csv
 21 |   1,721,607,368 | KernelVersions.csv
 22 |     217,656,945 | KernelVotes.csv
 23 |     186,013,899 | Kernels.csv
 24 |         293,159 | Organizations.csv
 25 |   1,854,509,529 | Submissions.csv
 26 |          98,002 | Tags.csv
 27 |     333,276,608 | TeamMemberships.csv
 28 |     601,950,035 | Teams.csv
 29 |   5,596,699,151 | UserAchievements.csv
 30 |      63,464,540 | UserFollowers.csv
 31 |          83,301 | UserOrganizations.csv
 32 |   1,088,130,308 | Users.csv

Да, это может быть полезно, если есть способ сохранить имена всех файлов в переменной или в .txt, но я не нашел способа сделать это и хотел бы решить проблему, возникающую при использовании Python. для этого 🤔

Jorvan 18.06.2024 23:58

@Jorvan Вы всегда можете перенаправить в файл kaggle ... > output.txt, а затем прочитать из файла. Некоторые команды даже имеют возможность генерировать данные для файла CSV, поэтому работать с ними может быть проще. например pandas.read_csv("output.txt"). Но у Jupyter может быть возможность перенаправления на переменную — несколько месяцев назад я видел вопрос о перенаправлении ! на переменную.

furas 19.06.2024 00:50

Я протестировал это на Colab, и это должно работать variable = !kaggle ...

furas 19.06.2024 01:03

Другие вопросы по теме