Python 正在下载图像,要保存到文件夹,请检查文件是否存在

Python 正在下载图像,要保存到文件夹,请检查文件是否存在,python,file-io,download,Python,File Io,Download,所以我有一个我正在循环的产品记录集(sqlalchemy),我想下载一个图像并将其保存到一个文件夹中 如果文件夹不存在,我想创建它 另外,我想首先检查文件夹中是否存在图像文件如果有,不要下载,直接跳过该行。 /myscript.py /images/ 我希望images文件夹与脚本文件位于同一目录中,无论它存储在何处 到目前为止,我已经: q = session.query(products) for p in q: if p.url: req = urllib

所以我有一个我正在循环的产品记录集(sqlalchemy),我想下载一个图像并将其保存到一个文件夹中

如果文件夹不存在,我想创建它

另外,我想首先检查文件夹中是否存在图像文件如果有,不要下载,直接跳过该行。

/myscript.py
/images/
我希望images文件夹与脚本文件位于同一目录中,无论它存储在何处

到目前为止,我已经:

q = session.query(products)

for p in q:
     if p.url:
          req = urllib2.Request(p.url)
          try:
                 response = urllib2.urlopen(req)
                 image = response.read()

                 ???
          except URLError e:
                 print e

我想您可以在这里使用
urllib.urlretrieve

import errno
import os
import urllib

def require_dir(path):
    try:
        os.makedirs(path)
    except OSError, exc:
        if exc.errno != errno.EEXIST:
            raise

directory = os.path.join(os.path.dirname(os.path.abspath(__file__)), "images")
require_dir(directory)
filename = os.path.join(directory, "stackoverflow.html")

if not os.path.exists(filename):
    urllib.urlretrieve("http://stackoverflow.com", filename)

文件名应该位于
response.info()['Content-Disposition']
(作为
filename=something
在该字符串中的分号之后)——如果不是(该头缺少、没有分号或没有
filename
部分),则可以使用
urlparse.urlspilt(p.url)
并获取最后一个非空组件的
os.path.basename
(或者,更实用一些,但这会严重冒犯纯粹主义者,只需
p.url.split('/')[-1]
;-)

文件名到此为止,请称之为
fn

脚本所在的目录是
sd=os.path.dirname(\uu文件\uu)

因此,它的
images
子目录显然是
sdsd=os.path.join(sd,'images')

要检查该子目录是否存在,并将其设为其他子目录

if not os.path.exists(sdsd): os.makedir(sdsd)
要检查要写入的文件是否已存在

if os.path.exists(os.path.join(sdsd, fn)): ...
所有这些代码都会出现在
中。这是一个很大的函数,所以显然最好将
p.url
response
作为参数(它可以自己读取
image
),如果您希望以后可以自由地将该函数移到自己的单独模块中(我建议这样做!),也可以将
\uuuu文件
作为参数


当然,对于所有这些
os
os.path
调用,您需要导入操作系统,如果您决定使用后一个标准库模块,还可以导入URLPrase。

路径应该是/images/还是根目录的完整路径?我的示例将使用名为
images
的目录,该目录与脚本文件位于同一目录中。在Python 3中,使用:
如果不是os.path.exists(path):os.mkdir(path)
而不是。在Python3中,如果不是os.path.exists(path),则使用:
:os.mkdir(path)