Как сохранить номер версии приращения в файле, используя python? - PullRequest
0 голосов
/ 27 июня 2019

Я пытаюсь сохранить версию ElasticSearch в файле.

входной файл:

ElasticSearch 5:1:

Выходной файл после первого выполнения

ElasticSearch 5:1:0

Выходной файл после второго раза выполнения

ElasticSearch 5:1:1
ElasticSearch 5:1:0

Выходной файл после третьего раза выполнения

ElasticSearch 5:1:2
ElasticSearch 5:1:1
ElasticSearch 5:1:0

Мой код ниже

import re
reg = r'(?:)$'
with open('elastic.txt', 'r') as fread:
    data = fread.read()
    with open('elastic.txt', 'a') as fwrite:
        fwrite.seek(0,0)
        fwrite.write(re.sub(reg, lambda x: str(int(x.group(0)) + 1), data, 1, re.M))

Две проблемы, с которыми я столкнулся при поиске (0,0) не работает должным образом и регулярное выражение не добавляет

Ответы [ 2 ]

1 голос
/ 27 июня 2019

Расширенное решение с пользовательской incr_patch_version функцией:

import re

regex = r'(?<=:)\d*$'


def incr_patch_version(fname):
    with open(fname, 'r+') as f:
        lines = f.readlines()
        new_line = re.sub(regex, lambda x: str(int(x.group()) + 1 if x.group().isnumeric() else 0), lines[0])
        f.seek(0)
        f.write(new_line) if lines[0].strip().endswith(':') else f.writelines([new_line, *lines])


fname = 'elastic.txt'

incr_patch_version(fname)
incr_patch_version(fname)
incr_patch_version(fname)
incr_patch_version(fname)

Конечное elastic.txt содержание:

ElasticSearch 5:1:3
ElasticSearch 5:1:2
ElasticSearch 5:1:1
ElasticSearch 5:1:0
1 голос
/ 27 июня 2019

Вы можете использовать

import re
reg = r'\A(.*:)(\d*)$'
with open('elastic.txt', 'r') as fread:
    data = fread.read()
    with open('elastic.txt', 'w') as fwrite:
        fwrite.write(re.sub(reg, lambda x: "{}{}\n{}".format(x.group(1), str(int(x.group(2)) + 1), x.group()) if len(x.group(2)) else "{}0".format(x.group(1)) , data, 1, re.M))

Подробности

  • \A(.*:)(\d*)$ - регулярное выражение, которое получает строку в начале файла, если оно имеет: и захватывает часть вплоть до : в Группе 1 и любые нули или более цифр в Группе 2 (в конце строки)
  • data - это содержимое всего файла
  • lambda x: "{}{}\n{}".format(x.group(1), str(int(x.group(2)) + 1), x.group()) if len(x.group(2)) else "{}0".format(x.group(1)) заменяет на Группу 1, инкрементную Группу 2 и новую строку + всю первую строку , если Группа 2 содержит цифры, иначе она добавляет 0 к первой строке безудвоение.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...