Доступ к содержимому из нескольких загруженных файлов из ipywidgets FileUpload - PullRequest
1 голос
/ 31 марта 2020

Я только сейчас изучаю ipywidgets и работаю с ними в блокноте Jupyter Python 3. По сути, я пытаюсь разрешить пользователю загружать несколько файлов с помощью FileUpload (), а затем пытаюсь получить доступ к содержимому этих файлов, чтобы я можете сохранить каждый из них в систему. У меня это работает только для одного файла, но теперь я пытаюсь сделать его итеративным, чтобы он мог сохранить их все.

Вот мой код для создания FileUpload

from ipywidgets import FileUpload

upload = FileUpload(multiple=True)

upload

, затем я щелкаю виджет загрузки и загружаю два файла .txt

Я распечатал, как выглядит upload.value как:

{'test.txt': {'content': b'hi',
              'metadata': {'lastModified': 152266374855,
                           'name': 'test.txt',
                           'size': 17,
                           'type': 'text/plain'}},
'test2.txt': {'content': b'bye',
              'metadata': {'lastModified': 152266374855,
                           'name': 'test2.txt',
                           'size': 18,
                           'type': 'text/plain'}}}

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

with open("test.txt", "wb") as fp:
     fp.write(upload.data[0])

, затем я попытался повторить, чтобы сделать то же самое для два файла (я много чего пробовал, прости меня, я не очень хорош со словарями)

for files in upload.value:
     with open(file, "wb") as fp:
          fp.write(file['content'])

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

я также попробовал варианты:

for elem in upload.value:
     with open (elem['metadata']['name'], 'wb') as file:
          file.write(elem['content'])

Я попытался сделать for k,v и добавить .items() после загрузки, но там тоже были ошибки. Я думаю, я просто не могу понять, как получить доступ к значениям каждого файла в a для l oop ... Пожалуйста, дайте мне знать, если у вас есть какие-либо советы, спасибо!

1 Ответ

1 голос
/ 01 апреля 2020

upload.value возвращает словарь, поэтому вам нужно перебирать пары ключ-значение, используя .items (). Оба приведенных ниже эффекта имеют одинаковый эффект, немного более сжато 2.

1) Распакуйте в l oop

for elem in upload.value.items():
     name, file_info = elem
     with open (name, 'wb') as file:
          file.write(file_info['content'])

2) Или распакуйте напрямую

for name, file_info in upload.value.items():
     with open (name, 'wb') as file:
          file.write(file_info['content'])
...