0

格式化数据的最佳方法是什么?

这是背景:

我正在使用nameparser以尽可能好的方式解析名称。我构建了一个调用名称解析器的包装器,然后将解析后的名称存储在数据库(MySQL)中。

在这种情况下,最有效的方法是什么?以下是我的方法。

  1. 第一步:调用nameparser(提供tablename、id、name、first、middle、last、suffix)。
  2. 第 2 步:将解析(返回)的名称存储在内存中这种形式的字典中(我正在解析相对较小的名称集 - 例如 20,000 个名称)。{id:{'first':'John', 'middle':'V', 'last':'Doe', 'suffix':''}
  3. 第 3 步:用一个查询将字典存储在 MySQL 表中?(不确定是否可以使用步骤 2 中描述的数据结构。

这是我的代码:

#!/usr/bin/python
# -*- coding: utf-8 -*-

from nameparser import HumanName

import time

cursor = db.cursor()


def name(table, id, name, first, middle, last, suffix):

    cursor.execute('SELECT `' + id + '`,`' + name + '` FROM `' + table
                   + '` WHERE `' + name + '` IS NOT NULL AND ' + id
                   + ' IS NOT NULL')

    numrows = int(cursor.rowcount)
    namelist = []
    namelist = cursor.fetchall()

    for record in namelist:
        parsed = HumanName(record[1])
        parsed.capitalize()
        mydict[int(record[0])] = {
            'first': str(parsed.first),
            'middle': str(parsed.middle),
            'last': str(parsed.last),
            'suffix': str(parsed.suffix),
            }   

mydict = {}

starttime = time.time()

split = name('NamesToParse','id','name','first','middle','last','suffix')
print mydict
print time.time() - starttime

请建议将数据存储在 MySQL 表中的最佳方式。这是我到目前为止所拥有的,我仍然需要遍历每条记录。我想知道是否有一种方法可以update使用现有表,而不必先创建一个临时表,然后一次性更新原始表?希望我说得通。

for id, val in mydict.items():

    sorted_keys = sorted(map(str, val.keys()))
    sorted_vals = map(encoding, [val[mydict] for mydict in sorted_keys])  # sorted by keys
    formatted = ', '.join(["'%s'"] * len(sorted_vals))
    db.execute("""insert into NamesToParseOut(%s) values (%s)""" % (', '.join(sorted_keys), formatted), sorted_vals)
4

1 回答 1

0

看起来我将采用元组列表方法并首先插入临时表,然后用原始表更新它们。节省的时间是惊人的。我觉得字典对于这项任务来说太过分了。

mylistoftuples.append((int(record[0]), str(parsed.first),str(parsed.middle),str(parsed.last),str(parsed.suffix)))

cursor.executemany("""insert into NamesToParseOut(id, first, middle, last, suffix) values (%s, %s, %s, %s, %s)""", mylistoftuples)
于 2012-08-23T18:45:40.090 回答