繁体   English   中英

使用 Python urllib2 下载时忽略丢失的文件

[英]Ignore missing file while downloading with Python urllib2

问题:正如标题所述,我正在根据年份和日期通过 ftp 从 NOAA 下载数据。 我已将我的脚本配置为经过一系列年份并每天下载数据。 然而,脚本在没有文件存在的日子里会挂掉。 发生的事情是它只是不断重新加载同一行,说该文件不存在。 如果没有 time.sleep(5),脚本会像疯了一样打印到日志中。

解决方案:以某种方式跳过缺少的一天并进入下一天。 我已经探索了continue (也许我把它放在了错误的位置),创建了一个空目录(不优雅,仍然不会过去错过的一天)。 我不知所措,我忽略了什么?

这是脚本:

##Working 24km
import urllib2
import time
import os
import os.path

flink = 'ftp://sidads.colorado.edu/DATASETS/NOAA/G02156/24km/{year}/ims{year}{day}_24km_v1.1.asc.gz'
days = [str(d).zfill(3) for d in range(1,365,1)]
years = range(1998,1999)
flinks = [flink.format(year=year,day=day) for year in years for day in days]

from urllib2 import Request, urlopen, URLError

for fname in flinks:
    dl = False
    while dl == False:
        try:
            # req = urllib2.Request(fname)
            req = urllib2.urlopen(fname)
            with open('/Users/username/Desktop/scripts_hpc/scratch/'+fname.split('/')[-1], 'w') as dfile:
            dfile.write(req.read())
            print 'file downloaded'
            dl = True

        except URLError, e:
            #print 'sleeping'
            print e.reason
            #print req.info()
            print 'skipping day: ', fname.split('/')[-1],' was not processed for ims'
            continue
            '''
            if not os.path.isfile(fname):
                f = open('/Users/username/Desktop/scripts_hpc/empty/'+fname.split('/')[-1], 'w')
                print 'day was skipped'
            '''

            time.sleep(5)

        else:
            break
            #everything is fine

研究:我浏览了其他问题,它们很接近,但似乎没有一针见血。 忽略丢失的文件 Python ftplib如果文件为空如何跳过文件的一行任何帮助将不胜感激!

谢谢!

我想当你站起来走开喝咖啡时,事情就变得清楚了。 显然,我的 while 语句中出现了一些问题(仍然不确定为什么)。 当我拿出它并添加pass而不是continue 时,它的行为是正确的。

这是它现在的样子:

for fname in flinks:
    try:
        req = urllib2.urlopen(fname)
        with open('/Users/username/Desktop/scripts_hpc/scratch/'+fname.split('/')[-1], 'w') as dfile:
            dfile.write(req.read())
        print 'file downloaded'

    except URLError, e:
        print e.reason
        print 'skipping day: ', fname.split('/')[-1],' was not processed for ims'
        pass
        time.sleep(5)

except ,使用pass而不是continue ,因为它只能在循环内使用( forwhile )。

这样你就不需要处理丢失的文件,因为 Python 会忽略错误并继续。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM