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
相关产品推荐
相关产品推荐

