python - 在 fileinput 模块中结合就地过滤和编码设置

标签 python file-io encoding python-3.2

我正在尝试使用 fileinput 模块的 inplace filtering feature就地重写输入文件。

需要将编码(读取和写入)设置为 latin-1 并尝试将 openhook=fileinput.hook_encoded('latin-1') 传递给 fileinput.input 但因错误而受阻

ValueError: FileInput cannot use an opening hook in inplace mode

经过仔细检查,我发现 fileinput 文档清楚地说明了这一点:您不能同时使用 inplace 和 openhook

我该如何解决这个问题?

最佳答案

据我所知,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它改变。

我知道这不是您正在寻找的就地修改,但它会完成您尝试执行的任务并且非常灵活。

关于python - 在 fileinput 模块中结合就地过滤和编码设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25203040/

相关文章:

java - URI 中的非法字符

C# HttpListener 响应 + GZipStream

python - python 中两个键与一个键具有相同的值

Python 2 枚举示例

python - 如何在一维数组中找到槽

asp.net-mvc - MVC Controller.File 返回空白 pdf

python - 在 Python 中使用变量导入模块

C++ 浮点截断和设置精度逻辑错误

java - 我需要将正则表达式的所有匹配项包含到一个文本文件中;我是java编程新手

ios - 在 QLPreviewController 中使用元音符号查看 UTF-8 编码的 CSV 文件时出现问题