循环遍历文本文件并将某些字符串添加到字典

时间:2017-11-13 15:21:04

标签: python file loops dictionary morse-code

所以我有一个包含

的文件morsecode.txt
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"有2个符号" .-"作为莫尔斯的等价物, 文本文件的其余部分遵循相同的顺序。 " 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

这会像我想要的那样返回{'A': '.-'}

如果你重新运行它,这适用于附加字母,即:

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

返回{'A': '.-', 'B': '-...', 'C': '-.-.', 'D': '-..'}

现在出现问题:我想创建一个在整个文本文件中运行它的循环。

我尝试了什么:

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: ''

我尝试使用for循环,我得到了同样的错误。 在我看来,循环的工作原理如下:

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)实现它的一些输入。任何指示都非常感谢。

1 个答案:

答案 0 :(得分: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(0)