2014-12-06 1 views
0

그래서 저는 파이썬을 배우고 오래된 프로젝트를 다시하고 있습니다. 이 프로젝트는 명령 줄에서 번역 할 메시지와 사전을 가져 와서 메시지를 번역하는 작업입니다. (예 : "btw, hello how ru"는 "안녕하세요 어떻게 지내십니까?"Python ValueError : chr() arg가 범위를 벗어남 (256)

Google은 교수가 제공 한 스캐너를 사용하여 토큰과 문자열을 읽습니다. 필요한 경우 . 너무 여기에 게시 Heres는 내 오류 :

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) 

는 Heres는 내 주요 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이이 오류를 던지고 있는지 모르겠다 ... 그게 아마도 어리석은 내가 놓친 ...

+0

정확하게 'chr (0x2018)'이 (가) 나타낼 것으로 예상되는 문자는 무엇입니까? –

+0

오류 메시지는 'scanner.py'에 문제가 있음을 명확하게 보여줍니다. 교수님이 작성한 코드입니까? 어떤 버전의 파이썬을 사용하고 있습니까? 교수님이 사용할 파이썬 버전은 무엇입니까? –

답변

4

chr(0x2018)는 작동하지만 당신은 당신에게 ASCII 범위에서 하나의 문자열을 줄 것이다 파이썬 2 chr에서 파이썬 2와 함께 실행합니다. 이것은 8 비트 문자열이므로 chr의 최대 매개 변수 값은 255입니다. 파이썬 3에서는 유니 코드 문자를 얻고 유니 코드 코드 포인트는 훨씬 더 높은 값으로 올라갈 수 있습니다.

4

문제는 chr을 사용하여 변환하는 문자가 허용 된 범위 내에 있지 않다는 것입니다. range(256)). 십진수의 값 0x2018은 8216입니다.

unichr을 확인하고 chr도 확인하십시오. 당신이

파이썬 3. 당신은 파이썬 3 쓰여 코드가있는 경우

+0

그러나 읽는 파일의 형식은 약어 "정의"약어 "정의"등입니다 ... 짝수 색인 값은 항상 문자열입니다. 왜 이렇게 한계가 256일까요? 어쩌면 스캐너가 틀렸을까요? –

+0

파일 내용과 아무 관련이 없습니다. 한계는 255이고 ('range'는 높은 끝점을 포함하지 않습니다.) 이것이'chr' 정의 방법이기 때문에 한계입니다. 이 문서를 읽으면 분명합니다. –