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

Avoid manually decoding many strings in code

我在 Python 工作。因为我必须经常输入 .decode('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 -*- 否则会引发错误。

我是西班牙程序员,我们遇到了一些特殊字符的问题。 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 字符创建,一旦你习惯了到处使用它会节省你很多时间.

python 中的词典基本上是一个实现 few methods 的 class,可能对您很重要:

你基本上只是希望他们将每个键编码为字节,如果它还没有的话,例如像这样:

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