У меня есть текстовый файл, который выглядит так:


line A
line B
line C
line D

objective
8.5770822e+000
3762931e+000
0996787e+000
0070925e+000
0003053e+000
9999994e+000

line E
line F
line G

Я хочу импортировать числа под словом «цель» в список Python.

Проблемы: количество строк (с цифрами) под строкой с «целью» может быть другим. Он варьируется от файла к файлу. Я пытаюсь разработать общий код. Таким образом, условие остановки должно быть основано на пустой строке под числами.

Моя идея: Мне удалось получить доступ к строке «цель» с кодом if line.startswith("objective") Но получить доступ к строкам ниже, пока вы не найдете пустую строку, кажется сложной задачей.

Не могли бы вы помочь мне с этим?

Большое спасибо.

3
Wilson Mendes 17 Ноя 2020 в 15:46

2 ответа

Лучший ответ

Вот мое предложение:

  • Прочитать файл в список
  • сохранить каждую строку от "Objective" до последней строки в новый список numbers
  • убрать элементы 0th и все элементы от первых пустых элементов '' до конца.

Останутся те числа, которые вам нужны.

Вот мой инструмент

def main():
    #read file 
    g = open(r"test.txt")
    # read all lines
    lst= g.readlines();
    numbers = []
    # at the beginning no number is found

    # flag to track if we shall save or not in the list
    start_saving = False
    # a loop to save all from objective to the end
    for l in lst:
       l=l.strip("\n")
       if ("objective" in l):
            start_saving= True
       if (start_saving):
            numbers.append(l)

    # here we  obtain an array containing all elements from Objective to the end
    # ['objective', '8.5770822e+000', '3762931e+000', '0996787e+000', '0070925e+000', '0003053e+000', '9999994e+000', '', 'line E', 'line F', 'line G']
    # i will now strip away all elements of index 0 ("Objective") and from the first empty index (the first line containing nothing)
    # only keep elements from 1st to the first element not empty
    numbers = numbers[1:numbers.index('')]
    print numbers
    # display : ['8.5770822e+000', '3762931e+000', '0996787e+000', '0070925e+000', '0003053e+000', '9999994e+000']

if __name__ == '__main__':
    main()

Это выводит:

['8.5770822e+000', '3762931e+000', '0996787e+000', '0070925e+000', '0003053e+000', '9999994e+000']
2
Pat. ANDRIA 18 Ноя 2020 в 06:00

Один из способов сделать это - установить флажок, указывающий, было ли замечено слово «объективный».

Что-то вроде этого:

res = []
objective_seen = False
with open(filename) as fh:
    for line in fh:
        if objective_seen:
            if line:
                res.append(line)
            else:  # blank line
                break
        else:  # objective not yet seen
            if line.startswith('objective'):
                objective_seen = True

Другой способ - использовать два цикла, один для обработки файла до "целевого", а другой для обработки остальных:

res = []
with open(filename) as fh:
    for line in fh:
        if line.startswith('objective'):
            break
    else:
        raise ValueError('No "objective" section in file')

    for line in fh:
        if line:
            res.append(line)
        else:
            break
3
sabik 17 Ноя 2020 в 12:55