Python设置变量,字符串变为unicode

时间:2015-02-20 19:49:57

标签: python json unicode

我试图迭代一些json并将密钥添加到数据库中。我有一个返回字符串的函数。当我将该字符串分配给变量时,该变量将打印一个unicode字符串。为什么呢?

json_obj = json.loads(data)
for resource in json_obj:

    # returns a string
    san_resource = self.sanitize_resource(resource)

    fresource = FertilityResource.objects.get_or_create(
        title = san_resource['Resource Name'],
    )

    print(fresource[0].title, san_resource['Resource Name'])

def sanitize_resource(self, *args):
    ''' return resource values as string or blank string '''
    resource = {}
    for key, value in args[0].iteritems():
        resource[key] = str(value).strip() if value != 'None' else ''
    return resource

所以我将san_resource['Resource Name']分配给fresource[0].title字符串,当我打印它时,它有时 unicode。上述print语句的示例输出:

('Atrium Family YMCA', 'Atrium Family YMCA')
('Auburn Valley YMCA', 'Auburn Valley YMCA')
(u'Shop Well With You', 'Shop Well With You')
(u'Look Good Feel Better', 'Look Good Feel Better')
('Abba Wig Salon', 'Abba Wig Salon')

如您所见,san_resource['Resource Name']始终是一个字符串,fresource[0].title是一个字符串,但有时是unicode。为什么是这样?我该如何解决?

1 个答案:

答案 0 :(得分:1)

  

当我将该字符串分配给变量时,该变量会输出一个unicode字符串

将该字符串传递给函数get_or_create()

fresource = FertilityResource.objects.get_or_create(
    title = san_resource['Resource Name'],
)

如果数据库中存在FertilityResource且主键与此匹配(可能是title),则会从数据库返回现有的FertilityResource。在这种情况下,title将是一个Unicode字符串,因为所有Django ORM CharField属性都是本地unicode

另一方面,如果你没有db中的现有实例,Django会创建一个具有你给它的确切值的新实例。在将实例放入数据库后,它不会从数据库中取回实例,因此您可以使用未触及的str

resource[key] = str(value).strip() if value != 'None' else ''

这是为了什么?对于value中的非ASCII字符,它将失败。您应该尝试将所有字符串保留为unicode形式,这是使用文本的常规方式,以及JSON字符串和Django字符字段的本机类型。也许你想要这样的东西:

# Convert non-string types to strings
if not isinstance(value, basestring):
    value = unicode(value, 'utf-8', 'replace')
# Ignore special null value
if value == u'None':
    value = u''
resource[key] = value.strip()