

Windows10の環境でJupyter Notebookを使用して、Flicker
APIのキーを取得後にpipコマンドでモジュールのインストール後、下記のプログラムを実行するとエラーになってしまいます。

どの様に対処したらいいのでしょうか？教えてください。

**実行したプログラム**

[code]

    # Flickrで写真を検索して、ダウンロードする
    from flickrapi import FlickrAPI
    from urllib.request import urlretrieve
    from pprint import pprint
    import os, time, sys
    
    # APIキーとシークレットの指定（★以下書き換えてください★）--- (*1)
    key = "41c9b3fc161f7cab49d92985af058831"
    secret = "0a0fdc4f2b74cb90"
    wait_time = 1 # 待機秒数（1以上を推奨）
    
    # キーワードとディレクトリ名を指定してダウンロード --- (*2)
    def main():
        go_download('マグロ寿司', 'sushi')
        go_download('サラダ', 'salad')
        go_download('麻婆豆腐', 'tofu')
    
    # Flickr APIで写真を検索 --- (*3)
    def go_download(keyword, dir):
        # 画像の保存パスを決定
        savedir = "./image/" + dir
        if not os.path.exists(savedir):
            os.mkdir(savedir)
        # APIを使ってダウンロード --- (*4)
        flickr = FlickrAPI(key, secret, format='parsed-json')
        res = flickr.photos.search(
          text = keyword,     # 検索語
          per_page = 300,     # 取得件数
          media = 'photos',   # 写真を検索
          sort = "relevance", # 検索語の関連順に並べる
          safe_search = 1,    # セーフサーチ
          extras = 'url_q, license')
        # 検索結果を確認
        photos = res['photos']
        pprint(photos)
        try:
          # 1枚ずつ画像をダウンロード --- (*5)
          for i, photo in enumerate(photos['photo']):
            url_q = photo['url_q']
            filepath = savedir + '/' + photo['id'] + '.jpg'
            if os.path.exists(filepath): continue
            print(str(i + 1) + ":download=", url_q)
            urlretrieve(url_q, filepath)
            time.sleep(wait_time)
        except:
          import traceback
          traceback.print_exc()
    
    if __name__ == '__main__':
        main()
    
[/code]

**発生したエラー**

[code]

    FileNotFoundError                         Traceback (most recent call last)
    <ipython-input-10-23621884de0c> in <module>
         48 
         49 if __name__ == '__main__':
    ---> 50     main()
    
    <ipython-input-10-23621884de0c> in main()
         12 # キーワードとディレクトリ名を指定してダウンロード --- (*2)
         13 def main():
    ---> 14     go_download('マグロ寿司', 'sushi')
         15     go_download('サラダ', 'salad')
         16     go_download('麻婆豆腐', 'tofu')
    
    <ipython-input-10-23621884de0c> in go_download(keyword, dir)
         21     savedir = "./image/" + dir
         22     if not os.path.exists(savedir):
    ---> 23         os.mkdir(savedir)
         24     # APIを使ってダウンロード --- (*4)
         25     flickr = FlickrAPI(key, secret, format='parsed-json')
    
    FileNotFoundError: [WinError 3] 指定されたパスが見つかりません。: './image/sushi'
    
[/code]


CC BY-SA 4.0
2020-02-14T20:30:21.117
63058
2022-07-12T00:03:50.357
2020-02-15T05:33:49.280
3060
37840
question
python python3 jupyter-notebook
取得した画像を保存しようとするとエラー: "FileNotFoundError: [WinError 3] 指定されたパスが見つかりません。"


おそらく、この記事の状況になっていたと思われます。  
[Pythonで深い階層のディレクトリを再帰的に作成するmakedirs](https://note.nkmk.me/python-makedirs-
exist-ok/)

> 存在しないディレクトリにos.mkdirでディレクトリを新規作成するとエラー  
>
> Pythonでディレクトリ（フォルダ）を作成するときに使う`os.mkdir()`だが、存在しないディレクトリの中に新たにディレクトリを作成しようとするとエラー（`FileNotFoundError`）が発生する。
[code]

>     import os
>  
>     os.mkdir('not_exist_dir/new_dir')
>     # FileNotFoundError
>  
[/code]

質問の状況では以下のエラーということで、上位側の`image`ディレクトリも無かったのでしょう。

[code]

    FileNotFoundError: [WinError 3] 指定されたパスが見つかりません。: './image/sushi'
    
[/code]

これに関しての対策は、

> os.makedirsで再帰的にディレクトリを作成  
>
> `os.mkdir()`ではなく`os.makedirs()`を使うと、中間ディレクトリを作成してくれるので、深い階層のディレクトリを再帰的に作成できる。
[code]

>     os.makedirs('not_exist_dir/new_dir')
>  
[/code]

>
>
> この例の場合、中間ディレクトリ`not_exist_dir`と末端ディレクトリ`new_dir`を一気に作成してくれる。新たな中間ディレクトリが複数あってもOK。

ということで、質問ソースのこの部分を、

>
[code]

>     if not os.path.exists(savedir):
>         os.mkdir(savedir)
>  
[/code]

以下のようにすれば解決するでしょう。

[code]

    if not os.path.exists(savedir):
        os.makedirs(savedir)
    
[/code]


CC BY-SA 4.0
2020-02-22T08:16:41.617
63268
2020-02-22T08:16:41.617
26370
63058
answer