2011-08-21 10 views
1

なぜ私はこのバギーの出力を得続けているのか分かりません。バグのテキスト置換コード:

入力ファイル:

ff1 
ff2 
ff3 
ff10 
ff11 
ff20 
ff21 
ff23 
gb20 
gb10 
gh23 

出力ファイル:

FF01 
FF02 
FF03 
FF010 
FF011 
FF020 
FF021 
FF023 
GB020 
GB010 
GH023 

コード:

import os 
import sys 

#directory is the directory we will work from 
directory = "C:\\Users\\user\\Desktop" 
os.chdir(directory) 

renameWhat = ["ff", "gb", "gh"] 

oldFile = open("New Text Document.txt") 
buffer = oldFile.read() 

for item in renameWhat: 
    for i in range(0, 50): 
     if i < 10: 
      buffer = buffer.replace(item + str(i), item.upper() + "0" + str(i)) 
     else: 
      buffer = buffer.replace(item + str(i), item.upper() + str(i)) 

outFile = open("test.txt", "w") 
outFile.write(buffer) 
outFile.close() 
oldFile.close() 

発生する必要があるもの:

私がFFを交換しようとしています大文字(完了)、その後、私はtが必要ですo less than or equal to 9のすべての数値に0を加算します。だから、私はif i is less than 10が十分に良いと思う。それは9以上のすべてにゼロを追加しているからではありません。私はlen(str(i))で試して、それが長さ1のものであることを確認しましたが、それでも動作しません。私は何が欠けていますか?

答えて

3

元の解決策が機能しない理由は、行/語/番号全体に一致しているかどうかをチェックしていないからです。だから、FF01あなたの緩衝液でff1を交換した後、例えば以下のようになります。動作しませんでした

FF01 
ff2 
ff3 
FF010 
FF011 
ff20 
ff21 
ff23 
gb20 
gb10 
gh23 
+0

私はそのような初歩的なエラーを逃したと信じて、まだ明らかではないバグです。私はちょうどそれを修正するファイル拡張子を追加しました。ありがとう – nobody

1

だけzfill string methodを使用する:あなたは、特定のプレフィックスを大文字にしたい場合は

with open("New Text Document.txt") as oldFile: 
    with open("test.txt", "w") as outFile: 
     for line in oldFile: 
      start, end = line[:2], line[2:] 
      outfile.write(start.upper() + end.strip().zfill(2) + '\n') 

:ここ

>>> str(1).zfill(2) 
'01' 
>>> str(10).zfill(2) 
'10' 
+0

、それはまだゼロを付加しています。 – nobody

+0

これはPythonのプロンプトからの直接ペーストです。私はあなたが前置きを意味すると信じています。 –

2

はシンプルなソリューションです

with open("New Text Document.txt") as oldFile: 
    with open("test.txt", "w") as outFile: 
     for line in oldFile: 
      start, end = line[:2], line[2:] 
      if start in renameWhat: 
       start = start.upper() 
      outfile.write(start + end.strip().zfill(2) + '\n') 
+1

'' buffer 'の代わりに 'line [:2]'などを意味しませんか? –

+0

ええ、ありがとう、ちょうど部分的に名前が変更された – agf

+0

npあなたはそれに私をかろうじて打ち負かす! –

0
import re 
a = """ff1 
ff2 
ff3 
ff10 
ff11 
ff20 
ff21 
ff23 
gb20 
gb10 
gh23 
""" 

regex = re.compile('([a-zA-Z]*)([0-9]*)\n') 
b = "" 
for i in regex.findall(a): 
    if i[0] in ['ff','gb','gh']: 
     b+=i[0].upper() 
    else: 
     b+=i[0] 
    if int(i[1]) < 10: 
     b+= "0" 
    b+= i[1]+"\n" 
print b 

結果:

FF01 
FF02 
FF03 
FF10 
FF11 
FF20 
FF21 
FF23 
GB20 
GB10 
GH23 
+0

これは何かのための正規表現の必要はありません - それは組み込みの文字列メソッドのためのものです。 – agf

+0

@agf:True。しかし、それは再びそれは本当に問題ではない単純な十分です – Robus

関連する問題