Python объединить строки без пустых новых строк - PullRequest
3 голосов
/ 21 апреля 2020

Мне нужна ваша помощь в решении следующей проблемы. У меня есть несколько больших текстовых файлов, например:

This is the Name of the Person

This is his surname

He likes to sing 
every time.

Я хочу только объединить строку He likes to sing с every time., потому что я делаю другие регулярные выражения с каждой строкой после этого.

Таким образом, вывод должен быть:

This is the Name of the Person

This is his surname

He likes to sing every time.

Итак, я попробовал это с:

for file in file_list:
    with open(file, 'r', encoding='UTF-8', errors='ignore') as f_in:
        for line in f_in:
              if not line.startswith('\n'):
                line.replace('\n', '')
                print(line)

Спасибо за вашу помощь.

Ответы [ 3 ]

2 голосов
/ 21 апреля 2020

Вы можете попробовать это:

for file in file_list:
    with open(file, 'r', encoding='UTF-8', errors='ignore') as f_in:
        lines = [i.replace('\n', ' ') for i in f_in.read().split('\n\n')]

    # here you do something with your `lines`
2 голосов
/ 21 апреля 2020

Я думаю, что будет лучше сделать это так:

for file_name in file_list:
    with open(file_name, "r", encoding="UTF-8", errors="ignore") as file:
        text = file.read()
        text_blocks = text.split("\n\n")
        for text_block in text_blocks:
            formatted_text_block = text_block.replace("\n", "")
            # then you can do what ever you want with this new block of text
1 голос
/ 21 апреля 2020

Вы можете разделить разделы на \n\n, а затем объединить каждый раздел, разделив на \n:

with open("data.txt") as f:
    for line in f.read().split("\n\n"):
        print("".join(line.split("\n")) + "\n")

Вывод:

This is the Name of the Person

This is his surname

He likes to sing every time.

Если вы хотите написать Вывод обратно в новый файл, вы можете сделать это:

with open("data.txt") as f, open("output.txt", mode="w") as o:
    for line in f.read().split("\n\n"):
        o.write("".join(line.split("\n")) + "\n\n")

Нам нужно добавить дополнительный \n, потому что мы не печатаем.

output.txt

This is the Name of the Person

This is his surname

He likes to sing every time.

Другой вариант - собрать все строки в одну строку, а затем записать все содержимое строки в файл:

with open("data.txt") as f, open("output.txt", mode="w") as o:
    lines = "\n\n".join("".join(line.split("\n")) for line in f.read().split("\n\n"))
    o.writelines(lines)

Проблема с вышеуказанными решениями заключается в том, что они считывают все содержимое файла в память с помощью read() перед обработкой, что может быть медленным для больших файлов.

Вместо этого мы могли бы создать функцию генератора, которая выдает разделы из файла:

def collect_file_sections(f):
    section = []
    for line in f:
        line = line.strip()
        if line:
            section.append(line)
            continue
        yield section
        section = []
    yield section

Затем напишите разделы следующим образом:

with open("data.txt") as f, open("output.txt", mode="w") as o:
    o.writelines("\n\n".join(" ".join(section) for section in collect_file_sections(f)))
...