我试图使用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()
和{如果要更改输出文件,还可以选择为输出文件指定新的编码;如果不希望更改输出文件,则可以在打开输出文件时将其保留为
latin-1
。在我知道这不是你想要的就地修改,但它可以完成你试图完成的任务,而且非常灵活。在
我不喜欢使用
rename
/remove
的现有解决方案,因为它们过度简化了inplace
标志所做的一些文件处理,例如处理文件模式、处理chmod
属性等在我的例子中,因为我控制代码要运行的环境,所以我决定唯一合理的解决方案是使用locale将我的语言环境设置为UTF8:
其效果是:
^{pr2}$潜在的副作用是对其他文件输入和输出的更改,但我不担心这一点。在
这与另一个答案非常相似,只是以函数形式完成,因此可以轻松调用多次:
这就是它在行动中的样子:
^{pr2}$这对python2和python3都是有效的,只要指定正确的编码(在我的例子中,我实际上需要
utf-8
无处不在,但您的需求明显不同)。在相关问题 更多 >
编程相关推荐