Я уже некоторое время экспериментирую с 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 или тех, кто тоже сталкивался с этой проблемой и решал ее. Не могли бы вы мне помочь, пожалуйста?
Конечно, но дело в том, что я хочу перечислить их до/без загрузки (это огромный набор данных, поэтому я хочу работать с ним постепенно)
Я установил 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 Вы всегда можете перенаправить в файл kaggle ... > output.txt
, а затем прочитать из файла. Некоторые команды даже имеют возможность генерировать данные для файла CSV, поэтому работать с ними может быть проще. например pandas.read_csv("output.txt")
. Но у Jupyter может быть возможность перенаправления на переменную — несколько месяцев назад я видел вопрос о перенаправлении !
на переменную.
Я протестировал это на Colab, и это должно работать variable = !kaggle ...
если вы загрузили полный набор данных, возможно, проверьте папки на диске. например на питоне
os.listdir(folder)