Как вырезать данные из текстового файла с заданным диапазоном строк - PullRequest
0 голосов
/ 12 апреля 2020

У меня очень большой текстовый файл, и я хочу нарезать несколько указанных c его частей, а затем создать новый текстовый файл только с нарезанными данными. Мой подход состоял в том, чтобы сначала найти номера строк, где начинается и заканчивается нужная часть, чтобы впоследствии использовать их в качестве диапазонов для нарезки. Причина этого в том, что текстовый файл содержит большие части с описаниями, аннотациями, от которых мне нужно избавиться. Должен ли я использовать itertools.islice?

KMAPspec = open("KMAP_2018_04_23_071018_fast_00001.txt","r")
DataStartLine=[]
DataEndLine=[]
for x, line in enumerate(KMAPspec):   
    if line.find("#C imageFile")!=-1:
        DataStartLine.append(x)
    if line.find("#S")!=-1:
        DataEndLine.append(x)
with open("output.txt","w") as out:    

1 Ответ

0 голосов
/ 12 апреля 2020

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

with open("KMAP_2018_04_23_071018_fast_00001.txt","r") as KMAPspec:
    with open("output.txt","w") as out: 
        should_write = False
        for line in KMAPspec:
            # When I meet this line, stop writing out
            if line.find("#S")!=-1:
                should_write = False
            # Write out only if between the two tags
            if should_write:
                out.write(line)
            # When I meet this line, start writing out   
            if line.find("#C imageFile")!=-1:
                should_write = True

Таким образом, вы ничего не сохраняете в памяти.

Если должны быть включены граничные линии:

with open("KMAP_2018_04_23_071018_fast_00001.txt","r") as KMAPspec:
    with open("output.txt","w") as out: 
        should_write = False
        for line in KMAPspec:
            # When I meet this line, start writing out   
            if line.find("#C imageFile")!=-1:
                should_write = True
            # Write out only if between the two tags
            if should_write:
                out.write(line)
            # When I meet this line, stop writing out
            if line.find("#S")!=-1:
                should_write = False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...