2013-01-09 45 views
0

在我尝试编写脚本之前,我想知道程序是否已经存在。自动化每日下载

我每天下载openstreetmap数据。这些文件每天更新​​为命名约定'xxx.osc.gz',文件从1上升。 '001'到'002'。

我只能找到帮助镜像或安排下载(osmosis或wget)的程序。我不需要每天的整个数据库,只是最新的文件。

任何建议或指向正确的方向将不胜感激。

+0

什么OS/shell你想要脚本? – radai

+0

我会使用Python 2.7 – user1961649

+2

由于文件名是零填充的,他们是否翻转(即999 - > 000)或扩大(999 - > 1000)? – thegrinner

回答

0

有一个包含最新变更集的YAML文件。保留最新下载的记录,然后在该范围内使用urlretrieve

import os, urllib, yaml 


os_url = "http://planet.openstreetmap.org/replication/" 
base_dir = "./" 

try: 
    with open('download.log', 'r') as f: 
     last_set = int(f.readlines()[-1].strip()) 
except: 
    last_set = int(raw_input("Enter latest set:")) 

stream = urllib.urlopen(os_url+"changesets/state.yaml") 
latest_set = yaml.load(stream)['sequence'] 


for seq in range(last_set+1,latest_set+1): 
    changeset_dir = "changesets/000/%03d/"%(seq/1000) 
    changeset_file = "%03d.osm.gz"%(seq%1000) 
    remote_file = os_url + changeset_dir + changeset_file 
    local_dir = base_dir + changeset_dir 
    local_file = local_dir + changeset_file 

    if not os.path.exists(local_dir): 
     os.makedirs(local_dir) 

    try: 
     with open(local_file) as f: pass 
     print "Already downloaded",seq 
    except: 
     urllib.urlretrieve(remote_file, local_file) 
     print "Downloaded changeset",seq 

print "Up-to-date" 


with open('download.log', 'a') as f: 
    f.write('%s\n'%latest_set) 
+0

像魅力一样工作,谢谢你! – user1961649