2019.4.3批量下载图片代码

这篇博客介绍了Python中处理JSON数据的模块及其方法,包括dumps、dump、loads和load的用法。接着讨论了JSON和pickle序列化的区别。此外,还详细讲述了如何在Python中创建目录文件夹,并提供了相关函数的用法。最后,博主分享了如何使用Python进行图片下载,提到了图片下载路径和存储路径的设置方法。
摘要由CSDN通过智能技术生成
import json #一
import os #二
from urllib.request import  urlretrieve #三
    
with open(r'F:/imaterialist-product-2019-master-码隆产品识别大赛/imaterialist-product-2019/train.json','r',encoding = 'utf-8') as f:
    txt = json.load(f) #一
for d in txt["images"]:
    try:
        url = d['url'] #下载地址, str
        name = d['id'] #图片名称,str
        class_name = str(d['class']) #文件夹名字, int
        if class_name == ' ':                                                                                                                                                                                                                                                                                                                                                                                                                                                   
            continue
        path = 'F:/imaterialist-product-2019-master-码隆产品识别大赛/imaterialist-product-2019/train/' + class_name + '/'
        if os.path.exists(path): #判断路径是否已存在, 二
            pass
        else:
            os.makedirs(path) #不存在则创建文件路径, 二
        urlretrieve(url, path + name) #下载图片并存储, 三
    except:
        print(d.items())
        continue

一、JSON模块

JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。

python中,专门处理json格式的模块: json 和 picle模块

Json 模块提供了四个方法: dumps、dump、loads、load

pickle 模块也提供了四个功能:dumps、dump、loads、load

1、dumps、dump:序列化方法

json.dumps()只完成了序列化为str(序列化、无文件操作)

json.dump()必须传文件描述符,将序列化的str保存到文件中(序列化 + 写入文件)

import json

data = [{ 'a': 1, 'b':2, 'c':3 }]
json.dumps(data)

filename = ('a.txt','w')
json.dump({'a':4, 'b':5 }, filename, indent = 4)

2、loads、load:反序列化方法

loads(filename.read())只完成了反序列化(无文件操作、反序列化)

json.load(filename)只接受文件描述符,完成了读取文件和反序列化(读文件 + 反序列化 )

import json

with open('a.json', 'r', encoding = 'utf-8') as f:
    aa = json.loads(f.read())
    f.seek(0)
    bb = json.load(f)

3、json和pickle四种方法的用法相同,json序列化出来的格式更通用(其他语言都认识)、pickle序列化出来的格式只有python认识,但pickle序列化功能更强大,可以序列化函数。

4、python对象与json对象的对应关系

python:dict            list、tuple       str              int、float         True        False        None

JSON :object        array               string         number           ture         false          null

二、创建目录文件夹

Python对文件操作需要import os,包含三个重要的函数。

os.psth.exists(path)判断一个目录是否存在

os.makedirs(path)多层创建目录(当父目录不存在时,会创建父目录)

os.mkdir(path)创建目录(当父目录不存在时,不回创建父目录)

如上例代码:第一次循环创建目录时,使用os.makedirs(path)会提示目录不存在,主要原因是还不存在train;但是使用os.makedirs(path)不会报错,它可以自己创建train。

注意:路径最好使用‘/’,减少使用‘\’,如path = 'F:/imaterialist-product-2019/train/' + class_name + '/'

三、下载图片

参数1:图片下载路径

参数2:图片名称及存储路径

#方法一
from urllib.request import urlretrive
urlretrive(arg1, arg2)

 

#方法二
import requests
r = requests.get(arg1)
with open(arg2, 'wb') as f:
    f.write(r.content)

 

运行环境 .NET Framework2.0 开发工具 Microsoft Visual Studio 2005 二. 部分代码说明(主要讲解异步分析和下载): 异步分析下载采取的策略是同时分析同时下载,即未等待数据全部分析完毕就开始把已经分析出来的图片链接开始下载下载成功的均在List框链接前面划上了√ ,未能下载图片有可能是分析错误或者是下载异常。 1. 异步分析部分代码 /// /// 异步分析下载 /// private void AsyncAnalyzeAndDownload(string url, string savePath) { this.uriString = url; this.savePath = savePath; #region 分析计时开始 count = 0; count1 = 0; freq = 0; result = 0; QueryPerformanceFrequency(ref freq); QueryPerformanceCounter(ref count); #endregion using (WebClient wClient = new WebClient()) { AutoResetEvent waiter = new AutoResetEvent(false); wClient.Credentials = CredentialCache.DefaultCredentials; wClient.DownloadDataCompleted += new DownloadDataCompletedEventHandler(AsyncURIAnalyze); wClient.DownloadDataAsync(new Uri(uriString), waiter); //waiter.WaitOne(); //阻止当前线程,直到收到信号 } } /// /// 异步分析 /// protected void AsyncURIAnalyze(Object sender, DownloadDataCompletedEventArgs e) { AutoResetEvent waiter = (AutoResetEvent)e.UserState; try { if (!e.Cancelled && e.Error == null) { string dnDir = string.Empty; string domainName = string.Empty; string uri = uriString; //获得域名 http://www.sina.com/ Match match = Regex.Match(uri, @"((http(s)?://)?)+[\w-.]+[^/]");//, RegexOptions.IgnoreCase domainName = match.Value; //获得域名最深层目录 http://www.sina.com/mail/ if (domainName.Equals(uri
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值