iru*_*var 7 python file-io encoding python-3.2
我正在尝试使用fileinput模块的就地过滤功能来就地重写输入文件。
需要将编码(用于读写)设置为latin-1并尝试传递openhook=fileinput.hook_encoded('latin-1')给它,fileinput.input但由于错误而受阻
ValueError: FileInput cannot use an opening hook in inplace mode
Run Code Online (Sandbox Code Playgroud)
仔细检查后,我发现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
Run Code Online (Sandbox Code Playgroud)
如果要更改输出文件,也可以选择为其指定新的编码;如果不希望更改,则可以选择latin-1在打开输出文件时将其保留。
我知道这不是您想要的就地修改,但是它将完成您尝试做的任务并且非常灵活。