Python使用fileinput移除文本数字与小数点无输出且报错如何解决
问题描述
编写了如下代码用于移除文本文件中的数字和小数点:
import fileinput for line in fileinput.input("/content/drive/MyDrive/011186973309203002021041922243182.txt", inplace=True): #remove digits result = ''.join(i for i in line if not i.isdigit()) #remove . result = result.replace(".","") print(result)
代码运行后无任何返回,文件输出完全为空,无法定位问题。首次运行代码时触发两类报错:
UnicodeEncodeError: 'charmap' codec can't encode characters in position 45-49: character maps to
RuntimeError: input() already active
故障原因
- 编码不匹配触发
UnicodeEncodeError:fileinput的inplace模式默认调用系统默认编码读写文件,Windows环境下默认编码为GBK(对应报错里的charmap编码),当文件包含UTF-8编码的非ASCII字符(如中文、全角符号)时,写入环节会因为字符无法映射到GBK编码表报错,异常中断时inplace模式会直接清空目标文件内容,这就是最终输出为空的核心原因。 - 流冲突触发
RuntimeError:在Colab、Jupyter这类交互式运行环境中重复执行上述代码时,上一次运行开启的fileinput输入流没有被正常关闭,再次调用fileinput.input()就会检测到已有活跃输入流,抛出冲突错误。 - 额外逻辑问题:读取的每行内容本身自带末尾换行符,默认
print方法会额外追加一个换行,会导致处理后的文件出现大量多余空行。
修复方法
- 操作前先备份原文件,
inplace模式会直接修改源文件,备份可以避免内容丢失无法恢复。 - 调用
fileinput.input()时显式指定encoding='utf-8'参数,匹配文件实际编码,避免编码报错。 - 代码执行完成后主动调用
fileinput.close()关闭输入流,避免交互式环境下的流冲突问题。 - 若在交互式环境运行,触发
input() already active报错时,先重启运行内核释放占用的流,再执行修复后的代码。 - 给
print方法添加end=''参数,避免生成多余空行。
修复后的可运行代码如下:
import fileinput file_path = "/content/drive/MyDrive/011186973309203002021041922243182.txt" try: for line in fileinput.input(file_path, inplace=True, encoding='utf-8'): # 移除数字 result = ''.join(i for i in line if not i.isdigit()) # 移除小数点 result = result.replace(".", "") # 输出处理后的内容,inplace模式下会直接写回文件 print(result, end='') finally: fileinput.close()
内容的提问来源于stack exchange,提问作者user18165921
相关产品推荐
相关产品推荐

