hetare
@hetare

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

FileNotFoundError: [Errno 2] No such file or directory:

解決したいこと

FileNotFoundError: [Errno 2] No such file or directory:のエラーを解決したいです。
状況としてはFlickrから画像データをダウンロードするということを実行しようとしたときです。

発生している問題・エラー

intro_deep_learning % python download.py crow
Traceback (most recent call last):
  File "http://download.py", line 29, in <module>
    urlretrieve(url_q,filepath) #ファイルダウンロードを実行
File "/Users/**/.pyenv/versions/anaconda3-2019.10/envs/tf112cpu/lib/python3.6/urllib/request.py", line 258, in urlretrieve
    tfp = open(filename, 'wb')
FileNotFoundError: [Errno 2] No such file or directory: './crow/51543612941.jpg'

または、問題・エラーが起きている画像をここにドラッグアンドドロップ

該当するソースコード

from flickrapi import FlickrAPI #FlikcrAPIクライアントのクラス定義
from urllib.request import urlretrieve #コマンドラインからhttp通信をする関数
import os, time, sys #Pythonからシステムにアクセスする関数, タイマー関数

key = "******"
secret = "******"
wait_time = 1 #リクエストを発行するインターバル

animalname = sys.argv[1] #コマンドラインで2番目の引数を取得
savedir = "./" + animalname #引数で与えた単語名でフォルダーを作成

flickr = FlickrAPI(key, secret, format='parsed-json')

result = flickr.photos.search(
    text = animalname, #検索ワード
    per_page = 400, #検索数上限
    media = 'photos', #データタイプ
    sort = 'relevance', #結果表示順, 最新から
    safe_search = 1, #子どもに不敵な画像を除外
    extras = 'url_q, licence' #オプション。データURL, ライセンスタイプ
)

photos = result['photos']

for i, photo in enumerate(photos['photo']):
    url_q = photo['url_q'] #photoオブジェクトからダウンロードURLを取得
    filepath = savedir + '/' + photo['id'] + '.jpg' #ファイル名をフルパスで生成
    if os.path.exists(filepath): continue #ファイルがあれば次へ
    urlretrieve(url_q,filepath) #ファイルダウンロードを実行
    time.sleep(wait_time) #サーバー負荷を考慮して1秒あける


自分で試したこと

参考記事を調べたのですがわかりませんでした。

追記)
最終的にコードは以下のようになりました。

# -*- coding: utf-8 -*-

from flickrapi import FlickrAPI #FlikcrAPIクライアントのクラス定義
from urllib.request import urlretrieve #コマンドラインからhttp通信をする関数
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
import os, time, sys #Pythonからシステムにアクセスする関数, タイマー関数

key = "*****"
secret = "*****"
wait_time = 1 #リクエストを発行するインターバル

animalname = sys.argv[1] #コマンドラインで2番目の引数を取得
savedir = "./" + animalname #引数で与えた単語名でフォルダーを作成

flickr = FlickrAPI(key, secret, format='parsed-json')

result = flickr.photos.search(
    text = animalname, #検索ワード
    per_page = 400, #検索数上限
    media = 'photos', #データタイプ
    sort = 'relevance', #結果表示順, 最新から
    safe_search = 1, #子どもに不敵な画像を除外
    extras = 'url_q, licence' #オプション。データURL, ライセンスタイプ
)

photos = result['photos']

for i, photo in enumerate(photos['photo']):
    url_q = photo['url_q'] #photoオブジェクトからダウンロードURLを取得
    filepath = savedir + '/' + photo['id'] + '.jpg' #ファイル名をフルパスで生成
    if os.path.exists(filepath): continue #ファイルがあれば次へ
    urlretrieve(url_q,filepath) #ファイルダウンロードを実行
    time.sleep(wait_time) #サーバー負荷を考慮して1秒あける



0

1Answer

crowというフォルダを用意してないからエラーが出てると思う。
Pythonの仕様上、ファイルをエクスポートするとき、保存先にフォルダを作成することできないから、事前に保存フォルダ(今回だと'crow')を作成しとかないと、エラー吐かれる。

0Like

Comments

  1. https://uxmilk.jp/8851
    ここによると、ファイルの一行目に文字コードを指定する構文を記述する必要があるらしい。(初めて知った)

    とりあえず、一行目に
    # coding: UTF-8
    を記述したら何か変わるかも
  2. @hetare

    Questioner

    コメントありがとうございます。

    昨日色々調べて試してみてなんとか解決できたっぽいです。

    こちらの記事を見て
    https://teratail.com/questions/109997?utm_source=pocket_mylist

    コマンドをpythonからpython3に変更しました。
      % python download.py crow
    → % python3 download.py crow

    そのほかpip3でいろいろinstallしました。

    % pip3 install FlickrAPI
    % pip3 install --upgrade certifi
    % pip3 list



    File "download.py", line 4, in <module>
    from urllib.request import urlretrieve #コマンドラインからhttp通信をする関数
    ImportError: No module named request

    % sudo python3 -m pip install request  を実行

    しかしコード実行するとまだ下記のエラーが出てきたので

    urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1125)>

    この記事を参考にして
    https://clione.online/scrap_urllib/?utm_source=pocket_mylist

    下記をコードに追加した ↓
    import ssl
    ssl._create_default_https_context = ssl._create_unverified_context


    これでコードを実行したところ、コードの記述通りcrowフォルダを自動で作成し、フォルダ内に画像を収集することができました。

    お騒がせしました。

Your answer might help someone💌