Python – попытка сохранить файл в томе Docker

Я пытаюсь написать файл python в json в контейнере Docker. Я использую Jupyter Notebook в контейнере для загрузки некоторых URL-адресов из API NBA, и в конечном итоге я хочу записать его куда-нибудь в базу данных NoSql, но пока я хочу, чтобы файлы сохранялись внутри тома контейнера Docker. К сожалению , когда я запускаю этот код Python, я получаю сообщение об ошибке

FileNotFoundError: [Errno 2] No such file or directory: '/usr/src/app/nba-matches/0022101210.json'

Вот код Python... Я бегу

from run import *
save_nba_matches(['0022101210'])

на блокноте Jupyter.

Скрипт Python:

import os
import urllib.request
import json
import logging

BASE_URL = 'https://cdn.nba.com/static/json/liveData/playbyplay/playbyplay_'
PATH = os.path.join(os.getcwd(), 'nba-matches')
LOGGER = logging.getLogger()
LOGGER.setLevel(logging.INFO)


def save_nba_matches(match_ids):
    for match_id in match_ids:
        match_url = BASE_URL + match_id + '.json'
        json_file = os.path.join(PATH, match_id+'.json')

        web_url = urllib.request.urlopen(
            match_url)
        data = web_url.read()
        encoding = web_url.info().get_content_charset('utf-8')
        json_object = json.loads(data.decode(encoding))
        with open(json_file, "w+") as f:
            json.dump(json_object, f)
        logging.info(
            'JSON dumped into path: [' + json_file + ']')

Dockerfile:

FROM python:3

WORKDIR /usr/src/app

COPY requirements.txt ./

RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["jupyter", "notebook", "--port=8888", "--no-browser", "--ip=0.0.0.0", "--allow-root"]

и, наконец, docker-compose.yml

version: '3.4'
services:
  sports-app:
    build: .
    volumes:
      - '.:/usr/src/app'
    ports:
      - 8888:8888

Существует ли каталог nba-matches в смонтированном каталоге хоста? Вы получите эту ошибку, если это не так. (Рассмотрите возможность монтирования только этого каталога в настройках Compose, чтобы код приложения в образе не был перезаписан при монтировании привязки.)

David Maze 10.04.2022 03:17
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
1
1
26
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Судя по внешнему виду ошибки, у вас нет каталога с именем «nba-matches», и он нужен функции save_nba_matches; Вы можете добавить проверку каталога, например.

os.makedirs(PATH, exist_ok=True)

запустить.py

import os
import urllib.request
import json
import logging

BASE_URL = 'https://cdn.nba.com/static/json/liveData/playbyplay/playbyplay_'
PATH = os.path.join(os.getcwd(), 'nba-matches')
LOGGER = logging.getLogger()
LOGGER.setLevel(logging.INFO)


def save_nba_matches(match_ids):
    for match_id in match_ids:
        match_url = BASE_URL + match_id + '.json'
        json_file = os.path.join(PATH, match_id+'.json')
        web_url = urllib.request.urlopen(
            match_url)
        data = web_url.read()
        encoding = web_url.info().get_content_charset('utf-8')
        json_object = json.loads(data.decode(encoding))
        os.makedirs(PATH, exist_ok=True)
        with open(json_file, "w+") as f:
            json.dump(json_object, f)
        logging.info(
            'JSON dumped into path: [' + json_file + ']')

или просто вручную создав директорию nba-matches это сработает

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