在文件输入模块中结合就地过滤和编码设置

 83984246_42dbe6 发布于 2022-12-29 11:01

我正在尝试使用fileinput模块的就地过滤功能来就地重写输入文件。

需要将编码(用于读写)设置为latin-1并尝试传递openhook=fileinput.hook_encoded('latin-1')给它,fileinput.input但由于错误而受阻

ValueError: FileInput cannot use an opening hook in inplace mode

仔细检查后,我发现fileinput文档中明确说明了这一点:不能同时使用就位和openhook

我该如何解决?

1 个回答
  • 据我所知,fileinput模块无法解决此问题。您可以使用组合完成同样的任务codecs模块,os.rename()以及os.remove()

    import os
    import codecs
    
    input_name = 'some_file.txt'
    tmp_name = 'tmp.txt'
    
    with codecs.open(input_name, 'r', encoding='latin-1') as fi, \
         codecs.open(tmp_name, 'w', encoding='latin-1') as fo:
    
        for line in fi:
            new_line = do_processing(line) # do your line processing here
            fo.write(new_line)
    
    os.remove(input_name) # remove original
    os.rename(tmp_name, input_name) # rename temp to original name
    

    如果要更改输出文件,也可以选择为其指定新的编码;如果不希望更改,则可以选择latin-1在打开输出文件时将其保留。

    我知道这不是您想要的就地修改,但是它将完成您尝试做的任务并且非常灵活。

    2022-12-29 11:02 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有