Python使用标准输出和fileinput写入文件
我有以下代码,它通过进行正则表达式替换来修改test.tex文件的每一行Python使用标准输出和fileinput写入文件,python,file-io,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), 唯一的问题是,我只希望替换应用于文件中的某
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),
唯一的问题是,我只希望替换应用于文件中的某些行,而无法定义模式来选择正确的行。因此,我想显示每一行并在命令行提示用户,询问是否在当前行进行替换。如果用户输入“y”,则进行替换。如果用户只是不输入任何内容,则不会进行替换
当然,问题是通过使用codeinplace=1
我有效地将stdout重定向到打开的文件。因此,无法向未发送到文件的命令行显示输出(例如询问是否进行替换)
有什么想法吗?文件输入模块实际上用于处理多个输入文件。 您可以改用常规的open()函数 这样的办法应该行得通 通过读取该文件,然后使用seek()重置指针,我们可以覆盖该文件,而不是附加到末尾,从而就地编辑该文件
import re
regex = re.compile(r'^([^&]*)(&)([^&]*)(&)([^&]*)')
with open('test.tex', 'r+') as f:
old = f.readlines() # Pull the file contents to a list
f.seek(0) # Jump to start, so we overwrite instead of appending
for line in old:
s = raw_input(line)
if s == 'y':
f.write(regex.sub(r'\3\2\1\4\5',line))
else:
f.write(line)
基于每个人提供的帮助,以下是我最终得到的帮助:
#!/usr/bin/python
import re
import sys
import os
# regular expression
regex = re.compile(r'^([^&]*)(&)([^&]*)(&)([^&]*)')
# name of input and output files
if len(sys.argv)==1:
print 'No file specified. Exiting.'
sys.exit()
ifilename = sys.argv[1]
ofilename = ifilename+'.MODIFIED'
# read input file
ifile = open(ifilename)
lines = ifile.readlines()
ofile = open(ofilename,'w')
# prompt to make substitutions wherever a regex match occurs
for line in lines:
match = regex.search(line)
if match is not None:
print ''
print '***CANDIDATE FOR SUBSTITUTION***'
print '--: '+line,
print '++: '+regex.sub(r'\3\2\1\4\5',line),
print '********************************'
input = raw_input('Make subsitution (enter y for yes)? ')
if input == 'y':
ofile.write(regex.sub(r'\3\2\1\4\5',line))
else:
ofile.write(line)
else:
ofile.write(line)
# replace original file with modified file
os.remove(ifilename)
os.rename(ofilename, ifilename)
非常感谢
fileinput
不是此作业的正确工具。只需使用标准的读修改写pattern@EliBendersky你能给我举一个例子来说明你所说的吗?对不起,我是Python的新手,有什么想法吗?是 啊不要就地使用fileinput。对文件执行常规open(),获取用户输入,写入临时文件,完成后移动临时文件以替换原始文件。当然,如果有一个大文件无法加载到内存中,则可以一次读取一行,然后写入临时文件。