Простая проблема регулярных выражений: удаление всех новых строк из файла - PullRequest
21 голосов
/ 08 августа 2009

Я знакомлюсь с python и создаю проблемы, чтобы помочь себе изучить все тонкости языка. Моя следующая проблема выглядит следующим образом:

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

Есть ли простой способ сделать это? Это кажется довольно простым.

Ответы [ 5 ]

34 голосов
/ 08 августа 2009

Две основные альтернативы: читать все как одну строку и удалять символы новой строки:

clean = open('thefile.txt').read().replace('\n', '')

или, читайте построчно, удаляя символ новой строки, заканчивающийся в каждой строке, и снова присоединяйте его:

clean = ''.join(l[:-1] for l in open('thefile.txt'))

Первый вариант, вероятно, быстрее, но, как всегда, я настоятельно рекомендую вам ИЗМЕРЯТЬ скорость (например, используйте python -mtimeit) в тех случаях, которые вас интересуют, а не просто предполагать, что вы знаете, как будет работать производительность. RE, вероятно, медленнее, но, опять же: не угадывайте, ИЗМЕРЯЙТЕ!

Итак, вот некоторые цифры для конкретного текстового файла на моем ноутбуке:

$ python -mtimeit -s"import re" "re.sub('\n','',open('AV1611Bible.txt').read())"
10 loops, best of 3: 53.9 msec per loop
$ python -mtimeit "''.join(l[:-1] for l in open('AV1611Bible.txt'))"
10 loops, best of 3: 51.3 msec per loop
$ python -mtimeit "open('AV1611Bible.txt').read().replace('\n', '')"
10 loops, best of 3: 35.1 msec per loop

Файл представляет собой версию Библии KJ, загруженную и разархивированную с здесь (я думаю, важно выполнять такие измерения на одном легко извлекаемом файле, чтобы другие могли легко их воспроизвести!).

Конечно, несколько миллисекунд, больше или меньше для файла размером 4,3 МБ, 34 000 строк, могут так или иначе не иметь для вас большого значения; но поскольку самый быстрый подход также самый простой (далеко не необычный случай, особенно в Python ;-), я думаю, что это довольно хорошая рекомендация.

9 голосов
/ 08 августа 2009

Я бы не использовал регулярное выражение для простой замены строк - я бы использовал string.replace(). Вот полный сценарий:

f = open('input.txt')
contents = f.read()
f.close()
new_contents = contents.replace('\n', '')
f = open('output.txt', 'w')
f.write(new_contents)
f.close()
3 голосов
/ 08 августа 2009

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

cat $FILE | tr -d '\n'

awk '{printf("%s", $0)}' $FILE

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

3 голосов
/ 08 августа 2009
import re
re.sub("\n", "", file-contents-here)
0 голосов
/ 29 января 2012

Старый вопрос, но так как он был в моих результатах поиска по аналогичному запросу, и никто не упомянул строковые функции python strip() || lstrip() || rstrip(), я просто добавлю это для потомков (и любого, кто предпочитает не использовать re, когда не обязательно):

old = open('infile.txt')
new = open('outfile.txt', 'w')
stripped = [line.strip() for line in old]
old.close()
new.write("".join(stripped))
new.close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...