Убрать '\ n' только из предыдущих 3 строк, когда совпадение найдено - PullRequest
0 голосов
/ 09 января 2019

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

 with open(in_file9, 'r', encoding='utf-8') as fin, open(out_file10, 'w', encoding='utf-8') as fout:
            lines = fin.read().splitlines()
            count = 0
            for i, line in enumerate(lines):
                count = count + 1
                if line.startswith(','):
                    print (lines[i - 1])
                    lines[i - 1].strip('\n')
                    lines[i - 2].strip('\n')
                    lines[i - 3].strip('\n')

                fout.write(line)

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

* В *

6.30.230. STLB-Bau: 11/2017 068 Немного текста, симметы, DIN FFF 1234 (VDE

1,850 , 000 м

6.30.220. STLB-Bau: 10/2015 123 Другой текст, симметрия, DIN FFF 6789 (VDE 950 000 м

Out (что у меня есть)

6.30.230. STLB-Bau: 11/2017 068 Некоторый текст, симметрия, DIN FFF 1234 (VDE 1.850, 000 м 6.30.220. STLB-Bau: 10/2015 123 Некоторый другой текст, симметрия, DIN FFF 6789 (VDE 950,000 м

Out (что я хочу):

6.30.230. STLB-Bau: 11/2017 068 Немного текста, симметия, DIN FFF 1234 (VDE 1.850,000 м

6.30.220. STLB-Bau: 10/2015 123 Другой текст, симметрия, DIN FFF 6789 (VDE 950 000 м

enter image description here

1 Ответ

0 голосов
/ 09 января 2019

Новые строки фактически удаляются с помощью splitlines(), поскольку вы не предоставляете аргумент keepends. Но вместо fin.read().splitlines(keepends=True) вы можете просто fin.readlines().

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

Наконец, я отмечу, что lines[i - 1].strip('\n') на самом деле не изменяет lines[i - 1]. Он просто возвращает модифицированную версию строки, но вам все равно нужно вернуть ее обратно.

Решение этих проблем в вашем коде, похоже, делает то, что вы просите:

with open(in_file9, 'r', encoding='utf-8') as fin, open(out_file10, 'w', encoding='utf-8') as fout:
    lines = fin.readlines()
    for i, line in enumerate(lines):
        if line.startswith(','):
            lines[i - 1] = lines[i - 1].strip('\n')
            lines[i - 2] = lines[i - 2].strip('\n')
            lines[i - 3] = lines[i - 3].strip('\n')
    fout.write(''.join(lines))

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

from re import sub, MULTILINE

with open(in_file9, 'r', encoding='utf-8') as fin, open(out_file10, 'w', encoding='utf-8') as fout:
    lines = fin.read()
    lines = sub(r'\s+^(?=,)', '', lines, flags=MULTILINE)
    fout.write(lines)
...