Поиск и замена предыдущей строки Python - PullRequest
0 голосов
/ 25 апреля 2018

В файле у меня есть следующий текст:

 xxxxxx
    PCTFREE    10
    INITRANS   8
    MAXTRANS   255
    STORAGE    (
                BUFFER_POOL      DEFAULT
               ),
)

Я пытаюсь найти строку, которая начинается с (")") и удалить "," из предыдущей строки.

Ответы [ 3 ]

0 голосов
/ 25 апреля 2018
with open('filename') as f:
    print(f.read().replace(',\n)','\n)')
0 голосов
/ 25 апреля 2018

То, что вы просите в своем описании, не совпадает ни с чем в вашем вводном примере или даже близко к нему. Ни одна из ваших строк не начинается с ). Одна из ваших строк начинается с некоторого пробела и а), но строка перед этим является пустой строкой, а последняя непустая строка перед ней не имеет запятой, которую можно удалить.

Но я проигнорирую пример ввода и объясню, как сделать то, что вы просили в описании.

Самый простой способ - просто отслеживать предыдущую строку и повторять строки:

lastline = None
for line in infile:
    line = line.rstrip()
    if line.startswith(")"):
        if lastline is not None:
            lastline = lastline.rstrip(",")
    if lastline is not None:
        outfile.write(lastline + '\n')
    lastline = line
if lastline is not None:
    outfile.write(lastline + '\n')

Вы можете сделать это немного чище и компактнее, используя pairwise оболочку итератора, как в рецептах itertools , но немного измененную, чтобы добавить в конце "лишнюю" пару :

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = itertools.tee(iterable)
    next(b, None)
    return itertools.zip_longest(a, b, fillvalue='')

stripped = (line.rstrip() for line in infile)
for line, nextline in pairwise(stripped):
    if nextline.startswith(")"):
        line = line.rstrip(",")
    if line is not None:
        outfile.write(line + '\n')
0 голосов
/ 25 апреля 2018

Вы можете циклически перебирать текст и проверять один индекс вперед для ):

new_s = [i.strip('\n') for i in open('filename.txt')]
final_data = '\n'.join(new_s[i][:-1] if new_s[i+1].startswith(')') else new_s[i] for i in range(len(new_s)-1))

Выход:

xxxxxx
PCTFREE    10
INITRANS   8
MAXTRANS   255
STORAGE    (
        BUFFER_POOL      DEFAULT
       )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...