2017-05-15 22 views
0

は私のコード である私は、シングルショットでとLOCを減らすことによって、これを行うためにとにかく3つの文字列検索やPythonで複数の文字列を置換

tmp="/tmp" 
day = datetime.date.today().day 
today = datetime.date.today() 
year =datetime.date.today().year 
month = today.strftime('%b') 

f1 = open("%s/backup.txt" % (tmp), 'r') 
f2 = open("%s/backup1.txt" % (tmp), 'w') 
for line in f1: 
     f2.write(line.replace('day', "%s" % (day))) 
f1.close() 
f2.close() 

f1 = open("%s/backup1.txt" % (tmp), 'r') 
f2 = open("%s/backup2.txt" % (tmp), 'w') 
for line in f1: 
     f2.write(line.replace('mon', "%s" % (mon))) 
f1.close() 
f2.close() 

f1 = open("%s/backup2.txt" % (tmp), 'r') 
f2 = open("%s/backup3.txt" % (tmp), 'w') 
for line in f1: 
     f2.write(line.replace('year', "%s" % (year))) 
f1.close() 
f2.close() 

を検索し、交換したいですか?

私は新しいファイルに行を書き込み前、あなただけの同じループで3個の置換を行うことができます

+1

は 'TMP =/tmp' – Hackaholic

+0

TMP = "/ tmpは、" Linuxディレクトリでの – user4432340

+0

可能な重複[Pythonの複数の文字列を置き換える](http://stackoverflow.com/questions/6116978ものです/ python-replace-multiple-strings) –

答えて

2

、シングルショットで よろしくを年、月と日を検索し、交換したいです。

f1 = open("%s/backup.txt" % (tmp), 'r') 
f2 = open("%s/backup1.txt" % (tmp), 'w') 
for line in f1: 
    new_line = line.replace('day', "%s" % (day)) 
    new_line = line.replace('mon', "%s" % (mon)) 
    new_line = line.replace('year', "%s" % (year)) 
    f2.write(new_line) 
f1.close() 
f2.close() 

ご希望の場合は、その行は非常に長くなりますと、とにかく\で破壊されたいあなたも、同じライン上の3つすべてを行うことができます。また、withを使用してファイルを開いたり閉じたりすることができます。

with open("%s/backup.txt" % tmp, 'r') as f1, \ 
    open("%s/backup1.txt" % tmp, 'w') as f2: 
    for line in f1: 
     new_line = line.replace('day', "%s" % day) \ 
         .replace('mon', "%s" % mon) \ 
         .replace('year', "%s" % year) 
     f2.write(new_line) 

ビル@brunoによって考えに、あなたはまた、代替品との辞書を作成して、「日」または「月」または「年」"day|mon|year"を見つけるためにregular expressionを使用して値からでそれを置き換えることができますdict。

>>> day, mon, year = 2017, 5, 15 
>>> repl = {"day": day, "mon": mon, "year": year} 
>>> line = "test string with day, mon, and year in it" 
>>> re.sub("day|mon|year", lambda m: str(repl.get(m.group())), line) 
'test string with 2017, 5, and 15 in it' 

さらに良い:あなたはテンプレートファイルを管理している場合は、あなただけの{...}に交換する部品をラップしてから({...}がファイルにそれ以外の場合は表示されないと仮定して)、交換用str.formatを使用することができます。

>>> line = "test string with {day}, {mon}, and {year} in it" 
>>> line.format(**repl) 
'test string with 2017, 5, and 15 in it' 
+0

私にそれを打つ、と投票 –

+0

エドウィンありがとう。それは働いた – user4432340

1
tmp="/tmp" 
today = datetime.date.today() 
day = "%s" % today.day 
year = "%s" % today.year 
month = today.strftime('%b') 

replacements = [ 
    # find -> replace 
    ('day', day), 
    ('mon', mon), 
    ('year', year) 
    ] 


with open("%s/backup.txt" % (tmp), 'r') as source, \ 
    open("%s/backup1.txt" % (tmp), 'w') as dest: 

    for line in source: 
     for target, replacement in replacements: 
      line = line.replace(target, replacement) 
     dest.write(line) 
+0

こんにちはブルーノDesthuilliers、私はラインを取得している= line.replace(ターゲット、置換)TypeError:文字バッファオブジェクトのエラーが予想される。 – user4432340

+0

@ user4432340あなたはおそらく 'str'に変換するのを忘れました。 brunoは 'day'、' month'などを宣言するときにこれをやっています(しかし、dictや 'line.replace'でもそうすることができます) –

+0

@tobias_kありがとうございました。わかった。 – user4432340

関連する問題