Удалить разрыв строки в определенной позиции в текстовом файле - PullRequest
0 голосов
/ 18 марта 2010

У меня большой текстовый файл, у которого есть разрывы строк в столбце 80 из-за ширины консоли. Многие строки в текстовом файле имеют длину не 80 символов и не затрагиваются переводом строки. В псевдокоде это то, что я хочу:

  • Перебирать строки в файле
  • Если строка соответствует этому шаблону регулярных выражений: ^ (. {80}) \ n (. +)
    • Замените эту строку новой строкой, состоящей из match.group (1) и match.group (2). Просто удалите разрыв строки из этой строки.
  • Если строка не соответствует регулярному выражению, пропустите!

Может быть, мне не нужно регулярное выражение, чтобы сделать это?

Ответы [ 4 ]

1 голос
/ 18 марта 2010

Учтите это.

def merge_lines( line_iter ):
    buffer = ''
    for line in line_iter:
        if len(line) <= 80:
            yield buffer + line
            buffer= ''
        else:
            buffer += line[:-1] # remove '\n'

with open('myFile','r') as source:
    with open('copy of myFile','w') as destination:
        for line in merge_lines( source ):
            destination.write(line)

Я считаю, что явная функция генератора значительно облегчает тестирование и отладку основной логики сценария без необходимости создавать поддельные файловые системы или выполнять множество сложных настроек и разборок для тестирования.

1 голос
/ 18 марта 2010
f=open("file")
for line in f:
    if len(line)==81:
       n=f.next()
       line=line.rstrip()+n
    print line.rstrip()
f.close()
1 голос
/ 18 марта 2010

Вот некоторый код, который должен в фокусе

def remove_linebreaks(textfile, position=81):
    """
    textfile : an file opened in 'r' mode
    position : the index on a line at which \n must be removed

    return a string with the \n at position removed
    """
    fixed_lines = []
    for line in textfile:
        if len(line) == position:
            line = line[:position]
        fixed_lines.append(line)
    return ''.join(fixed_lines)

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

0 голосов
/ 18 марта 2010

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

text = re.sub(r'(?<=^.{80})\n', '', text)

Вы также можете использовать свое регулярное выражение при вызове re.sub с вызываемым:

text = re.sub(r'^(.{80})\n(.+)', lambda m: m.group(1)+m.group(2), text)
...