52315


エラーが表示され、画像ファイルを指定したフォルダに書き込むことができません。  
指定フォルダを`C:\\Users\\???\\Desktop\\pics_directry`にするとファイルの書き込みはできます。フォルダ（pics_directry）にはたくさんフォルダがあり、この中に画像ファイルを書き込みたいです。

<エラー文>

[code]

    with open(savepath, mode="wb") as f:
    PermissionError: [Errno 13] Permission denied:
    
[/code]

<実行した内容>

[code]

    url = "https://......"
    
    class AppURLopener(req.FancyURLopener):
        version = "Mozilla/5.0"
    opener = AppURLopener()
    res = opener.open(url) 
    
    soup = BeautifulSoup(res, "html.parser")
    links = soup.div.center.find_all("a") 
    target_links = [link.get('href') for link in links] 
    
    for img_links in target_links:
    　　　　o = urlparse(img_links)
    　　　　savepath = 'C:\\Users\\???\\Desktop\\pics_directry\\' + o.netloc + o.query
    　　　　if not os.path.exists(savepath):
    　　　　　　　　print("makedirs=", savepath)
    　　　　　　　　os.makedirs(savepath)
    　　　　res = opener.open(img_links)
    　　　　soup = BeautifulSoup(res, "html.parser")
    　　　　img_links = soup.select(" div > p > a > img")
    　　　　img_target_links = [link.get('src') for link in img_links]
    　　　　print(img_target_links)
    　　　　for s in img_target_links:
    　　　　　　　　re = requests.get(s)
    　　　　　　　　print('Download:', s)
    　　　　　　　　with open(savepath, mode="wb") as f:
    　　　　　　　　　　　　f.write(re.content)
    　　　　　　　　　　　　time.sleep(0.1)
    
[/code]

※追記  
やはり自分では作成したフォルダへ画像ファイルを直接書き込むことができませんでした。なので、画像ファイル書き込みを他のフォルダ上で行いその後
glob()やshutil.move()などを使って指定のフォルダに移動しました。やりたかったことは一応達成できました。ありがとうございました。


CC BY-SA 4.0
2019-01-25T07:35:45.107
52311
2019-01-27T01:04:04.907
2019-01-27T01:04:04.907
31922
31922
question
python
pythonで指定したフォルダにファイルの書き込みを行いたい


`os.makedirs`でフォルダを作り、その **フォルダパスをopenすると**`permission denied`エラーになります。  
[本家SOの類似回答](https://stackoverflow.com/a/21786209/8248751)

[code]

    #エラーサンプル
    import os
    os.makedirs("hoge")
    with open("hoge", "w") as f:
      f.write("fuga")
    
[/code]

> Traceback (most recent call last):  
>  File "", line 1, in  
>  PermissionError: [Errno 13] Permission denied: 'hoge'

親フォルダを作るようにコードを書き換えればうまくいかないでしょうか。

[code]

    savepath = 'C:\\Users\\???\\Desktop\\pics_directry\\' + o.netloc + o.query
    savedir = os.path.dirname(savepath)
    if not os.path.exists(savedir):
        print("makedirs=", savedir)
        os.makedirs(savedir)
    
[/code]

**追記:**

Windows 10, Python 3.6.6で下記のサンプルコードを実行すると、手元の環境では正常終了しました。  
サンプルコードでは`o.query='s=32&d=identicon&r=PG'`でフォルダ名に無効な文字列が入るのを回避しています。  
`print(o)`や`print(savepath)`などの出力内容または実行可能なコードを追記していただくと、より具体的な回答を得やすいかも知れません。

[code]

    import os
    import requests
    import time
    import urllib.request as req
    from urllib.parse import urlparse
    from bs4 import BeautifulSoup
    
    url = "https://ja.stackoverflow.com/q/52311/"
    
    class AppURLopener(req.FancyURLopener):
        version = "Mozilla/5.0"
    opener = AppURLopener()
    res = opener.open(url) 
    
    soup = BeautifulSoup(res, "html.parser")
    targets = soup.find_all("img")
    
    for img in targets:
        if not img.has_attr('width'):
            continue
        if img['width'] == '0':
            continue
        s = img['src']
        o = urlparse(s)
        desktop_path = os.getenv("HOMEDRIVE") + os.getenv("HOMEPATH") + '\\Desktop'
        savepath = desktop_path + '\\pics_directry\\' + o.netloc + o.path.replace('/', '\\')
        savedir = os.path.dirname(savepath)
        if not os.path.exists(savedir):
            print("makedirs=", savedir)
            os.makedirs(savedir)
        print('Download:', s)
        re = requests.get(s)
        with open(savepath, mode="wb") as f:
            f.write(re.content)
            time.sleep(0.1)
    
[/code]


CC BY-SA 4.0
2019-01-25T08:41:32.893
52315
2019-01-25T12:03:01.190
2019-01-25T12:03:01.190
9820
9820
52311
answer