2012-05-30 23 views
6

Düzenli bir ifade değişikliği yaparak, test.tex dosyasının her bir satırını değiştiren aşağıdaki koda sahibim. Python, stdout ve fileinput kullanılarak dosyaya yazılıyor

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), 

tek sorun

Ben sadece ikame dosyasında bazı hatlara uygulamak istediğiniz olmasıdır ve doğru çizgileri seçmek için bir desen tanımlamak için bir yolu yoktur. Bu yüzden, her satırı göstermek ve komut satırında kullanıcıyı sorar ve mevcut satırda değişiklik yapıp yapmamayı sorar. Kullanıcı "y" girerse, ikame yapılır. Kullanıcı hiçbir şey girmezse, yerine yapılır.

Sorun şu ki, bu kodu kullanarak, inplace=1 kodunu kullanarak, etkinleştirilmiş dosyaya stdout'u yeniden yönlendirdim. Bu yüzden, dosyaya gönderilmeyen komut satırına çıktıyı (örneğin, ikame yapıp yapmamayı sorma) göstermenin bir yolu yoktur.

Herhangi bir fikrin var mı?

+2

stderr ..... öğesini kullanın. –

+0

'fileinput' bu iş için doğru araç değildir. Sadece standart bir okuma-değiştir-yazma modelini kullan –

+0

@EliBendersky bana bahsettiğin şeyi yapmanın bir örneğini işaret edebilir misin? Üzgünüm, Python'da çok yeniyim. – synaptik

cevap

3

Dosya giriş modülü gerçekten birden fazla giriş dosyasıyla uğraşmak içindir. Bunun yerine normal open() işlevini kullanabilirsiniz.

Böyle bir şey işe yaramalıdır. Sonra (aramaya ile işaretçi sıfırlama dosyası), bunun yerine sonuna ekleme ve dosyayı geçersiz ve böylece yerinde dosyasını düzenleyebilirsiniz okuyarak

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

Tabii ki belleğe yüklenemeyecek kadar büyük bir kütleye sahipseniz, her seferinde bir satırı okuyabilir ve bunun yerine geçici bir dosyaya yazabilirsiniz. –

+0

Çok teşekkürler! :) – synaptik

0

Tabanlı Sağlanan herkesin yardımında, işte işim bittiği nokta:

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

Çok teşekkürler!

İlgili konular