Как прочитать определенную часть текстового файла в Python? - PullRequest
1 голос
/ 05 июля 2019

Мне нужно извлечь часть текста из текстового файла.
Файл выглядит так:

НАЧАЛО РАБОТЫ ДД / ММ / ГГГГ ЧЧ: ММ: СС
... текстовые строки ...
... больше текстовых строк ...
НАЧАЛО РАБОТЫ ДД / ММ / ГГГГ ЧЧ: ММ: СС
... текстовые строки, которые я хочу ...
... больше строк текста, которые я хочу ...

  • Файл начинается с STARTINGWORK и заканчивается текстовыми строками.
    Мне нужно извлечь окончательную часть текста после последнего STARTINGWORK без STARTINGWORK str

Я попытался использовать 3 для циклов (один для начала, другой для чтения между строк и последний для конца)

     file = "records.txt"
     if file.endswith (".txt"):
       if os.path.exists (file):
         lines = [line.rstrip ('\ n') for line in open (file)]
         for line in lines:
             #extract the portion

Ответы [ 5 ]

2 голосов
/ 05 июля 2019

Вы можете использовать модуль file_read_backwards для чтения файла с конца до начала. Это поможет вам сэкономить время, если размер файла большой:

from file_read_backwards import FileReadBackwards

with FileReadBackwards("records.txt") as file:
    portion = list()
    for line in file:
         if not line.startswith('STARTINGWORKING'):
            portion.append(line)
         else:
            break
portion.reverse()

portion содержит нужные строки.

2 голосов
/ 05 июля 2019

Попробуйте это:

file = "records.txt"
extracted_text = ""
    if file.endswith (".txt"):
        if os.path.exists (file):
            lines = open(file).read().split("STARTINGWORKING")
            extracted_text = lines[-1] #Here it is
1 голос
/ 05 июля 2019

Я бы выбрал путь regex для решения этой проблемы:

>>> import re
>>> input_data = open('path/file').read()
>>> result = re.search(r'.*STARTINGWORKING\s*(.*)$', input_data, re.DOTALL)
>>> print(result.group(1))
#'DD / MM / YYYY HH: MM: SS\n... text lines I want ...\n... more text lines that I want ...'
0 голосов
/ 13 июля 2019

У вас может быть переменная, которая сохраняет все строки, которые вы прочитали с момента последнего STARTINGWORK.Когда вы закончите обработку файла, вы получите именно то, что вам нужно.

Конечно, вам не нужно сначала читать все строки списка.Вы можете прочитать это непосредственно в открытом файле, и это возвращает одну строку за раз.то есть:

result = []
with open(file) as f:
    for line in f:
        if line.startswith("STARTINGWORK"):
            result = []       # Delete what would have accumulated
        result.append(line)  # Add the last line read
print("".join(result))

В result у вас есть все после последнего ЗАПУСКА, включительно вы можете оставить result [1:], если хотите удалить начальные STARTINGWORK

- Тогда в коде:

#list
result = []

#function
def appendlines(line, result, word):
  if linea.startswith(word):
    del result[:]
  result.append(line)
  return line, result

with open(file, "r") as lines: 
  for line in lines:              
    appendlines(line, result, "STARTINGWORK")
new_result = [line.rstrip("\n") for line in result[1:]]
0 голосов
/ 06 июля 2019

Генератор get_final_lines пытается избежать malloc хранения большего объема памяти, чем необходимо, при чтении потенциально большого файла.

def get_final_lines(fin):
    buf = []
    for line in fin:
        if line.startswith('STARTINGWORK'):
            buf = []
        else:
            buf.append(line)

    yield from buf


if __name__ == '__main__':
    with open('some_file.txt') as fin:
        for line in get_final_lines(fin):
            print(line.rstrip())
...