#python #file #text
Вопрос:
У меня есть такой текстовый файл:
1156348 epsilon[998] B 1e-08
1156349 epsilon[999]B 1e-08
1156350 epsilon[1001]
B 1e-08
1156351 epsilon[1002]
B 1e-08
1156352 epsilon[1003]
B 1e-08
как вы можете видеть, последние 3 строки немного отличаются от первых 2. как я могу привести их B
к приведенной выше строке, как это:
1156348 epsilon[999] B 1e-08
1156349 epsilon[1000]B 1e-08
1156350 epsilon[1001]B 1e-08
1156351 epsilon[1002]B 1e-08
1156352 epsilon[1003]B 1e-08
Цель состоит в том, чтобы получить числа для каждой строки. Это часть более крупного файла. Я обнаружил, что все строки содержат эпсилон, а затем захватывают числа 1e-08
. но так как после индекса 1000 они находятся внутри. в следующей строке я не могу их схватить.
a1=[]
f1 = open('/Users/naghmeh/Documents/skill_trend/optimization/typex2.txt', "r")
for line in f1:
if "epsilon" in line:
a1.append(line)
f.close()
t=[float(s.split()[3]) for s in map(str.strip, a1)]
Комментарии:
1. Что вы искали и что вы нашли? Что вы пробовали и как это получилось? Каков принцип преобразования — объединить, если полей слишком мало, объединить, если строка слишком короткая, объединить, если первый маркер без пробелов-это B?
2. @tripleee Я попытался использовать цикл for после индекса 1000, но не смог написать код для исправления строк.
3. Вы можете использовать поиск и замену регулярных выражений в любой среде разработки. На языке python,
import re; d = open('file.txt').read(); d = re.sub('n.*?B','B', d); open('file.txt', 'w').write(d)
4. @tripleee пожалуйста, ознакомьтесь с правкой.
5.
f.close()
вы имеетеf1
в виду ошибку имени ; но использованиеwith open
контекстного менеджера более элегантно и надежно.
Ответ №1:
Ваша попытка выделила бы только строки с «эпсилоном» в них. Вместо этого вы хотите собрать все строки, но добавить к предыдущей строке, если «эпсилон»отсутствует.
a1 = []
with open(filename, 'r') as f1:
for line in f1:
line = line.rstrip('n')
if "epsilon" in line:
a1.append(line)
else:
a1[-1] = line
Это приклеивает строку к концу предыдущей строки ( a1[-1]
т. е. к последнему элементу a1
до сих пор), если она не содержит «эпсилон», но в противном случае копирует вашу существующую логику.
Это приведет к сбою, если первая строка не будет содержать «эпсилон», но я оставляю это на ваше усмотрение, чтобы сделать его надежным для вашего варианта использования.
Вероятно, избегайте жесткого кодирования сложных путей; найдите файл в текущем каталоге или попросите скрипт принять имя входного файла в качестве аргумента командной строки.