码迷,mamicode.com
首页 > 数据库 > 详细

MonogoDB 练习一

时间:2017-12-08 12:17:16      阅读:269      评论:0      收藏:0      [点我收藏+]

标签:out   左右   comm   括号   val   new   host   first   出错   

1.解析文件,仅处理 FIELDS 字典中作为键的字段,并返回清理后的值字典列表

需求:

  1.根据 FIELDS 字典中的映射更改字典的键

  2.删掉“rdf-schema#label”中的小括号里的多余说明,例如“(spider)”

  3.如果“name”为“NULL”,或包含非字母数字字符,将其设为和“label”相同的值

  4.如果字段的值为“NULL”,将其转换为“None”

  5.如果“synonym”中存在值,应将其转换为数组(列表),方法是删掉“{}”字符,并根据“|” 拆分字符串。剩下的清理方式将由你自行决定,例如删除前缀“*”等。如果存在单数同义词,值应该依然是列表格式。    

  6.删掉所有字段前后的空格(如果有的话)

  7.输出结构应该如下所示

[ { label: Argiope,
    uri: http://dbpedia.org/resource/Argiope_(spider),
    description: The genus Argiope includes rather large and spectacular spiders that often ...,
    name: Argiope,
    synonym: ["One", "Two"],
    classification: {
                      family: Orb-weaver spider,
                      class: Arachnid,
                      phylum: Arthropod,
                      order: Spider,
                      kingdom: Animal,
                      genus: None
                      }
  },
  { label: ... , }, ...
]
import codecs
import csv
import json
import pprint
import re

DATAFILE = arachnid.csv
FIELDS ={rdf-schema#label: label,
         URI: uri,
         rdf-schema#comment: description,
         synonym: synonym,
         name: name,
         family_label: family,
         class_label: class,
         phylum_label: phylum,
         order_label: order,
         kingdom_label: kingdom,
         genus_label: genus}


def process_file(filename, fields):
  #获取FIELDS字典的keys列表
    process_fields = fields.keys()
#存放结果集 data
= [] with open(filename, "r") as f: reader = csv.DictReader(f)
     #跳过文件中的前3行
for i in range(3): l = reader.next()      #读文件 for line in reader: # YOUR CODE HERE
#存放总的字典
res = {}
#存放key是classification的子字典 res[
classification] = {}
#循环FIELDS字典的keys
for field in process_fields:
#获取excel中key所对应的val,条件1 tmp_val
= line[field].strip()
#生成json数据的新key,即是FIELDS字典的value new_key
= FIELDS[field]
#条件4
if tmp_val == NULL: tmp_val = None
#条件2
if field == rdf-schema#label: tmp_val = re.sub(r\(.*\),‘‘,tmp_val).strip()
#条件3
if field == name and line[field] == NULL: tmp_val = line[rdf-schema#label].strip()
#条件5
if field == synonym and tmp_val: tmp_val = parse_array(line[field])
#子字典中所包含的的key
if new_key in [kingdom,family,order,phylum,genus,class]:
#子字典中所包含的的key的value res[
classification][new_key] = tmp_val continue
#将新的key和val放入到res中,然后加入到列表中返回
res[new_key] = tmp_val data.append(res) return data def parse_array(v):
#解析数组
#如果以{开头和}结尾,删除左右的{},并以|进行分割,最后去除每一个项的空格,返回
if (v[0] == "{") and (v[-1] == "}"): v = v.lstrip("{") v = v.rstrip("}") v_array = v.split("|") v_array = [i.strip() for i in v_array] return v_array return [v]
def test():
#测试函数,如果不出错,结果正确 data
= process_file(DATAFILE, FIELDS) print "Your first entry:" pprint.pprint(data[0]) first_entry = { "synonym": None, "name": "Argiope", "classification": { "kingdom": "Animal", "family": "Orb-weaver spider", "order": "Spider", "phylum": "Arthropod", "genus": None, "class": "Arachnid" }, "uri": "http://dbpedia.org/resource/Argiope_(spider)", "label": "Argiope", "description": "The genus Argiope includes rather large and spectacular spiders that often have a strikingly coloured abdomen. These spiders are distributed throughout the world. Most countries in tropical or temperate climates host one or more species that are similar in appearance. The etymology of the name is from a Greek name meaning silver-faced." } assert len(data) == 76 assert data[0] == first_entry assert data[17]["name"] == "Ogdenia" assert data[48]["label"] == "Hydrachnidiae" assert data[14]["synonym"] == ["Cyrene Peckham & Peckham"] if __name__ == "__main__": test()

 

MonogoDB 练习一

标签:out   左右   comm   括号   val   new   host   first   出错   

原文地址:http://www.cnblogs.com/luhuajun/p/8004245.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!