使用API删除Socrata中的数据集附件

2024-04-25 06:19:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个python脚本,它将: 1) 从企业数据库中提取GIS元数据 2) 将元数据从XML解析为纯文本 3) 将文本文件附加到索克拉塔相应的已发布数据集(每月发布一次) 4) 该脚本还将每月运行一次,以便企业数据集中的任何模式更改都反映在Socrata上附带的纯文本元数据文件中。你知道吗

我已经能够使用一些代码here成功地将文本元数据文件附加到已发布的Socrata数据集。问题是,每次运行脚本时,都会添加一个附加附件。我想删除现有附件并添加新附件,或者用新附件的内容覆盖现有附件。你知道吗

我对此做了大量的研究,似乎找不到任何使用socrataapi管理附件的文档。有什么建议吗?你知道吗


Tags: 数据代码文本脚本数据库附件here数据文件
2条回答

我最终想出了这个办法。必须更改几行以清空Socrata Python库中attach\u file函数中的附件:

def attach_file(self, filename):
    metadata = self.metadata()
    if not metadata.has_key('attachments'):
        metadata['attachments'] = []

收件人:

def attach_file(self, filename):
    metadata = self.metadata()
    metadata['attachments'] = []    #empty out metadata, regardless of existing metadata

最终使用相同的API,并能够使用以下代码替换附件:

def attach_file(self, filename, clear_metadata):
    metadata = self.metadata()
    if not metadata.has_key('attachments'):
        metadata['attachments'] = []
    # if the user wants to clear all existing attachments on dataset
    if clear_metadata:
        metadata['attachments'] = []
    response = self.multipart_post('/assets', filename)
    if not response.has_key('id'):
        print "Error uploading file to assets service: no ID returned: %s" % response
        return
    attachment = {'blobId': response['id'],
        'name': response['nameForOutput'],
        'filename': response['nameForOutput']}
    metadata['attachments'].append(attachment)
    self._request("/views/%s.json" % self.id, 'PUT', {'metadata':metadata})

def multipart_post(self, url, filename, field='file'):
    print("Running multipart_post")
    authBase64 = base64.encodestring('%s:%s' % (self.username, self.password)).replace('\n', '')

    datagen, headers       = multipart_encode({field: open(filename, "rb")})
    headers['X-App-Token'] = self.app_token
    headers['Authorization'] = "Basic %s" % authBase64
    print("url=" + url)
    request = Request("%s%s" % (self.url, url), datagen, headers)
    print(str(Request))
    response = urlopen(request).read()
    return json.loads(response)

相关问题 更多 >