避免在代码中手动解码许多字符串

时间:2015-05-13 09:38:28

标签: python string encoding utf-8 refactoring

我在Python工作。由于我必须经常放置.decode('utf-8'),所以我想自动解码它。

  • 有没有办法让所有字符串自动从utf-8解码?

第二个问题:

  • 有缺点吗?

PS:我必须解码特别是字符串,其中变音符出现像'Čečensko'

以下是示例:

result={}
if 'Ulice: ' in spans.keys():
    result['ulica']=spans['Ulice: ']
else:
    result['ulica']=''
if 'Kontaktní osoba: '.decode('utf-8') in spans.keys():
    result['kontaktna osoba']=spans['Kontaktní osoba: '.decode('utf-8')]
else:
    result['kontaktna osoba']=''
if 'Město: '.decode('utf-8') in spans.keys():
    result['mesto']=spans['Město: '.decode('utf-8')]
else:
    result['mesto']=''
if 'PSČ: '.decode('utf-8') in spans.keys():
    result['psc']=spans['PSČ: '.decode('utf-8')]
else:
    result['psc']=''
if 'Telefon: ' in spans.keys():
    result['telefon']=spans['Telefon: ']
else:
    result['telefon']=''

在文件的顶部,我必须# -*- coding: utf-8 -*-否则会引发错误。

2 个答案:

答案 0 :(得分:3)

我是西班牙语程序员,我们遇到一些特殊字符的问题。 python中对我来说最棒的是使用:

Python: Unicode

您可以尝试:

myString = u'Čečensko'  # Check the u before the string

通过使用unicode,您可以避免每次编码和解码,只需在任何字符串之前添加u,如上例所示。

如果您将所有字符串作为unicode字符管理,我确保您可以避免很多麻烦!

您的代码可能是:

result={}
if u'Ulice: ' in spans.keys():
    result[u'ulica']=spans[u'Ulice: ']
else:
    result[u'ulica']=''
if u'Kontaktní osoba: ' in spans.keys():
    result[u'kontaktna osoba']=spans[u'Kontaktní osoba: ']
else:
    result[u'kontaktna osoba']=''
if u'Město: ' in spans.keys():
    result[u'mesto']=spans[u'Město: ']
else:
    result[u'mesto']=''
if u'PSČ: ' in spans.keys():
    result[u'psc']=spans[u'PSČ: ']
else:
    result[u'psc']=''
if u'Telefon: ' in spans.keys():
    result[u'telefon']=spans[u'Telefon: ']
else:
    result[u'telefon']=''

但是你需要在任何地方使用unicode字符串,你在这个函数中使用的字典的键也应该使用unicode字符创建,一旦你习惯了它在任何地方使用它,它会节省你很多时间。 / p>

答案 1 :(得分:1)

python中的字典基本上是一个实现few methods的类,对你来说很重要:

你基本上只是希望他们将每个键编码为字节(如果还没有),例如:

if isinstance(key, str):
    return key.encode('utf-8')
return key

所以你可以简单地将默认字典包装到你自己的字典中:

class SDict(dict):
    @staticmethod
    def prepare_key(key):
        if isinstance(key, str):
            return key.encode('utf-8')
        return key

    def __contains__(self, key):
        return super().__contains__(self.prepare_key(key))

    def __getitem__(self, key):
        return super().__getitem__(self.prepare_key(key))

    def __setitem__(self, key, value):
        return super().__getitem__(self.prepare_key(key), value)

    def __delitem__(self, key):
        return super().__delitem__(self.prepare_key(key))

您可以从常见的dict对象初始化它:

>>> d1 = {b'a': 1, b'b': 2}
>>> d2 = SDict(d1)
>>> d2
{b'a': 1, b'b': 2}

in运算符正常运行:

>>> 'a' in d1
False
>>> 'a' in d2
True
>>> 'c' in d2
False
>>> 'c' in d1
False

项目选择也是有效的:

>>> d1['a']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'a'
>>> d1[b'a']
1
>>> d2[b'a']
1
>>> d2['a']
1