You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python写入文件问题:摩尔斯码转换程序输出文件为空

摩尔斯码转换程序输出文件为空的问题修复

问题描述

编写程序读取输入文件内容,转换为摩尔斯码后写入encoded.txt,但输出文件始终为空,即使简化代码仅写入固定字符串"apple"也无效。原代码如下:

filenamer = input('Input the file you want to translate to morse code: ')

fileopenr = open(filenamer, 'r')

fileopenw = open('encoded.txt', 'w')

def convert_to_morse_code(letter):
    # Convert a single letter to Morse code.
    if letter == 'A':
        return '.-'
    elif letter == 'B':
        return '-...'
    elif letter == 'C':
        return '-.-.'
    elif letter == 'D':
        return '-..'
    elif letter == 'E':
        return '.'
    elif letter == 'F':
        return '..-.'
    elif letter == 'G':
        return '--.'
    elif letter == 'H':
        return '....'
    elif letter == 'I':
        return '..'
    elif letter == 'J':
        return '.---'
    elif letter == 'K':
        return '-.-'
    elif letter == 'L':
        return '.-..'
    elif letter == 'M':
        return '--'
    elif letter == 'N':
        return '-.'
    elif letter == 'O':
        return '---'
    elif letter == 'P':
        return '.--.'
    elif letter == 'Q':
        return '--.-'
    elif letter == 'R':
        return '.-.'
    elif letter == 'S':
        return '...'
    elif letter == 'T':
        return '-'
    elif letter == 'U':
        return '..-'
    elif letter == 'V':
        return '...-'
    elif letter == 'W':
        return '.--'
    elif letter == 'X':
        return '-..-'
    elif letter == 'Y':
        return '-.--'
    elif letter == 'Z':
        return '--..'
    else:
        return ''

list1 = []

def encode_word():
    print(fileopenr)
    for line in fileopenr:
        for word in line.split():
            word = word.upper()
            for letter in word:
                lists = list(letter)
                for letters in lists:
                    list1.append(convert_to_morse_code(letters))
                    
encode_word()

print(list1)

fileopenw.writelines(list1)

简化测试代码同样无效:

fileopenw.write("apple")

核心原因

Python的文件操作采用缓冲区机制,写入内容会先暂存到内存缓冲区,不会立刻同步到磁盘。如果没有主动关闭文件、调用flush()刷新缓冲区,或使用上下文管理器自动处理,程序结束时缓冲区内容可能未写入磁盘,导致文件为空。

另外原代码存在冗余逻辑:将单个letter转为列表再循环遍历完全没必要,直接传入letter调用转换函数即可。

修复方案

方案1:使用上下文管理器(推荐)

用with语句打开文件,代码块结束时会自动关闭文件,确保缓冲区内容写入磁盘:

def convert_to_morse_code(letter):
    morse_map = {
        'A': '.-', 'B': '-...', 'C': '-.-.', 'D': '-..', 'E': '.',
        'F': '..-.', 'G': '--.', 'H': '....', 'I': '..', 'J': '.---',
        'K': '-.-', 'L': '.-..', 'M': '--', 'N': '-.', 'O': '---',
        'P': '.--.', 'Q': '--.-', 'R': '.-.', 'S': '...', 'T': '-',
        'U': '..-', 'V': '...-', 'W': '.--', 'X': '-..-', 'Y': '-.--',
        'Z': '--..'
    }
    return morse_map.get(letter.upper(), '')

filenamer = input('Input the file you want to translate to morse code: ')

# 使用with管理文件,自动关闭
with open(filenamer, 'r') as fileopenr, open('encoded.txt', 'w') as fileopenw:
    morse_content = []
    for line in fileopenr:
        for word in line.split():
            for letter in word:
                morse_code = convert_to_morse_code(letter)
                if morse_code:
                    morse_content.append(morse_code + ' ')  # 字母间加空格分隔
            morse_content.append(' / ')  # 单词间加斜杠分隔
        morse_content.append('\n')  # 行尾加换行
    
    # 将列表转为字符串写入,提升可读性
    fileopenw.write(''.join(morse_content))

方案2:手动关闭文件

如果坚持直接打开文件,必须在写入后调用close()触发缓冲区写入:

# ... 原代码其他部分 ...
fileopenw.writelines(list1)
fileopenw.close()  # 手动关闭输出文件
fileopenr.close()  # 手动关闭输入文件

额外优化点

  • 用字典替换冗长的if-elif链,转换逻辑更简洁易维护
  • 给摩尔斯码字母间加空格、单词间加斜杠,提升输出可读性
  • 转换函数内统一处理大小写,避免外部重复转大写操作

内容的提问来源于stack exchange,提问作者JefferyTheTurtle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 09:05:28