Как я могу взять данные между двумя строками в текстовом файле? - PullRequest
0 голосов
/ 11 декабря 2019

У меня есть выходной файл со сложным текстовым форматом с именем DATA_out (как в примере ниже), и я хочу взять между двумя строчными (например, значениями и итогами) данные внутри файла и сохранить их в формате csv. Я сделал стартовую строку с пользовательским вводом и конечной строкой. Когда мой код работает, он знает, с чего начинается запись, но я не могу импортировать конечную строку («итого»). Мне просто нужно добавить start_line и end_line к re.compile.

Есть ли у вас какие-либо предложения по переносу данных между двумя строками с помощью USER INPUT? Вот что у меня есть.

DATA_out file
      values
    DATA_LINE 1
    DATA_LINE 2
    DATA_LINE 3
    DATA_LINE 4
total

# Spyder Editor (Python 3.7)
import pandas as pd
import re

start_line = input('Starting:')
end_line = 'total' # end point.

with open('DATA_out.txt','r') as file:
    input = file.read()

rexp = re.compile(start_line,re.DOTALL) # need to add between start and end
match = rexp.search(input)
result = '' if match == None else match.group(1)
with open('NEW_FILE.txt','w') as file:
    file.write(result)

1 Ответ

0 голосов
/ 11 декабря 2019

С регулярным выражением вы можете использовать 'values(.*)total' или с '\n' - 'values\n(.*)\ntotal'

text = '''DATA_out file
      values
    DATA_LINE 1
    DATA_LINE 2
    DATA_LINE 3
    DATA_LINE 4
total
'''

import re

result = re.search('values(.*)total', text, re.DOTALL)

if result:
    print(result[1])
    #print(result.group(1))    

Без regex вы можете использовать find(), чтобы найти позиции values иtotal по отдельности, объявление затем нарезать его на text[start:end]

text = '''DATA_out file
      values
    DATA_LINE 1
    DATA_LINE 2
    DATA_LINE 3
    DATA_LINE 4
total
'''

start = text.find('values')
end = text.find('total', start)

if start > -1 and end > -1:
    start += len("values")  
    print(text[start:end])

Если вы хотите читать из файла построчно.

Я использую io.StringIO() для имитации файла

text = '''DATA_out file
      values
    DATA_LINE 1
    DATA_LINE 2
    DATA_LINE 3
    DATA_LINE 4
total
'''

import io

#f = open("input.txt")
f = io.StringIO(text)

lines = []

# read till you find line with 'values'
for line in f:
    if 'values' in line:
        break

# read till you find line with 'values'
for line in f:
    if 'total' in line:
        break
    lines.append(line)
else: # it is `for/else`, not `if/else`
    #if not found `total` (so there was no `break`) then clear list
    lines = []    

if lines:
    print("".join(lines))    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...