繁体   English   中英

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

[英]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

就像我想要的那样,这将返回{'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)进行一些输入。 任何方向都将不胜感激。

一旦您习惯了这些错误消息,通常就会告诉您问题出在哪里,这将使调试更加容易。

当它从文件中读取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:检查字符串是否表示int,而不使用Try / Except? 但是您要检查它,而不仅仅是将它转换为int(0)的“成功”方法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM