2017-11-13 1 views
0

그래서 나는 파일 morsecode.txt을TEXTFILE 통해 반복하고 사전에 특정 문자열을 추가

A2.-B4-...C4-.-.D3-..E1.F4..-.G3--.H4....I2..J4.---K3-.-L4.-..M2--N2-.O3---P4.--.Q4--.-R3.-.S3...T1- all the way to Z. 

그것이 무엇을하는 상태가 문자 "A"는이 개 문자를 가지고있다 ".-"로 포함되어있다 자사의 모스 상당, 나머지 텍스트 파일은 동일한 순서를 따릅니다. "B"는 4 개의 기호 "-..."등을 가지고 있습니다 ...

내가하고 싶은 일은 모스에 해당하는 알파벳 문자를 저장하는 모스 사전을 만드는 것입니다. 내가 지금까지 무엇을 가지고

는 :

morse_dict=dict() 
letter = 1 
number = 1 
with open('...morse.txt') as f: 
    read_letter = f.read(1) 
    code_length = f.read(1) 
    read_code = f.read(int(code_length)) 
    morse_dict[read_letter] = read_code 

이 I가 원하는대로 {'A': '.-'}을 반환합니다.

당신이 그것을 다시 실행하는 경우이 추가 문자 작동

, 즉 : {'A': '.-', 'B': '-...', 'C': '-.-.', 'D': '-..'}을 반환

with open('...morse.txt') as f: 
    read_letter = f.read(1) 
    code_length = f.read(1) 
    read_code = f.read(int(code_length)) 
    morse_dict[read_letter] = read_code 
    read_letter = f.read(1) 
    code_length = f.read(1) 
    read_code = f.read(int(code_length)) 
    morse_dict[read_letter] = read_code 
    read_letter = f.read(1) 
    code_length = f.read(1) 
    read_code = f.read(int(code_length)) 
    morse_dict[read_letter] = read_code 
    read_letter = f.read(1) 
    code_length = f.read(1) 
    read_code = f.read(int(code_length)) 
    morse_dict[read_letter] = read_code 

.

이제 문제가 생겼습니다 : 전체 텍스트 파일에서이 작업을 실행하는 루프를 만들고 싶습니다.

내가 무엇을 시도했다 :

with open('...morse.txt') as f: 
while True : 
    read_letter = f.read(letter) 
    code_length = f.read(number) 
    read_code = f.read(int(code_length)) 
    morse_dict[read_letter] = read_code 
    if read_letter == '': 
     break 

그러나,이 read_code = f.read(int(code_length)) ValueError: invalid literal for int() with base 10: ''

내가 루프와 메신저 같은 오류가 위해를 사용하여 시도 반환합니다. 내 마음 루프에서 는 다음과 같이 작동합니다 : 전체 프로그래밍

1)reads the letter with f.read(1) 
2)reads the number of symbols of the morse equivalent of the letter above with f.read(1) 
3) calls the integer given above with f.read(integer) and returns the morse equivalent of the letter 
4) stores the given letter with given morse equivalent in a dictionary 
5) reruns this entire loop above until it reaches the string '', then it breaks. 

임 아주 새로운 여전히 거기에 아마이 일을 더 나은 방법입니다,하지만 난 사용하여 구현하는 방법에 대한 몇 가지 입력처럼 매우 거라고 단계 1) -4). 모든 방향은 크게 감사드립니다.

답변

0

오류 메시지는 일반적으로 익숙해지면 문제가 무엇인지 알려주고 디버깅을 훨씬 쉽게 만듭니다.

파일에서 code_length를 읽으면 정수로 변환 할 수있는 문자열을 찾습니다. 그건 사실이 아니야. 따라서 빈 문자열이므로 code_length에 문제가 있습니다. 코드를 살펴보면 빈 문자열을 찾아서 파일 끝을 감지하는 것을 볼 수 있지만 정수로 변환하려고하면 끝납니다.

일반적으로 모든 IO 기능의 결과를 확인해야합니다. 또한 나쁜 "morse.txt"파일이있을 경우 오류를 예상하고 처리해야하며, 예외적으로 만들 수도 있습니다. 그러나이 경우에는 파일이 양호했으며 정상 종료 조건을 감지하기 위해 읽기를 확인하지 않았습니다.

morse_dict = {} 
letter = 1 
number = 1 

with open('morse.txt') as f: 
    while True : 
     read_letter = f.read(letter) 
     if read_letter == '': 
      # detect normal end of file, stop reading 
      break 

     # here is your bug. It can still crash on a bad data file if you don't check code_length here. 
     code_length = f.read(number) 
     read_code = f.read(int(code_length)) 
     morse_dict[read_letter] = read_code 

import pprint 
pprint.pprint(morse_dict) 

예외를 발생시키지 않고 문자열을 정수로 변환하는 데 많은 스택 오버 플로우 문제가 있습니다. Python: Check if a string represents an int, Without using Try/Except?하지만 확인하고 싶다면 int로 변환 할 때 "성공"하지 말고