2011-08-21 79 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