我正在尝试使用fileinput
模块的就地过滤功能来就地重写输入文件。
需要将编码(用于读写)设置为latin-1
并尝试传递openhook=fileinput.hook_encoded('latin-1')
给它,fileinput.input
但由于错误而受阻
ValueError: FileInput cannot use an opening hook in inplace mode
仔细检查后,我发现fileinput
文档中明确说明了这一点:不能同时使用就位和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
在打开输出文件时将其保留。
我知道这不是您想要的就地修改,但是它将完成您尝试做的任务并且非常灵活。