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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 22:24:11