2011-08-21 84 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到大寫(完成),然後我需要噸o將零加到less than or equal to 9的所有數字上。所以我認爲if i is less than 10應該足夠好;但這不是因爲它爲9以上的所有東西增加了零。我嘗試了len(str(i))以確保它只有一個長度,但仍然不起作用;我錯過了什麼?

回答

3

原始解決方案不起作用的原因是它沒有檢查它是否匹配整行/字/數字。因此,例如與FF01你的緩衝替換ff1後現:

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

不能相信我錯過了這樣一個基本的錯誤;但不是那麼明顯的錯誤。我只是添加了文件擴展名來修復它。謝謝 – nobody

1

只需使用zfill string method

>>> 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:] 
      outfile.write(start.upper() + end.strip().zfill(2) + '\n') 

如果你只是想大寫特定的前綴:

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

你不是指'行[: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:對。但是再次它很簡單,它並不重要 – Robus