извлечение данных с отступом из текстового файла после определенного символа - PullRequest
0 голосов
/ 31 марта 2020

Контекст: я создал текстовый файл, с которым я могу прочитать некоторые данные об изотопах и их относительной численности. Я стремлюсь использовать этот файл для извлечения массы и численности для данного элемента.

Здесь показан фрагмент моего текстового файла:

001
H
2
  1-0.99972
  2-0.00028
002
He
2
  3-0.0
  4-1.0
003
Li
2
  6-0.078
  7-0.922
004
Be
1
  9-1.0
005
B
2
  10-0.204
  11-0.796

Для данного элемента будет отображаться масса атомов c, следующая строка - символ, следующая, х количество естественных изотопов. Следующие x строк показывают массовое содержание изотопов. Они отступают на 2 пробела. После этого показывается следующий элемент.

Я пытаюсь написать функцию, которая принимает символ и выводит два списка для массы и численности. Следующий код находится там, где я сейчас нахожусь:

def abundance_info(symbol):
    with open('/home/alletro/pytalys/talys_module/abundance', 'r') as abundance:
        prev_line:str = ''
        pro_prev_line: str = ''
        mass_list = [] 
        abundance_list = []
        for line in abundance:
            line = line.rstrip('\n')
            if pro_prev_line == symbol:
                if line[0] == ' ': 
                    print(line)
                    line.split('-')
                    mass_list.append(line[0].lstrip('\s'))
                    abundance_list.append(line[1])
                break
            else: 
                pro_prev_line = prev_line
                prev_line = line
    return mass_list, abundance_list

Я, однако, изо всех сил пытаюсь выяснить, как это закончить sh. Моя проблема возникает на втором, если заявление. Я изо всех сил пытаюсь найти способ перебрать следующие строки, которые содержат отступ.

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Разбор файла выполняется прямо:

  1. L oop поверх него, первая строка - это атомы c масса
  2. Прочитайте следующую строку, это символ
  3. Прочитайте следующую строку, это счетчик количества изотопов
  4. L oop, чтобы прочитать и проанализировать изотопы
  5. Если символ - то, что мы хотим, return
  6. Если мы исчерпали файл, это означает, что символ не найден, вернем два пустых списка
def lookup(symbol: str) -> tuple:
    with open('abundance.txt') as stream:
        for atomic_mass in stream:
            symbol_in_file = next(stream).rstrip()
            isotopes_count = int(next(stream))  # Read the next line, convert to int

            mass_list = []
            abundance_list = []
            for _ in range(isotopes_count):
                mass, abundance = next(stream).strip().split("-")
                mass_list.append(int(mass))
                abundance_list.append(float(abundance))

            if symbol_in_file == symbol:
                return mass_list, abundance_list

    # Gets here means the symbol is not found in the file
    return [], []


def main():
    for symbol in ["H", "He", "Li", "Be", "B", "Bebop"]:
        mass_list, abundance_list = lookup(symbol)
        print()
        print("Symbol:", symbol)
        print("Mass List:", mass_list)
        print("Abundance List:", abundance_list)


if __name__ == '__main__':
    main()

Вывод:

Symbol: H
Mass List: [1, 2]
Abundance List: [0.99972, 0.00028]

Symbol: He
Mass List: [3, 4]
Abundance List: [0.0, 1.0]

Symbol: Li
Mass List: [6, 7]
Abundance List: [0.078, 0.922]

Symbol: Be
Mass List: [9]
Abundance List: [1.0]

Symbol: B
Mass List: [10, 11]
Abundance List: [0.204, 0.796]

Symbol: Bebop
Mass List: []
Abundance List: []

Примечания

  • Вызов next(stream) прочитает и вернет следующую строку в файле. Мы можем смешать его с for l oop
  • Я специально добавил символ, который не найден в файле (Bebop), чтобы проверить регистр символов не найден
  • Мой код также преобразовать массу в целые числа, а численность - в плавающие точки
0 голосов
/ 31 марта 2020

Включение оператора continue позволит коду go вернуться к первому l oop и повторить со следующей строкой кода. Оператор else прерывается, когда отступ останавливается, сигнализируя об окончательном изотопе.

def abundance_info(symbol):
with open('/home/alletro/pytalys/talys_module/abundance', 'r') as abundance:
    prev_line:str = ''
    pro_prev_line: str = ''
    mass_list = [] 
    abundance_list = []
    for line in abundance:
        line = line.rstrip('\n')
        if pro_prev_line == symbol:
            if line[0] == ' ': 
                line = line.split('-')
                mass_list.append(line[0].lstrip('\s'))
                abundance_list.append(line[1])
                continue
            else: 
                break
        else: 
            pro_prev_line = prev_line
            prev_line = line
return mass_list, abundance_list
...