简体   繁体   中英

How to extract a specific line out of a text file

I have the code from the attached picture in a.can-file, which is in this case a text file. The task is to open the file and extract the content of the void function. In this case it would be "$LIN::Kl_15 = 1;" 在此处输入图像描述

This is what I already got:

Masterfunktionsliste = open("C:/.../Masterfunktionsliste_Beispiel.can", "r")
Funktionen = []
Funktionen = Masterfunktionsliste.read() 
Funktionen = Funktionen.split('\n')
print(Funktionen)

I receive the following list:

['', '', 'void KL15 ein', '{', '\t$LIN::Kl_15 = 1;', '}', '', 'void Motor ein', '{', '\t$LIN::Motor = 1;', '}', '', '']

And now i want to extract the $LIN::Kl_15 = 1; and the $LIN::Motor = 1; line into variables.

Use the { and } lines to decide what lines to extract:

scope_depth = 0
line_stack = list(reversed(Funktionen))
body_lines = []

while len(line_stack) > 0:
    next = line_stack.pop()
    if next == '{':
        scope_depth = scope_depth + 1
    elif next == '}':
        scope_depth = scope_depth - 1
    else:
        # test that we're inside at lest one level of {...} nesting
        if scope_depth > 0:
            body_lines.append(next)

body_lines should now have values ['$LIN::Kl_15 = 1;', '$LIN::Motor = 1;']

You can loop through the list, search for your variables and save it as dict:

can_file_content = ['', '', 'void KL15 ein', '{', '\t$LIN::Kl_15 = 1;', '}', '', 'void Motor ein', '{', '\t$LIN::Motor = 1;', '}', '', '']
extracted = {}

for line in can_file_content:
    if "$LIN" in line:  # extract the relevant line
        parsed_line = line.replace(";", "").replace("\t", "")  # remove ";" and "\t"
        variable, value = parsed_line.split("=")  # split on "="
        extracted[variable.strip()] = value.strip()  # remove whitespaces

output is {'$LIN::Kl_15': '1', '$LIN::Motor': '1'}
now you can access your new variables with extracted['$LIN::Motor'] which is 1

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM