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

looping through a textfile and adding certain strings to a dictionary

所以我有一个包含

的文件 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

这个returns{'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

其中 returns {'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

然而,这个returnsread_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) 实现它提供一些意见。非常感谢任何指示。

错误消息通常会告诉您问题出在哪里,一旦您习惯了它们,调试起来就会容易得多。

当它从文件中读取 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? 但您想检查它,而不仅仅是 "succeed" 将其转换为 int(0)