Я не могу понять, почему я продолжаю получать эту ошибку.
Входной файл:
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 на uppercase (done), тогда мне нужно добавить ноль ко всем числам, которые less than or equal to 9
. Поэтому я думаю, что if я is less than 10
должен быть достаточно хорошим; но это не потому, что он добавляет нули ко всему более чем 9. Я попытался с len(str(i))
чтобы убедиться, что это только длина одна, но это все еще не работает; что мне не хватает?
Причина, по которой ваше исходное решение не работает, заключается в том, что он не проверяет, что он соответствует целой строке/слову/числу. Так, например, после замены ff1
на FF01
ваш буфер теперь:
FF01
ff2
ff3
FF010
FF011
ff20
ff21
ff23
gb20
gb10
gh23
Вот простое решение:
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')
line[:2]
т. д. вместо buffer
?
Просто используйте метод строки zfill:
>>> str(1).zfill(2)
'01'
>>> str(10).zfill(2)
'10'
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