您现在的位置是:主页 > news > 手机测评做视频网站/故事式软文范例500字

手机测评做视频网站/故事式软文范例500字

admin2025/4/28 16:29:41news

简介手机测评做视频网站,故事式软文范例500字,大连网站设计案例,无锡网站建设解决方案我试图使用fileinput模块的就地过滤功能来就地重写输入文件。需要将编码(用于读取和写入)设置为latin-1,并尝试将openhookfileinput.hook_encoded(latin-1)传递给fileinput.input,但由于错误而受阻ValueError: FileInput cannot use an opening hook in …

手机测评做视频网站,故事式软文范例500字,大连网站设计案例,无锡网站建设解决方案我试图使用fileinput模块的就地过滤功能来就地重写输入文件。需要将编码(用于读取和写入)设置为latin-1,并尝试将openhookfileinput.hook_encoded(latin-1)传递给fileinput.input,但由于错误而受阻ValueError: FileInput cannot use an opening hook in …

我试图使用fileinput模块的就地过滤功能来就地重写输入文件。

需要将编码(用于读取和写入)设置为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。

我知道这不是您想要的就地修改,但是它将完成您尝试做的任务并且非常灵活。

最近我不得不实现类似的东西,因为我无法获取fileinput来正确处理编码。只是想提一下,您对os.remove()的调用是多余的,并创建了一个竞争条件(该文件在短时间内不再存在)。如果仅调用os.rename(),它将自动用新文件替换原始文件,因此,任何其他尝试读取该文件的进程也不会因文件丢失而出错。

@robru我知道这很晚了,但是我再次偶然发现了这个答案。您的评论不准确。 os.rename的文档指出,如果目标名称存在,则将引发OSError(至少在Windows上)。因此,在重命名之前确实需要删除原始文件。而且我认为比赛条件的风险很小。无论如何,您已经在修改文件,因此,我认为可以放心使用该文件的其他进程已停止,或者有可能因就地修改而冒着损坏数据的风险。

我对使用rename / remove的现有解决方案并不感到疯狂,因为它们过分简化了inplace标志所做的某些文件处理-例如,处理文件模式,处理chmod属性等。

就我而言,因为我控制代码将在其中运行的环境,所以我决定唯一合理的解决方案是将我的语言环境设置为使用UTF8的语言环境:

export LC_ALL=en_US.UTF-8

效果是:

sh-4.2> python3.6 -c"import fileinput;

for line in fileinput.FileInput('DESCRIPTION', inplace=True): print(line.rstrip() + 'hi')

print('done')"

Traceback (most recent call last):

File"", line 2, in

File"/usr/lib64/python3.6/fileinput.py", line 250, in __next__

line = self._readline()

File"/usr/lib64/python3.6/fileinput.py", line 364, in _readline

return self._readline()

File"/usr/lib64/python3.6/encodings/ascii.py", line 26, in decode

return codecs.ascii_decode(input, self.errors)[0]

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 227: ordinal not in range(128)'

sh-4.2> export LC_ALL=en_US.UTF-8

sh-4.2> python3.6 -c"import fileinput;

for line in fileinput.FileInput('DESCRIPTION', inplace=True): print(line.rstrip() + 'hi')

print('done')"

done

sh-4.2#

潜在的副作用是对其他文件输入和输出的更改,但是我对此并不担心。

有趣的方法。我想您可能会通过内联来隐藏将LC_ALL更改为有问题的python流程的影响,见证LC_ALL=en_US.latin-1 python -c import locale; print locale.getdefaultlocale()

这与其他答案非常相似,只是以函数形式完成,因此可以轻松地多次调用它:

def inplace(orig_path, encoding='latin-1'):

"""Modify a file in-place, with a consistent encoding."""

new_path = orig_path + '.modified'

with codecs.open(orig_path, encoding=encoding) as orig:

with codecs.open(new_path, 'w', encoding=encoding) as new:

for line in orig:

yield line, new

os.rename(new_path, orig_path)

这是实际的样子:

for line, new in inplace(path):

line = do_processing(line)  # Use your imagination here.

new.write(line)

只要您指定正确的编码,这对于python2和python3都是有效的,并且对您的数据执行"正确的事情"(就我而言,实际上我到处都需要utf-8,但是您的需求显然有所不同)。

我喜欢。请注意,两个with语句可以组合