Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Два основных варианта: прочитайте все как одну строку и удалите строки:

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

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

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

Первая альтернатива, вероятно, быстрее, но, как всегда, я настоятельно рекомендую вам скорость MEASURE (например, использовать python -mtimeit) в случаях вашего конкретного интереса, а не просто предполагая, что вы знаете, как будет работать. RE, вероятно, медленнее, но, опять же: не догадывайтесь, MEASURE!

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

$ 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;-), я думаю, что это хорошая рекомендация.

Ответ 2

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

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

import re
re.sub("\n", "", file-contents-here)

Ответ 4

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

cat $FILE | tr -d '\n'

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

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

Ответ 5

Старый вопрос, но поскольку он был в моих результатах поиска для аналогичного запроса, и никто не упомянул функции строки 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()