Текст ошибки Заменить код:

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 на uppercase (done), тогда мне нужно добавить ноль ко всем числам, которые less than or equal to 9. Поэтому я думаю, что if я is less than 10 должен быть достаточно хорошим; но это не потому, что он добавляет нули ко всему более чем 9. Я попытался с len(str(i)) чтобы убедиться, что это только длина одна, но это все еще не работает; что мне не хватает?

Теги:
string
replace

4 ответа

3
Лучший ответ

Причина, по которой ваше исходное решение не работает, заключается в том, что он не проверяет, что он соответствует целой строке/слову/числу. Так, например, после замены ff1 на FF01 ваш буфер теперь:

FF01
ff2
ff3
FF010
FF011
ff20
ff21
ff23
gb20
gb10
gh23
  • 0
    Не могу поверить, что я пропустил такую элементарную ошибку; пока не очень очевидный баг. Я просто добавил расширения файла, чтобы исправить это. Спасибо
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
    Вы не имеете в виду line[:2] т. д. вместо buffer ?
  • 0
    да, спасибо, переименовал материал только частично
Показать ещё 1 комментарий
1

Просто используйте метод строки zfill:

>>> str(1).zfill(2)
'01'
>>> str(10).zfill(2)
'10'
  • 0
    Это не сработало, оно все еще добавляет нули.
  • 0
    Это прямая вставка из приглашения Python. И я верю, что ты имеешь в виду готовность.
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
    Не нужно регулярное выражение для чего-то такого простого - для этого нужны встроенные строковые методы.
  • 0
    @agf: правда. Но опять же, это достаточно просто, это не имеет значения

Ещё вопросы

Сообщество Overcoder
Наверх
Меню