У меня есть текстовый файл, который выглядит так:
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")
Но получить доступ к строкам ниже, пока вы не найдете пустую строку, кажется сложной задачей.
Не могли бы вы помочь мне с этим?
Большое спасибо.
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']
Один из способов сделать это - установить флажок, указывающий, было ли замечено слово «объективный».
Что-то вроде этого:
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
Похожие вопросы
Новые вопросы
python
Python — это мультипарадигмальный многоцелевой язык программирования с динамической типизацией. Он предназначен для быстрого изучения, понимания и использования, а также обеспечивает чистый и унифицированный синтаксис. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Если у вас есть вопросы о версии Python, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas, NumPy) укажите это в тегах.