我正在尝试使用 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/