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

Python 我应该如何修改负责在.txt文件中循环的代码以进入子循环,python,loops,text-files,Python,Loops,Text Files,我写了一些代码,逐行分析.txt文件,但是写得很糟糕。目前我有脑雾,我的代码有问题,我的txt文件需要在最后一行空白,以创建适当的最后一组。如果不使用此行函数,则会将最后一个组的名称设置为与最后一个组之前的名称相同,从而导致进一步的问题 txt文件如下所示: time in seconds addr1,channel1 addr2,channel2 staticval1,channel3 staticval2,channel4 groupname1 addr3,channel5 staticva

我写了一些代码,逐行分析.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
所以组名在addreses和static值之前,而不是后面?另外,修改负责删除行末尾“\n”的部分也很好


提前感谢。

根据要求创建了两个版本

  • 在每个组之后获取\u输入句柄groupname
  • 在每个组之前获取\u rev\u输入句柄groupname
代码遵循原始流程,但进行了一些清理

在每个组后面处理groupname

用法

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

print("Scan time: {}".format(scanTime))
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(data)
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)
输出

在组之前处理groupname

用法

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

print("Scan time: {}".format(scanTime))
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(data)
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)
输出


非常感谢你!这是很大的努力!Darryl,你能检查一下我朋友的问题吗?
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']]]