Как сохранить каждую строку текстового файла в список python, исключая комментарии

#python #loops #fortran #fortran90

#python #циклы #fortran #fortran90

Вопрос:

Мой профессор спросил меня, есть ли у меня время / желание этим летом выяснить, почему одна из его программ на fortran 90 не работает в версии без комментариев, но находится в версии с комментариями. Программа состоит из пары тысяч строк, поэтому я, очевидно, не буду искать ошибку вручную.

Моя идея заключается в следующем, поскольку я не опытный программист, но решил взять на себя эту задачу в качестве задания для развлечения / обучения, и одолжение профессору состояло в том, чтобы написать скрипт python для чтения каждой строки текстовых файлов и сохранения каждой строки в списке, исключая строки, которые являются комментариями (так чтоначните с ! COMMENT TEXT ) и строк, которые не содержат никакого кода (только строки)

Я скопировал и вставил исходный код fortran с комментариями и комментариями, удалив все отступы в два текстовых файла, вызываемых соответственно c.txt и unc.txt . Пока у меня есть следующее:

 listCom = []
esclam = "!"
with open("c.txt") as f:
    i=0

    for line in f:
        line = line.strip()
        if line == "":
            continue
    if line.find(esclam) == -1:
        listCom.append(line)    

for e in listCom:
    print e 
 

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

Пример исходного кода fortran 90 для версии с комментариями, вставленной в c.txt файл:

 ! When this subroutine is run at double precision, 
! a good number is 7.


use constants
implicit none

complex(kind=double), intent(inout) :: A
complex(kind=double), intent(in) :: Q
integer, intent(in):: order,case_type,choice, comp_coeff
complex(kind=double), dimension(0:MAX_),intent(out) :: D_m
integer, intent(out):: k_max 
complex(kind=double),intent(out):: norm

pi=acos(-one)

G_2=cmplx(zero,zero,double)
G_1=cmplx(zero,zero,double )

!FL=2.0D0**126
FL=D1mach(2)
 

Комментарии:

1. Помимо вопроса о программировании, я предлагаю вам взглянуть на tkdiff или тому подобное, и чтобы ваш профессор изучил систему управления версиями .

2. что вы подразумеваете под «некорректной работой».

Ответ №1:

 with open('file.txt', 'r') as f:
    f = f.read().splitlines()
lines = [x for x in f if x and not x.strip().startswith('!')]
 

lines представляет собой список, содержащий все строки кода fortran без строк комментариев или пустых строк.

 for line in lines:
    print(line)
 

будет печатать

 use constants
implicit none
complex(kind=double), intent(inout) :: A
complex(kind=double), intent(in) :: Q
integer, intent(in):: order,case_type,choice, comp_coeff
complex(kind=double), dimension(0:MAX_),intent(out) :: D_m
integer, intent(out):: k_max
complex(kind=double),intent(out):: norm
pi=acos(-one)
G_2=cmplx(zero,zero,double)
G_1=cmplx(zero,zero,double )
FL=D1mach(2)
 

для вашего примера файла.