我有以下代码,它通过进行正则表达式替换来修改文件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\nimport 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)\nRun Code Online (Sandbox Code Playgroud)\n\nhttp://docs.python.org/tutorial/inputoutput.html
\n