Python使用stdout和fileinput写入文件

syn*_*tik 6 python file-io

我有以下代码,它通过进行正则表达式替换来修改文件test.tex的每一行.

import re
import fileinput

regex=re.compile(r'^([^&]*)(&)([^&]*)(&)([^&]*)')

for line in fileinput.input('test.tex',inplace=1):
    print regex.sub(r'\3\2\1\4\5',line),
Run Code Online (Sandbox Code Playgroud)

唯一的问题是我只希望替换应用于文件中的某些行,并且无法定义模式来选择正确的行.所以,我想显示每一行并在命令行提示用户,询问是否在当前行进行替换.如果用户输入"y",则进行替换.如果用户只是输入任何内容,则不进行替换.

当然,问题是通过使用代码inplace=1我已经有效地将stdout重定向到打开的文件.因此,无法将输出(例如,询问是否进行替换)显示到未发送到文件的命令行.

有任何想法吗?

小智 4

文件输入模块实际上是用于处理多个输入文件的。\n您可以使用常规的 open() 函数来代替。

\n\n

像这样的东西应该有效。

\n\n

通过读取文件然后使用seek()重置指针,我们可以覆盖文件而不是追加到末尾,从而就地编辑文件

\n\n
import re\n\nregex = re.compile(r\'^([^&]*)(&)([^&]*)(&)([^&]*)\')\n\nwith open(\'test.tex\', \'r+\') as f:\n    old = f.readlines() # Pull the file contents to a list\n    f.seek(0) #\xc2\xa0Jump to start, so we overwrite instead of appending\n    for line in old:\n        s = raw_input(line)\n        if s == \'y\':\n            f.write(regex.sub(r\'\\3\\2\\1\\4\\5\',line))\n        else:\n            f.write(line)\n
Run Code Online (Sandbox Code Playgroud)\n\n

http://docs.python.org/tutorial/inputoutput.html

\n

  • 当然,如果您有一个巨大的文件太大而无法加载到内存中,那么您可以一次读取一行,然后写入临时文件。 (2认同)