我应该如何修改负责遍历.txt文件以循环进入子循环的代码

问题描述 投票:0回答:1

我已经写了一些代码,逐行分析.txt文件,但是写得很糟糕。目前,我有脑筋急转弯,我的代码有问题,我的txt文件最后需要空行才能创建正确的最后一组。如果没有此行功能,则将最后一组的名称设置为与最后一组相同。

txt文件如下所示:

time in seconds
addr1,channel1
addr2,channel2
staticval1,channel3
staticval2,channel4
groupname1
addr3,channel5
staticval3,channel6
groupname2

etc


1
239.0.1.104,kanal1
233.51.52.170,kanal2
239.0.1.105,kanal3
1.0,kanal4
2.0,kanal5
grupa12
239.0.1.122,kanal6
239.0.1.116,kanal7
1.5,kanal8
4.5,kanal9
grupa123
239.0.1.119,kanal10
239.0.1.112,kanal11
4.5,KANAL112
4.0,KANAL123
1.5,KANAL134
grupa1234

并且代码是:

with open("INPUT_DATA_SIMULATION.txt", "r") as filestream:
    for line in islice(filestream, 0, 1):
        scanTime = int(line)
    for line in filestream:
        currentline = line.split(",")
        if not "grupa" in line: 
            #walk thorugh lines inbetween "groups"
            if(currentline != ["\n"]):
                for y in range(len(currentline[0])):
                    if(currentline[0][y] == "."):
                        valChecker += 1
                if(valChecker>=2):
                    MCAST_ADDRESSES.append(currentline[0])
                elif(valChecker<=1):
                    MCAST_VALUES.append(float(currentline[0]))
                valChecker = 0
                if("\n" in currentline[1]):
                    currentline[1] = currentline[1][:-1]
                    MCAST_NAMES.append(currentline[1])
                else:
                    MCAST_NAMES.append(currentline[1])
            #if blank line found break loop
            else:                
                break
        elif "grupa" in line:
            groupName = line[:-1]
            shouldAdd = True
        if(shouldAdd):
            MCAST_GRP.append(groupName)
            MCAST_GRP.append(MCAST_ADDRESSES)
            MCAST_GRP.append(MCAST_VALUES)
            MCAST_GRP.append(MCAST_NAMES)

            MCAST_GROUPS.append(MCAST_GRP)

            MCAST_GRP = []
            MCAST_ADDRESSES = [] 
            MCAST_VALUES = []
            MCAST_NAMES  = []
            shouldAdd = False

return MCAST_GROUPS, scanTime

我应该如何修改代码以输入格式为:

time in seconds
groupname1
addr1,channel1
static1,channel2
groupname2
addr2,channel3

所以组名在地址和静态值之前,而不是之后?另外修改在行尾删除“ \ n”的部分也很棒。

先谢谢您。

python loops text-files
1个回答
1
投票

根据要求创建了两个版本

  • 每个组后的get_input-handles组名
  • 每个组之前的get_rev_input-handle组名

代码遵循原始流程,但进行了一些清理

在每个组之后处理组名

from itertools import islice
import re
import pprint

def get_input(filepath):
    with open(filepath, "r") as filestream:
        MCAST_ADDRESSES = []
        MCAST_NAMES = []
        MCAST_VALUES = []
        MCAST_GRP = []
        MCAST_GROUPS = []

        # Various line patterns (capture using regex)
        mcast_pattern = re.compile(r"(^(\d{1,3}\.){3}\d{1,3}),(\w+)", re.IGNORECASE)
        number_pattern = re.compile(r"(^(^\d+\.\d+),(\w+))$", re.IGNORECASE)
        number_pattern = re.compile(r"((^\d+\.\d+),(\w+))$", re.IGNORECASE)
        group_pattern = re.compile(r"(grupa\d+)$", re.IGNORECASE)

        for line in islice(filestream, 0, 1):
            scanTime = int(line)

        for line in filestream:
            currentline = line.rstrip() # strips off ending "/n"

            search = group_pattern.search(currentline)

            if not search: 
                search = mcast_pattern.search(currentline)
                if search:
                    MCAST_ADDRESSES.append(search.group(1)) # ID
                    MCAST_NAMES.append(search.group(3))      # Name

                search = number_pattern.search(currentline)
                if search:
                    MCAST_VALUES.append(search.group(2))
                    MCAST_NAMES.append(search.group(3))         

            else:
                groupName = search.group(1)
                MCAST_GRP.append(groupName)
                MCAST_GRP.append(MCAST_ADDRESSES)
                MCAST_GRP.append(MCAST_VALUES)
                MCAST_GRP.append(MCAST_NAMES)

                MCAST_GROUPS.append(MCAST_GRP)

                MCAST_GRP = []
                MCAST_ADDRESSES = [] 
                MCAST_VALUES = []
                MCAST_NAMES  = []


    return MCAST_GROUPS, scanTime

用法

data, scanTime = get_input(r".\input_simulation\INPUT_DATA_SIMULATION.txt")

print("Scan time: {}".format(scanTime))
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(data)

输出

Scan time: 1
[   [   'grupa12',
        ['239.0.1.104', '233.51.52.170', '239.0.1.105'],
        ['1.0', '2.0'],
        ['kanal1', 'kanal2', 'kanal3', 'kanal4', 'kanal5']],
    [   'grupa123',
        ['239.0.1.122', '239.0.1.116'],
        ['1.5', '4.5'],
        ['kanal6', 'kanal7', 'kanal8', 'kanal9']],
    [   'grupa1234',
        ['239.0.1.119', '239.0.1.112'],
        ['4.5', '4.0', '1.5'],
        ['kanal10', 'kanal11', 'KANAL112', 'KANAL123', 'KANAL134']]]

在组之前处理组名

from itertools import islice
import re
import pprint

def get_rev_input(filepath):
    with open(filepath, "r") as filestream:
        MCAST_ADDRESSES = []
        MCAST_NAMES = []
        MCAST_VALUES = []
        MCAST_GRP = []
        MCAST_GROUPS = []

        # Various line patterns (capture using regex)
        mcast_pattern = re.compile(r"(^(\d{1,3}\.){3}\d{1,3}),(\w+)", re.IGNORECASE)
        number_pattern = re.compile(r"((^\d+\.\d+),(\w+))$", re.IGNORECASE)
        group_pattern = re.compile(r"(grupa\d+)$", re.IGNORECASE)

        for line in islice(filestream, 0, 1):
            scanTime = int(line)

        groupName = ""
        for line in filestream:
            currentline = line.rstrip() # strips off ending "/n"

            search = group_pattern.search(currentline)

            if not search: 
                # Not groupname
                search = mcast_pattern.search(currentline)
                if search:
                    MCAST_ADDRESSES.append(search.group(1)) # ID
                    MCAST_NAMES.append(search.group(3))      # Name

                search = number_pattern.search(currentline)
                if search:
                    MCAST_VALUES.append(search.group(2))
                    MCAST_NAMES.append(search.group(3))         

            else:
                if not groupName:
                    groupName = search.group(1)
                    continue

                MCAST_GRP.append(groupName)
                MCAST_GRP.append(MCAST_ADDRESSES)
                MCAST_GRP.append(MCAST_VALUES)
                MCAST_GRP.append(MCAST_NAMES)
                MCAST_GROUPS.append(MCAST_GRP)

                MCAST_GRP = []
                MCAST_ADDRESSES = [] 
                MCAST_VALUES = []
                MCAST_NAMES  = []

                # Update group name
                groupName = search.group(1)


        # Capture Last Group
        if groupName:
            MCAST_GRP.append(groupName)
            MCAST_GRP.append(MCAST_ADDRESSES)
            MCAST_GRP.append(MCAST_VALUES)
            MCAST_GRP.append(MCAST_NAMES)
            MCAST_GROUPS.append(MCAST_GRP)

    return MCAST_GROUPS, scanTime

用法

data, scanTime = get_rev_input(r".\input_simulation\revINPUT_DATA_SIMULATION.txt")

print("Scan time: {}".format(scanTime))
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(data)

输出

Scan time: 1
[   [   'grupa12',
        ['239.0.1.104', '233.51.52.170', '239.0.1.105'],
        ['1.0', '2.0'],
        ['kanal1', 'kanal2', 'kanal3', 'kanal4', 'kanal5']],
    [   'grupa123',
        ['239.0.1.122', '239.0.1.116'],
        ['1.5', '4.5'],
        ['kanal6', 'kanal7', 'kanal8', 'kanal9']],
    [   'grupa1234',
        ['239.0.1.119', '239.0.1.112'],
        ['4.5', '4.0', '1.5'],
        ['kanal10', 'kanal11', 'KANAL112', 'KANAL123', 'KANAL134']]]
© www.soinside.com 2019 - 2024. All rights reserved.