Как удалить строки в файле до определенного символа в Python 3 - PullRequest
0 голосов
/ 17 июня 2019

У меня очень большой файл, который мне нужно проанализировать.Мне не нужна ни одна из строк до '&'.Мне просто нужна информация после '&' в файле.Как мне удалить строки перед '&'?Вот что у меня есть:

import re

original_file = 'file.rpt'
file_copy = 'file_copy.rpt'

with open(original_file, 'r') as rf:
    with open(file_copy, 'r+') as wf:
        for line in rf:
            #if statement to write after the '&' has been encountered?
            wf.write(line)

Входной файл:

sample text1
sample text2
sample text3
sample text4
&sample text5
sample text6

expected output file:
&sample text5
sample text6

В файле rpt 6 строк, строки 1-4 - это информация, которая не нужна,Я хочу удалить строки 1-4, чтобы сосредоточиться на строках 5 и 6.

Ответы [ 2 ]

1 голос
/ 17 июня 2019

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

def load_data(filename):
    with open(filename, 'r') as f:
        for line in f:
            if '&' in line:  # or if line.startswith('&'):
                break
        else:
            return []
        return [line] + list(f)

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

Вы даже можете превратить их в ленивый генератор, который будет возвращать только те строки, которые вам нужны:

def trim_data(filename):
    with open(filename, 'r') as f:
        for line in f:
            if '&' in line:  # or if line.startswith('&'):
                yield line
                break
        else:
            return
        yield from f

Копировать файл таким образом, если это то, что вы хотите сделать, еще проще:

with open(copy_file, 'w') as f:
    for line in trim_data(original_file):
        f.write(line)
1 голос
/ 17 июня 2019

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


original_file = 'file.rpt'
file_copy = 'file_copy.rpt'
omit = True
with open(original_file, 'r') as rf:
    with open(file_copy, 'w') as wf:
        for line in rf:
            if "&" in line:
                omit = False
            if omit:
                continue
            else:
                wf.write(line)

Этот код будет пропускать все строки вплоть до и исключая строку, содержащую &

. Вы также можете проанализировать строку с помощью & symbol:

original_file = 'file.rpt'
file_copy = 'file_copy.rpt'
omit = True
with open(original_file, 'r') as rf:
    with open(file_copy, 'r+') as wf:
        for line in rf:
            if "&" in line:
                before,after = line.split("&")
                wf.write(after)
                omit = False
                continue
            if omit:
                continue
            else:
                wf.write(line)

Выше будет также записано все содержимое после &, но в той же строке, пропуская что-либо до & в той же строке

EDIT

Также проверьте, если вы открываете второй файл в правильном режиме, может быть, вам следует использовать 'w', чтобы сначала урезать файл 'r+' добавит содержимое файла, и я не уверен, что это то, чтоты хочешь

...