Найдите во внешнем файле определенное c слово и сохраните следующее слово в переменной в Python - PullRequest
0 голосов
/ 27 марта 2020

У меня есть файл, строка которого похожа на эту:

"string" "playbackOptions -min 1 -max 57 -ast 1 -aet 57

Теперь я хочу найти файл, извлечь и сохранить значение после «-aet» (в данном случае 57) в переменная.

Я использую

import mmap

with open('file.txt') as f:
    s = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
    if s.find('-aet') != -1:
        print('true')

для поиска. но не может go за этим.

Ответы [ 2 ]

2 голосов
/ 31 марта 2020

Я предлагаю использовать регулярные выражения для извлечения значений:

import re

# Open the file for reading
with open("file.txt", "r") as f:
    # Loop through all the lines:
    for line in f:
        # Find an exact match
        # ".*" skips other options,
        # (?P<aet_value>\d+) makes a search group named "aet_value"
        # if you need other values from that line just add them here
        line_match = re.search(r"\"string\" \"playbackOptions .* -aet (?P<aet_value>\d+)", line)
        # No match, search next line
        if not line_match:
            continue
        # We know it's a number so it's safe to convert to int
        aet_value = int(line_match.group("aet_value"))
        # Do whatever you need
        print("Found aet_value: {}".format(aet_value)


1 голос
/ 01 апреля 2020

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

tag = "-aet"  # Define what tag we're looking for.

with open("file.txt", "r") as f:  # Read file.
    for line in f:  # Loop through every line.
        line_split = line.split()  # Split line by whitespace.

        if tag in line_split and line_split[-1] != tag:  # Check if the tag exists and that it's not the last element.
            try:
                index = line_split.index(tag) + 1  # Get the tag's index and increase by one to get its value.
                value = int(line_split[index])  # Convert string to int.
            except ValueError:
                continue  # We use try/except in case the value cannot be cast to an int. This may be omitted if the data is reliable.

            print value  # Now you have the value.

Было бы интересно провести сравнительный анализ, но обычно регулярное выражение медленнее , так что это может выполняться быстрее, особенно если файл очень большой.

...