TypeError:ord()需要一个字符,但是找到了长度为2的字符串

时间:2019-05-08 04:21:03

标签: python python-3.x

我遇到了一个尴尬的问题。

TypeError: ord() expected a character, but string of length 2 found

我的代码:

    for c in input_s:
        if ord('a') <= ord(c.lower()) <= ord('z'):
            e_count += 1

我希望输入for c in input_sstring始终为c的字符。这种情况很少发生,因此很难重现。 c变量是否有length2字符串?

2 个答案:

答案 0 :(得分:4)

即使c是一个代码点,c.lower()也可能是多个。例如,对于U + 0130上方带有点的拉丁字母大写字母I,将其小写为常规i,后跟U + 0307上方的组合点:

>>> x = '\u0130'
>>> len(x)
1
>>> len(x.lower())
2

c.upper()也会发生同样的情况。 eszett

是一个特别著名的案例。
>>> x = 'ß'
>>> x.upper()
'SS'
>>> len(x)
1
>>> len(x.upper())
2

您的ord(c.lower())通话从根本上来说是不正确的。如果要测试字符是大写还是小写ASCII字母,可以使用isascii来测试字符是否在0-127 ASCII范围内,并使用isalpha来测试它是否是字母字符。您还可以使用这些方法一次测试整个字符串。例如,

if input_s.isascii() and input_s.isalpha():
    ...

将测试input_s是否为仅包含ASCII字母字符的非空字符串。 (“非空”部分是因为isalpha对于空字符串返回False。)

isascii是非常新的东西,在Python 3.7中引入。如果必须支持较旧的Python版本,则可以使用'\x00' <= c <= '\x7f'0 <= ord(c) <= 127测试单个字符的ASCII样式,也可以硬编码ASCII字母范围的字符并使用ASCII字母的样式测试字符'A' <= c <= 'Z' or 'a' <= c <= 'z'

答案 1 :(得分:0)

您可能正在使用元组(或任何序列)作为input_s。 如果序列中的第一个元素是长度为2的字符串,则会得到相同的错误。 如果是这种情况,则使用字符串(或拆分序列),代码应该可以正常工作。