Python ValueError: chr()参数不在范围内(256)。

3

我正在学习Python并重新制作一些旧项目。这个项目涉及从命令行中获取一个字典和要翻译的消息,并将消息翻译成另一种语言。(例如:“btw,hello how r u”将被翻译为“by the way,hello how are you”)。

我们使用教授提供的扫描器来读取标记和字符串。如果需要,我也可以在这里发布它。这是我的错误:

Nathans-Air-4:py1 Nathan$ python translate.py test.xlt test.msg
Traceback (most recent call last):
  File "translate.py", line 26, in <module>
    main()
  File "translate.py", line 13, in main
    dictionary,count = makeDictionary(commandDict)
  File "/Users/Nathan/cs150/extra/py1/support.py", line 12, in makeDictionary
    string = s.readstring()
  File "/Users/Nathan/cs150/extra/py1/scanner.py", line 105, in readstring
    return self._getString()
  File "/Users/Nathan/cs150/extra/py1/scanner.py", line 251, in _getString
    if (delimiter == chr(0x2018)):
ValueError: chr() arg not in range(256)

这是我的主要translate.py文件:
from support import *
from scanner import *
import sys

def main():
    arguments = len(sys.argv)
    if arguments != 3:
        print'Need two arguments!\n'
        exit(1)
    commandDict = sys.argv[1]
    commandMessage = sys.argv[2]

    dictionary,count = makeDictionary(commandDict)

    message,messageCount = makeMessage(commandMessage)

    print(dictionary)
    print(message)

    i = 0
    while count < messageCount:
        translation = translate(message[i],dictionary,messageCount)
        print(translation)
        count = count + 1
        i = i +1
    main()

这是我正在使用的support.py文件...

from scanner import *

def makeDictionary(filename):
    fp = open(filename,"r")

    s = Scanner(filename)
    lyst = []
    token = s.readtoken()
    count = 0
    while (token != ""):
        lyst.append(token)
        string = s.readstring()
        count = count+1
        lyst.append(string)
        token = s.readtoken()
    return lyst,count

def translate(word,dictionary,count):
    i = 0
    while i != count:
        if word == dictionary[i]:
            return dictionary[i+1]
            i = i+1
        else:
            return word
            i = i+1
    return 0

def makeMessage(filename):
    fp = open(filename,"r")

    s = Scanner(filename)
    lyst2 = []
    string = s.readtoken()
    count = 0
    while (string != ""):
        lyst2.append(string)
        string = s.readtoken()
        count = count +  1
    return lyst2,count

有人知道这里发生了什么吗?我已经查了好几遍了,不知道为什么readString会报错...可能是我漏掉的一些愚蠢的东西。


你期望 chr(0x2018) 表示哪个字符? - Karl Knechtel
错误信息清楚地显示问题出现在 scanner.py 中。那是你的教授写的代码吗?你使用的 Python 版本是什么?你的教授告诉你要使用哪个版本的 Python? - Karl Knechtel
2个回答

9

如果您使用Python 3,chr(0x2018)将起作用。

如果您使用Python 2运行编写给Python 3的代码,chr将会返回ASCII范围内的一个字符。这是一个8位字符串,因此chr的最大参数值为255。 在Python 3中,您将获得一个Unicode字符,Unicode代码点可以高达更高的值。


请问,有没有不安装Python 3就能解决这个问题的方法? - MEdwin
在Python 2中,您可以使用unichr,但请考虑转向Python 3。 Python 2已经到达了生命周期的尽头。 - Matthias

6
问题在于,您使用chr转换的字符不在接受范围内(range(256))。 十进制中的值0x2018为8216。
请查看unichr,还可以参考chr

但是它正在读取的文件格式是缩写 "定义" 缩写 "定义" 等等......偶数索引值始终是字符串。为什么像这样的东西限制为256?也许扫描器出错了? - user4330943
与您的文件内容无关。限制为255(range不包括高端点),因为这是chr的定义方式。如果您阅读文档,这一点是很清楚的。 - Karl Knechtel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接