2012-05-30 293 views
6

我有以下代碼,它通過進行正則表達式替換來修改文件test.tex的每一行。Python使用標準輸出和文件輸入寫入文件

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」,則進行替換。如果用戶根本沒有輸入任何內容,則替換爲而不是

問題當然是,通過使用代碼inplace=1我已經有效地將stdout重定向到打開的文件。所以沒有辦法顯示輸出(例如詢問是否進行替換)到沒有發送到文件的命令行。

任何想法?

+2

使用stderr ..... –

+0

'fileinput'不是這個工作的正確工具。只需使用標準的讀取 - 修改 - 寫入模式 –

+0

@EliBendersky您能否指點我做一個提及的例子?對不起,我對Python很陌生。 – synaptik

回答

3

文件輸入模塊實際上是處理多個輸入文件。 您可以使用常規的open()函數。

這樣的事情應該工作。

通過閱讀文件,然後重新與求(指針),我們可以覆蓋的文件,而不是追加到最後,所以編輯就地文件

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) 

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

+2

當然,如果你有一個太大而無法加載到內存中的大文件,那麼你可以一次讀一行,然後寫入一個臨時文件。 –

+0

非常感謝! :) – synaptik

0

基礎的關於大家提供的幫助,這裏是我最終的結果:

#!/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) 

非常感謝!