как раньше вывести какой-то текст в строку?

#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 до сих пор), если она не содержит «эпсилон», но в противном случае копирует вашу существующую логику.

Это приведет к сбою, если первая строка не будет содержать «эпсилон», но я оставляю это на ваше усмотрение, чтобы сделать его надежным для вашего варианта использования.

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